通过扫描指定的要扫描的目录,把所有文件找出来,分别md5 连接字符串,最后再md5返回

启动定时器,扫描,当前的加密值和以前一样不管,否则就重启服务,把当前赋值给旧值 。

httpServer.php

<?php

namespace Wang\Core\Server;

use Wang\Core\Bean\BeanFactory;
use Wang\Core\Route\Annotation\Mapping\RequestMapping;
use Wang\Core\Route\Annotation\Parser\RequestMappingParser;
use Wang\Core\Route\Route; class HttpServer
{ public $server; public function run()
{
$config = BeanFactory::make("config")->get("http-server");
$this->server = new \Swoole\Http\Server($config['host'], $config['port']);
$this->server->set($config['setting']);
$this->server->on("request", [$this, 'httpRequest']);
$this->server->on("workerstart", [$this, "workerStart"]);
$this->server->on("start", [$this, "start"]); $this->server->start();
} public function start($server)
{
echo "main worker 启动" . PHP_EOL;
$dirs = BeanFactory::make("config")->get('reload_dirs');
$reload = bean("reload");
\Swoole\Timer::Tick(3000, function () use ($reload, $dirs) {
//echo "定时器" . PHP_EOL;
$newMd5 = $reload->md5Dirs($dirs);
if ($reload->needReload($newMd5)) {
$this->server->reload();
}
});
} /**
* onworker start 回调
* @param $server
* @param $workerId
* author: brady
* date: 2020/7/23 16:03
*/
public function workerStart($server, $workerId)
{
echo "worker " . $workerId . " 启动" . PHP_EOL;
$this->loadAnnotations();
} /**
* http 请求接受
* @param $request
* @param $response
* author: brady
* date: 2020/7/23 16:03
*/
public function httpRequest($request, $response)
{
if ($request->server['request_uri'] != "/favicon.ico") {
echo "client connect fd:" . $request->fd . PHP_EOL;
$path_info = $request->server['path_info'];
$method = $request->server['request_method']; $content = Route::dispatch($method, $path_info); $response->header("Content-Type", "text/html; charset=utf-8");
$response->end($content);
} } /**
* 获取 apppath的路由 下面所有文件,得到注解路由 放到路由属性$routes 对象里面
*/
public function loadAnnotations()
{
get_files_by_tree(APP_PATH, $dirs, $filter = "controller");
if (!empty($dirs)) {
foreach ($dirs as $file) {
// 根据绝对路径文件名 获取带命名空间的类
$className = getClassNameByFilePath($file);
$obj = new $className;
$reflect = new \ReflectionObject($obj);
$methods = $reflect->getMethods();
if (!empty($methods)) {
foreach ($methods as $method) {
if ($method->getName() != '__construct') {
// 注解对象 设置注解路由相关信息
$annotation = new RequestMapping($reflect, $method); // 解析 将上一步收集到的信息组装后添加到路由数组里面 $routes
(new RequestMappingParser())->parse($annotation);
}
}
}
}
}
}
}

  

reload.php

<?php

namespace Wang\Core\Reload;

use Wang\Core\Bean\BeanFactory;

class Reload
{ protected $oldMd5 = ''; public function __construct()
{
$dirs = BeanFactory::make("config")->get('reload_dirs');
$this->oldMd5 = $this->md5Dirs($dirs);
} /**
* 是否需要重启
* author: brady
* date: 2020/7/23 16:42
*/
public function needReload($newMd5)
{
if($newMd5 != $this->oldMd5){
$this->oldMd5 = $newMd5;
return true;
} else {
return false;
}
} /**
* 对传入的目录所有文件进行递归加密
* @param array $dirs
* author: brady
* date: 2020/7/23 16:42
*/
public function md5Dirs($dirs)
{
$files = [];
foreach($dirs as $dir){
$files += get_files_by_tree($dir);
} $md5File = '';
foreach($files as $file){
$md5File .= md5_file($file);
} return md5($md5File);
} }

  

每当代码改动 会重启服务

[2020-07-24 10:29:46 $2346.0]	INFO	Server is reloading all workers now
worker 0 启动
client connect fd:1
client connect fd:1
[2020-07-24 10:30:43 $2346.0] INFO Server is reloading all workers now
worker 0 启动
[2020-07-24 10:31:43 $2346.0] INFO Server is reloading all workers now
worker 0 启动

  

代码完整地址

https://github.com/brady-wang/WangFrm.git

swoole热启动的更多相关文章

  1. 在Laravel中使用swoole来取代nginx作为http服务器

    1.是什么限制Laravel框架的速度? Laravel框架启动的时候需要加载很多文件,再加上其出了名的生态环境好,所以在开发过程中我们就会发现有非常多的已经造好的轮子,这也就使得Laravel的一次 ...

  2. swoole扩展安装

    1Swoole扩展的编译安装 Swoole扩展是按照php标准扩展构建的.使用phpize来生成php编译配置,./configure来做编译配置检测,make和make install来完成安装. ...

  3. 使用Swoole加速Laravel(正式环境中)

    1 Laravel的速度瓶颈在哪? 1.1 已有的一些优化方法 1.1.1 laravel官方提供了一些优化laravel的优化方法 php artisan optimize php artisan ...

  4. swoole运行模式加速laravel应用的详细介绍

    本篇文章给大家带来的内容是关于swoole运行模式加速laravel应用的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.Swoole Swoole号称重新定义了PHP, ...

  5. 编译安装PHP7并安装Redis扩展Swoole扩展

    编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...

  6. 使用php+swoole对client数据实时更新(下)

    上一篇提到了swoole的基本使用,现在通过几行基本的语句来实现比较复杂的逻辑操作: 先说一下业务场景.我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终 ...

  7. 使用php+swoole对client数据实时更新(上)

    如果想对一个列表做实时的更新,传统的做法是采用轮询的方式.以web为例,通过Ajax定时请求服务端然后获取数据显示在页面.这种方式实现简单,缺点就是浪费资源. HTTP1.1新增加了对websocke ...

  8. [Linux][PHP]安装swoole扩展

    1.下载swoole 2.解压并配置 /usr/local/php/bin/phpize ./configure --enable-swoole-debug --enable-sockets --en ...

  9. 被swoole坑哭的PHP程序员

    被swoole坑哭的PHP程序员 2015-09-16 09:57 文帅营 博客园 字号:T | T 首先说一下对swoole的理解:披着PHP外衣的C程序.很多PHPer朋友看到swoole提供的强 ...

随机推荐

  1. Git 沙盒模拟实战(基础篇)

    Git 沙盒模拟实战 分支 现有一个主分支 创建分支 # 创建分支 $ git branch bugFix # 切换到指定分支 $ git checkout bugFix 或者 # 创建分支,并切换到 ...

  2. python的logging模块及应用

    一.logging日志模块等级 常见log级别从高到低: CRITICAL >ERROR >WARNING >INFO >DEBUG,默认等级为WARNING,即>=WA ...

  3. python之cookie与session

    cookie概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器 ...

  4. 《方法总结》C路的方法发现

    C语言方法荟萃 定义一个最大值和最小值:#define max(x,y)  ( x>y?x:y ) #define min(x,y)  ( x<y?x:y ) &&: 说得 ...

  5. 安装Linux的CentOS操作系统 - 初学者系列 - 学习者系列文章

    Linux系统对于一些熟悉Windows操作系统的用户来说可能比较陌生,但是它也是一种多用户.多任务的操作系统,现在也发展成为了多种版本的操作系统了.如果想对该系统进行学习,请下载这个学习文档:htt ...

  6. nginx如何写日志

    写日志函数为ngx_log_error_core,位于src/core/ngx_log.c:89行核心代码如下:while (log) { if (log->log_level < lev ...

  7. zookeeper(2) 文件系统

    这一节我们主要来看一下zookeeper文件系统的实现. 树结构 为了提高对指定节点的操作,zookeeper使用一个HashMap来存储树结构数据,key为数据路径,value为节点数据. 树节点( ...

  8. git线上操作

    选择线上仓库 """ 1.注册码云账号并登录:https://gitee.com/ 2.创建仓库(课堂截图) 3.本地与服务器仓库建立连接 ""&qu ...

  9. 空间向量变换,以及OpenGL的glm库简单应用

    测试项目请查看GitHub库 GLBIproject2/GLBIProject2_2

  10. brew清华镜像

    https://mirror.tuna.tsinghua.edu.cn/help/homebrew/