通过扫描指定的要扫描的目录,把所有文件找出来,分别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. Jenkins下Vue自动部署(一)

    1,服务器上安装docker http://www.runoob.com/docker/ubuntu-docker-install.html?tdsourcetag=s_pctim_aiomsg 2, ...

  2. 送命题:讲一讲Mybatis插件的原理及如何实现?

    持续原创输出,点击上方蓝字关注我吧 目录 前言 环境配置 什么是插件? 如何自定义插件? 举个栗子 用到哪些注解? 如何注入Mybatis? 测试 插件原理分析 如何生成代理对象? 如何执行? 总结 ...

  3. JavaScript闭包函数的理解

    闭包就是一个函数能够访问其函数外部作用域中的变量,即在外面可以调用函数中的函数的变量,其实他就是将函数内外部连接起来的桥梁 闭包三大特点: 1. 函数嵌套函数 2. 内部函数可以访问外部函数的变量 3 ...

  4. GitHub常用上传文件的两种方法 附带常见的问题及Git安装教程

    从早上下课到现在一直在琢磨如何给Github下载本地文件,中午饭都没吃.还好是解决了,感觉挺有成就感的.O(∩_∩)O哈哈~ 好哒 闲话不说,说重点. 一.git的安装 百度云:http://pan. ...

  5. C# 中 Struct 和 Class 的区别总结

    翻译自 Manju lata Yadav 2019年6月2日 的博文 <Difference Between Struct And Class In C#>,补充了一些内容和示例. 结构体 ...

  6. Kubernetes入门(四)——如何在Kubernetes中部署一个可对外服务的Tensorflow机器学习模型

    机器学习模型常用Docker部署,而如何对Docker部署的模型进行管理呢?工业界的解决方案是使用Kubernetes来管理.编排容器.Kubernetes的理论知识不是本文讨论的重点,这里不再赘述, ...

  7. Python爬虫和函数调试

    一:函数调试 用之前学过的try···except进行调试 def gameover(setA,setB): if setA==3 or setB==3: return True else: retu ...

  8. QQDIV失效补救

    {"styleId":22,"bgId":3807,"cardId":3807,"renderInfo":{" ...

  9. 实现队列的基本操作(数据结构)-python版

    class Queue: def __init__(self): self.entries = [] self.length = 0 self.front = 0 def put(self, item ...

  10. MyBatis学习(四)代码生成器MyBatis-Generator

    一.简介 前面写过一篇文章介绍了如何使用Mybatis,那么如果我门数据库中有许许多多的表的时候,每张表都手动去写对应的mapper的映射关系,会非常麻烦,那么我们可以使用代码生成器MyBatis-G ...