hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - PHP教程 - 正文 请牢记本站网址www.sosophp.cn

Swoole自定义项目初始化事宜处置惩罚的完成【php教程】

2019-12-01PHP教程搜搜PHP网52°c
A+ A-
近来运用基于 Swoole 开辟的 imi 框架开辟项目,遇到一个需求,就是想要做项目初始化处置惩罚。当初始化处置惩罚完成前,不想让 Swoole 处置惩罚要求。由于能够有一些值没有加载进来,处置惩罚要求极有能够出现题目。

下面给出了思索历程及处理题目的demo代码。

起首剖析了一下,Swoole 是多历程形式运转的,分为 MasterManagerWorker 历程。

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网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
Swoole自定义项目初始化事宜处置惩罚的完成【php教程】

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签: