通过扫描指定的要扫描的目录,把所有文件找出来,分别md5 连接字符串,最后再md5返回
启动定时器,扫描,当前的加密值和以前一样不管,否则就重启服务,把当前赋值给旧值 。
httpServer.php
<?php namespace WangCoreServer; use WangCoreBeanBeanFactory; use WangCoreRouteAnnotationMappingRequestMapping; use WangCoreRouteAnnotationParserRequestMappingParser; use WangCoreRouteRoute; class HttpServer { public $server; public function run() { $config = BeanFactory::make("config")->get("http-server"); $this->server = new SwooleHttpServer($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"); SwooleTimer::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 WangCoreReload; use WangCoreBeanBeanFactory; 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