file_get_contents($initFlagFile) != $server->manager_pid))
{
// 处理项目初始化事件
initApp();
// 写入文件,保证不再重复触发项目初始化事件
file_put_contents($initFlagFile, $server->manager_pid);
// 当前worker进程恢复协程
resumeCos();
// 通知其它worker进程
for($i = 1; $i < $server->setting['worker_num']; ++$i)
{
$server->sendMessage('init', $i);
}
}
});
$http->on('PipeMessage', function(swoole_http_server $server, $srcWorkerId, $data) {
if(0 === $srcWorkerId && 'init' === $data && !defined('APP_INITED'))
{
// 其它worker进程恢复协程
resumeCos();
}
});
$http->on('request', function (swoole_http_request $request, swoole_http_response $response) {
// 判断未初始化完毕,则挂起协程
if(!defined('APP_INITED'))
{
$GLOBALS['WORKER_START_END_RESUME_COIDS'][] = Coroutine::getuid();
Coroutine::suspend();
}
$response->header('content-type', 'text/html;charset=utf-8');
$response->end('IMI 是一款基于 Swoole 开发的协程 PHP 开发框架,拥有常驻内存、协程异步非阻塞IO等优点。官方网站:<a href="https://imiphp.com" target="_blank">https://imiphp.com</a>');
});
$http->start();
/**
* 处理项目初始化事件,比如这里延时5秒,模拟初始化处理
*
* @return void
*/
function initApp()
{
$count = 5;
for($i = 0; $i < $count; ++$i)
{
echo 'initing ', ($i + 1), '/', $count, PHP_EOL;
sleep(1);
}
}
/**
* 恢复协程
*
* @return void
*/
function resumeCos()
{
define('APP_INITED', true);
$coids = $GLOBALS['WORKER_START_END_RESUME_COIDS'] ?? [];
fwrite(STDOUT, 'suspend co count: ' . count($coids) . PHP_EOL);
foreach($coids as $id)
{
Coroutine::resume($id);
}
}
通过在 request 事件中判断是否初始化完毕,如果没有初始化完成,则挂起当前协程,将协程ID加入全局变量。
当第0个 worker 进程执行完初始化后,通过向其他 worker 进程发送消息,唤醒曾经挂起的协程们,在初始化期间进来的请求,这时候会被执行。
相关推荐:
详解javascript实现自定义事件_javascript技巧
Angularjs自定义指令在项目中如何使用
以上就是Swoole自定义项目初始化事件处理如何实现(代码)的详细内容,更多请关注php中文网其它相关文章!
网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。
关键词:Swoole自定义项目初始化事件处理如何完成(代码)