视频地址 https://www.bilibili.com/video/BV14E411t7T4?p=26&spm_id_from=pageDriver&vd_source=4a69745b599dffec877b0fcfe130b092

1 拆解index.php 封装 \pro\core\server\HttpServer.php
启动进程
/**
*
* 此事件在worker进程、task进程启动时发生。这里创建的对象可以在进程生命周期内使用
* @param \Swoole\Http\Server $server
* @param int $workerId
*/
public function onWorkerStart(Server $server,int $workerId)
{
cli_set_process_title("ttt worker"); //设置进程名称
//把index文件里的代码搬过来
\Core\BeanFactory::init();
$this->dispatcher = \Core\BeanFactory::getBean('RouterCollector')->getDispatcher();
}
收到请求
public function onRequset(Request $request,Response $response)
{
//匹配当前的url
//$routeInfo = $dispatcher->dispatch($request->server['request_method'],$request->server['request_uri']);
$myRequest = \Core\http\Request::init($request);
$myResponse = \Core\http\Response::init($response);
$routeInfo = $this->dispatcher->dispatch($myRequest->getMethod(),$myRequest->getUri());
//$routeInfo返回一个数组,[表示是否注册过的路由,handle,参数]
switch ($routeInfo[0]) {
//有没有这个路由
case \FastRoute\Dispatcher::NOT_FOUND:
// ... 404 Not Found 结束响应
$response->status(404);
$response->end();
break;
//请求方式
case \FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
//$allowedMethods = $routeInfo[1];
// ... 405 Method Not Allowed
$response->status(405);
$response->end();
break;
case \FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];//参数
//var_dump($vars);
/* array(1) {
["uid"]=>
string(3) "123"
}*/
// ... call $handler with $vars
$extVars = [$myRequest,$myResponse];
// $vars 路由上带的参数
// $extVars 附加参数 传入 Request 、Response对象等
//$response->end($handler($vars,$extVars)); //最终执行的目标方法
$ret = $handler($vars,$extVars);
$myResponse->setBody($ret);
$myResponse->end();
break;
}
//$response->end(showMe());
}
2 封装文件监控助手
2.1 \pro\core\helper\FileHelper.php
<?php
namespace Core\helper;
class FileHelper
{
/**
* 获取文件监控变化
* @param $dir 要扫描的目录
* @param $ignore 忽略的目录 h
*
* @return string
*/
public static function getFileMd5($dir,$ignore)
{
$files = glob($dir);
$ret = [];
foreach ($files as $file){
if (is_dir($file) && strpos($file,$ignore)===false){
//如果是文件夹,则递归,注意要加上/*,否则获取不到内容
$ret[] = self::getFileMd5($file."/*",$ignore);
}elseif (pathinfo($file)["extension"]=="php"){
$ret[] = md5_file($file);
}
}
return md5(implode('',$ret));//返回文件md5值
}
}
完整代码
https://github.com/guainttt/seckill/commit/9196f3e92e971fb59e0c6efff307ca231eeac454#diff-f21c5ae47e384104e8a93a73378363fdd4ee21e8a97253f6ec835329fa2b2bb7