下面给出了思索历程及处理题目的demo代码。
起首剖析了一下,Swoole 是多历程形式运转的,分为 Master
、Manager
、Worker
历程。
Master 历程就是我们启动效劳的 cli 敕令文件地点历程,在这内里初始化有一个题目,这里一切加载的类、全局变量,别的 Worker 历程里都能够运用,没法热重启见效。
Manager 历程的状况基础和上面差不多。
那末只要在 Worker 历程做处置惩罚了,但假如写在 WorkerStart 事宜里,每一个 Worker 历程都会去实行。
WorkerStart
事宜定义:
function onWorkerStart(swoole_server $server, int $worker_id);
$worker_id是一个从0-$worker_num之间的数字,示意这个Worker历程的ID
那这个就好办了,直接推断workerid为0的去触发项目初始化事宜。剩下另有一个题目就是,如安在初始化实行完成前,让一切 Worker 历程临时都不处置惩罚要求。
思索并尝试了一下,这个题目能够经由过程协程挂起来处理,demo 代码以下:
<?php use Swoole\Coroutine; $http = new swoole_http_server('127.0.0.1', 8080); $http->on('WorkerStart', function(swoole_http_server $server, $workerId){ $initFlagFile = __DIR__ . '/init.flag'; if(0 === $server->worker_id && (!is_file($initFlagFile) || 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 历程发送音讯,叫醒曾挂起的协程们,在初始化时期进来的要求,这时候会被实行。
以上就是Swoole自定义项目初始化事宜处置惩罚的完成的细致内容,更多请关注ki4网别的相干文章!