通过扫描指定的要扫描的目录,把所有文件找出来,分别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