swoole热启动
通过扫描指定的要扫描的目录,把所有文件找出来,分别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热启动的更多相关文章
- 在Laravel中使用swoole来取代nginx作为http服务器
1.是什么限制Laravel框架的速度? Laravel框架启动的时候需要加载很多文件,再加上其出了名的生态环境好,所以在开发过程中我们就会发现有非常多的已经造好的轮子,这也就使得Laravel的一次 ...
- swoole扩展安装
1Swoole扩展的编译安装 Swoole扩展是按照php标准扩展构建的.使用phpize来生成php编译配置,./configure来做编译配置检测,make和make install来完成安装. ...
- 使用Swoole加速Laravel(正式环境中)
1 Laravel的速度瓶颈在哪? 1.1 已有的一些优化方法 1.1.1 laravel官方提供了一些优化laravel的优化方法 php artisan optimize php artisan ...
- swoole运行模式加速laravel应用的详细介绍
本篇文章给大家带来的内容是关于swoole运行模式加速laravel应用的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.Swoole Swoole号称重新定义了PHP, ...
- 编译安装PHP7并安装Redis扩展Swoole扩展
编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...
- 使用php+swoole对client数据实时更新(下)
上一篇提到了swoole的基本使用,现在通过几行基本的语句来实现比较复杂的逻辑操作: 先说一下业务场景.我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终 ...
- 使用php+swoole对client数据实时更新(上)
如果想对一个列表做实时的更新,传统的做法是采用轮询的方式.以web为例,通过Ajax定时请求服务端然后获取数据显示在页面.这种方式实现简单,缺点就是浪费资源. HTTP1.1新增加了对websocke ...
- [Linux][PHP]安装swoole扩展
1.下载swoole 2.解压并配置 /usr/local/php/bin/phpize ./configure --enable-swoole-debug --enable-sockets --en ...
- 被swoole坑哭的PHP程序员
被swoole坑哭的PHP程序员 2015-09-16 09:57 文帅营 博客园 字号:T | T 首先说一下对swoole的理解:披着PHP外衣的C程序.很多PHPer朋友看到swoole提供的强 ...
随机推荐
- 2020年 .NET ORM 完整比较、助力选择
.NET ORM 前言 为什么要写这篇文章? 希望针对 SEO 优化搜索引擎,让更多中国人知道并且使用.目前百度搜索 .NET ORM 全是 sqlsugar,我个人是无语的,每每一个人进群第一件事就 ...
- [LeetCode]364. 加权嵌套序列和 II (DFS)
题目 给一个嵌套整数序列,请你返回每个数字在序列中的加权和,它们的权重由它们的深度决定. 序列中的每一个元素要么是一个整数,要么是一个序列(这个序列中的每个元素也同样是整数或序列). 与 前一个问题 ...
- matlab数字图像处理-给图片加入可视水印信息
将文件夹路径改成了我想要存放代码的文件夹下 然后也是在网上百度,找到了一个代码,敲着模仿了一个 自己建立了一个脚本文件 >>edit test1 然后在脚本中添加 %读取待嵌入水印的图像和 ...
- 4.Kafka使用
- Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)
1.简介 在性能测试中为了真实模拟用户请求,往往我们需要让提交的表单内容每次都发生变化,这个过程叫做参数化.JMeter配置元件与前置处理器都能帮助我们进行参数化,但是都有局限性,为了帮助我们能够更好 ...
- Java基础一篇过(七)Java8--stream流
一.简介 流(stream)也是Java8的一个重要的新特性,主要是对集合(Collector)功能的增强:在上一篇文章我们简单的了解了lambda表达式,现在我们学习下流的概念:使用流可以帮助我们做 ...
- 常用JVM 启动参数解析
https://www.jianshu.com/p/a17dcef57559 https://www.cnblogs.com/zkyefei/p/9334562.html
- 实用向—总结一些唯一ID生成方式
在日常的项目开发中,我们经常会遇到需要生成唯一ID的业务场景,不同的业务对唯一ID的生成方式与要求都会不尽相同,一是生成方式多种多样,如UUID.雪花算法.数据库递增等:其次业务要求上也各有不同,有的 ...
- 基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中。
react-amap 这是一个基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中. 文档实例预览: Github Web | Gitee Web 特性 ️ 自动加载高德地 ...
- 一加云耳2和一加云耳z区别
[解码方式]:云耳Z采用的音源解码方式是AAC,云耳2使用的是APTX: [发声单元]:云耳Z采用的是动圈,云耳2采用的是动圈+动铁组合 [颜色]:云耳Z有4款颜色(宝蓝.薄荷绿.黑色.米白)云耳2有 ...