亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频

自定義進(jìn)程

PHP自帶的pcntl存在許多不足,不支持重定向標(biāo)準(zhǔn)輸入和輸出及進(jìn)程間通信的功能,且容易使用錯(cuò)誤。
EasySwoole基于SwooleProcess模塊進(jìn)行了封裝,來(lái)創(chuàng)建工作進(jìn)程,用于處理耗時(shí)任務(wù),消息隊(duì)列,等其它的特殊任務(wù)。
EasySwoole啟動(dòng)時(shí),會(huì)自動(dòng)創(chuàng)建注冊(cè)的進(jìn)程,并執(zhí)行進(jìn)程指定的邏輯代碼,進(jìn)程意外退出時(shí),會(huì)被重新拉起。

創(chuàng)建一個(gè)自定義進(jìn)程

需要定義一個(gè)進(jìn)程類繼承EasySwoole\Component\Process\AbstractProcess

定義進(jìn)程內(nèi)執(zhí)行邏輯回調(diào)

protected function run($arg)
{
    // TODO: Implement run() method.
    $this->getProcessName(); // 獲取注冊(cè)進(jìn)程名稱

    $this->getProcess(); // 獲取進(jìn)程實(shí)例 \Swoole\Process

    $this->getPid(); // 獲取當(dāng)前進(jìn)程Pid

    $this->getArg(); // 獲取注冊(cè)時(shí)傳遞的參數(shù)
}

進(jìn)程間通信Pipe回調(diào)

protected function onPipeReadable(Process $process)
{
    // 該回調(diào)可選
    // 當(dāng)主進(jìn)程對(duì)子進(jìn)程發(fā)送消息的時(shí)候 會(huì)觸發(fā)
    $process->read(); // 讀取消息
}

進(jìn)程間異常回調(diào)

protected function onException(\Throwable $throwable, ...$args)
{
    // 該回調(diào)可選
    // 捕獲run方法內(nèi)拋出的異常
    // 這里可以通過記錄異常信息來(lái)幫助更加方便的知道出現(xiàn)問題的代碼
}

進(jìn)程信號(hào)回調(diào)

protected function onSigTerm()
{
    // 當(dāng)進(jìn)程接收到 SIGTERM 信號(hào)觸發(fā)該回調(diào)
}

進(jìn)程意外退出回調(diào)

protected function onShutDown()
{
    // 該回調(diào)可選
    // 進(jìn)程意外退出 觸發(fā)此回調(diào)
    // 大部分用于清理工作
}

注冊(cè)進(jìn)程

EasySwoole 全局的 mainServerCreate 事件中進(jìn)行進(jìn)程注冊(cè)

$processConfig = new \EasySwoole\Component\Process\Config([
    'processName' => 'CustomProcess', // 設(shè)置 自定義進(jìn)程名稱
    'processGroup' => 'Custom', // 設(shè)置 自定義進(jìn)程組名稱
    'arg' => [
        'arg1' => 'this is arg1!'
    ], // 【可選參數(shù)】設(shè)置 注冊(cè)進(jìn)程時(shí)要傳遞給自定義進(jìn)程的參數(shù),可在自定義進(jìn)程中通過 $this->getArg() 進(jìn)行獲取
    'enableCoroutine' => true, // 設(shè)置 自定義進(jìn)程自動(dòng)開啟協(xié)程
]);

\EasySwoole\Component\Process\Manager::getInstance()->addProcess(new CustomProcess($processConfig));

推薦使用 \EasySwoole\Component\Process\Manager 類進(jìn)行注冊(cè)自定義進(jìn)程,注冊(cè)方式示例代碼如上所示。如果您的框架版本過低,不支持 \EasySwoole\Component\Process\Manager 類,可使用如下方式進(jìn)行注冊(cè)自定義進(jìn)程: \EasySwoole\EasySwoole\ServerManager::getInstance()->getSwooleServer()->addProcess((new TickProcessnew CustomProcess($processConfig));

注意:用戶在注冊(cè)多個(gè)相同配置的自定義進(jìn)程時(shí),請(qǐng)一定不要復(fù)用實(shí)例化后的進(jìn)程對(duì)象,而應(yīng)該重新實(shí)例化一個(gè)新的進(jìn)程對(duì)象。如果復(fù)用了將導(dǎo)致不可預(yù)知的結(jié)果。正確注冊(cè)和錯(cuò)誤注冊(cè)的參考示例代碼如下:

錯(cuò)誤的注冊(cè)示例:

EasySwooleEvent.php

<?php

namespace EasySwoole\EasySwoole;

use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        $processConfig = new \EasySwoole\Component\Process\Config([
            'processName' => 'TestProcess', // 設(shè)置 進(jìn)程名稱為 TickProcess
        ]);

        // 【推薦】使用 \EasySwoole\Component\Process\Manager 類注冊(cè)自定義進(jìn)程
        $testProcess = new \App\Process\TestProcess($processConfig);

        ### !!! 錯(cuò)誤原因:把上述實(shí)例化得到的自定義進(jìn)程對(duì)象 $testProcess 進(jìn)行了復(fù)用,注冊(cè)了 2 次,將導(dǎo)致未知錯(cuò)誤。
        // 注冊(cè)進(jìn)程
        \EasySwoole\Component\Process\Manager::getInstance()->addProcess($testProcess);
        \EasySwoole\Component\Process\Manager::getInstance()->addProcess($testProcess);
    }
}

正確的注冊(cè)示例:

EasySwooleEvent.php

<?php

namespace EasySwoole\EasySwoole;

use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        $processConfig = new \EasySwoole\Component\Process\Config([
            'processName' => 'TestProcess', // 設(shè)置 進(jìn)程名稱為 TickProcess
        ]);

        // 【推薦】使用 \EasySwoole\Component\Process\Manager 類注冊(cè)自定義進(jìn)程
        $testProcess1 = new \App\Process\TestProcess($processConfig);
        $testProcess2 = new \App\Process\TestProcess($processConfig);

        ### 正確的注冊(cè)進(jìn)程的示例:重新使用 new 實(shí)例化另外 1 個(gè)新的自定義進(jìn)程對(duì)象,然后進(jìn)行注冊(cè)
        // 注冊(cè)進(jìn)程
        \EasySwoole\Component\Process\Manager::getInstance()->addProcess($testProcess1);
        \EasySwoole\Component\Process\Manager::getInstance()->addProcess($testProcess2);
    }
}

上文的 \App\Process\TestProcess 和下文的 \App\Process\CustomProcess 類的代碼類似,這里不做重復(fù)說明。

完整示例代碼

1. 定義自定義進(jìn)程類示例

首先,我們定義一個(gè)自定義進(jìn)程類繼承 \EasySwoole\Component\Process\AbstractProcess 類,示例代碼如下:

<?php
namespace App\Process;

use EasySwoole\Component\Process\AbstractProcess;
use Swoole\Process;

class CustomProcess extends AbstractProcess
{
    protected function run($arg)
    {
        // TODO: Implement run() method.
        $processName = $this->getProcessName(); // 獲取 注冊(cè)進(jìn)程名稱
        $swooleProcess = $this->getProcess(); // 獲取 注冊(cè)進(jìn)程的實(shí)例 \Swoole\Process
        $processPid = $this->getPid(); // 獲取 當(dāng)前進(jìn)程 Pid
        $args = $this->getArg(); // 獲取 注冊(cè)進(jìn)程時(shí)傳遞的參數(shù)

        var_dump('### 開始運(yùn)行自定義進(jìn)程 start ###');
        var_dump($processName, $swooleProcess, $processPid, $args);
        var_dump('### 運(yùn)行自定義進(jìn)程結(jié)束 end ###');
    }

    protected function onPipeReadable(Process $process)
    {
        // 該回調(diào)可選
        // 當(dāng)主進(jìn)程對(duì)子進(jìn)程發(fā)送消息的時(shí)候 會(huì)觸發(fā)
        $recvMsgFromMain = $process->read(); // 用于獲取主進(jìn)程給當(dāng)前進(jìn)程發(fā)送的消息
        var_dump('收到主進(jìn)程發(fā)送的消息: ');
        var_dump($recvMsgFromMain);
    }

    protected function onException(\Throwable $throwable, ...$args)
    {
        // 該回調(diào)可選
        // 捕獲 run 方法內(nèi)拋出的異常
        // 這里可以通過記錄異常信息來(lái)幫助更加方便地知道出現(xiàn)問題的代碼
    }

    protected function onShutDown()
    {
        // 該回調(diào)可選
        // 進(jìn)程意外退出 觸發(fā)此回調(diào)
        // 大部分用于清理工作
    }

    protected function onSigTerm()
    {
        // 當(dāng)進(jìn)程接收到 SIGTERM 信號(hào)觸發(fā)該回調(diào)
    }
}

2. 注冊(cè)進(jìn)程示例

然后在 mainServerCreate 事件中進(jìn)行注冊(cè)進(jìn)程,示例代碼如下:

<?php

namespace EasySwoole\EasySwoole;

use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        $processConfig = new \EasySwoole\Component\Process\Config([
            'processName' => 'CustomProcess', // 設(shè)置 進(jìn)程名稱為 TickProcess
            'processGroup' => 'Custom', // 設(shè)置 進(jìn)程組名稱為 Tick
            'arg' => [
                'arg1' => 'this is arg1!',
            ], // 傳遞參數(shù)到自定義進(jìn)程中
            'enableCoroutine' => true, // 設(shè)置 自定義進(jìn)程自動(dòng)開啟協(xié)程環(huán)境
        ]);

        // 【推薦】使用 \EasySwoole\Component\Process\Manager 類注冊(cè)自定義進(jìn)程
        $customProcess = (new \App\Process\CustomProcess($processConfig));
        // 【可選操作】把 tickProcess 的 Swoole\Process 注入到 Di 中,方便在后續(xù)控制器等業(yè)務(wù)中給自定義進(jìn)程傳輸信息(即實(shí)現(xiàn)主進(jìn)程與自定義進(jìn)程間通信)
        \EasySwoole\Component\Di::getInstance()->set('customSwooleProcess', $customProcess->getProcess());
        // 注冊(cè)進(jìn)程
        \EasySwoole\Component\Process\Manager::getInstance()->addProcess($customProcess);

        /*
        #【針對(duì)于低版本不支持 \EasySwoole\Component\Process\Manager 類】可使用 \EasySwoole\EasySwoole\ServerManager 類注冊(cè)自定義進(jìn)程
        $customProcess = (new \App\Process\CustomProcess($processConfig))->getProcess();
        // 【可選操作】把 tickProcess 的 Swoole\Process 注入到 Di 中,方便在后續(xù)控制器等業(yè)務(wù)中給自定義進(jìn)程傳輸信息(即實(shí)現(xiàn)主進(jìn)程與自定義進(jìn)程間通信)
        \EasySwoole\Component\Di::getInstance()->set('customSwooleProcess', $customProcess);
        // 注冊(cè)進(jìn)程
        \EasySwoole\EasySwoole\ServerManager::getInstance()->getSwooleServer()->addProcess($customProcess);
        */
    }
}

3. 向自定義進(jìn)程中傳遞消息

<?php

namespace App\HttpController;

use EasySwoole\Component\Di;
use EasySwoole\Http\AbstractInterface\Controller;

class Index extends Controller
{
    public function index()
    {
        // 獲取 Di 中注入的 自定義進(jìn)程
        $customProcess = Di::getInstance()->get('customSwooleProcess');
        // 向自定義進(jìn)程中傳輸信息,會(huì)觸發(fā)自定義進(jìn)程的 onPipeReadable 回調(diào)
        $customProcess->write('this is test!');
    }
}

進(jìn)程管理命令說明

EasySwoole 內(nèi)置了對(duì)于 Process 的命令行操作,方便開發(fā)者非常友好地去管理 Process

可執(zhí)行 php easyswoole.php process -h 來(lái)查看具體操作。

顯示所有進(jìn)程

php easyswoole.php process show

如果想要以 MB 形式顯示:

php easyswoole.php process show -d

殺死指定進(jìn)程(PID)

php easyswoole.php process kill --pid=PID

殺死指定進(jìn)程組(GROUP)

php easyswoole.php process kill --group=GROUP_NAME

殺死所有進(jìn)程

php easyswoole.php process killAll

強(qiáng)制殺死進(jìn)程

需要帶上 -f 參數(shù),例如:

php easyswoole.php process kill --pid=PID -f

亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频
  • <kbd id="eqi2k"><code id="eqi2k"></code></kbd><cite id="eqi2k"><tbody id="eqi2k"></tbody></cite>
    好看的日韩精品| 国产乱码精品| 久久青青草综合| 久久一区中文字幕| 国产日本精品| 亚洲国产高清一区| 欧美特黄一区| 欧美一区视频| 亚洲国产另类久久久精品极度| 国产一区免费观看| 成人动漫在线视频| 久久综合久久综合这里只有精品| 亚洲国产精品一区二区第一页| 欧美激情日韩| 欧美影院一区| 欧美国产视频在线观看| 一区二区三区国| 伊人久久大香线蕉成人综合网| 欧美人与物videos另类| 久久久久久久久一区| 精品国产一区二区三区免费| 国产美女精品久久久| 国产一区二区视频在线免费观看| yellow视频在线观看一区二区 | 视频一区二区三区在线观看| 就去色蜜桃综合| 蜜桃在线一区二区三区精品| 欧美日韩亚洲综合一区二区三区激情在线 | 乱码第一页成人| 久久综合图片| 国产精品swag| 欧美日韩大片一区二区三区| 日韩国产欧美一区| 中文字幕日韩精品久久| 欧美另类女人| 亚洲另类自拍| 鲁大师成人一区二区三区| 国产日韩欧美亚洲一区| 欧美人与物videos另类| 一区二区三区四区五区精品| 亚洲天堂男人| 96成人在线视频| 欧洲一区二区在线 | 久久综合九色综合网站| 午夜精品一区二区在线观看的 | 国产精品初高中精品久久| 久久国产精品一区二区三区四区| 欧美另类网站| 在线国产日韩| 国产精品视频免费观看| 先锋影音一区二区三区| 亚洲欧洲一区二区在线观看| 3d精品h动漫啪啪一区二区| 精品91免费| 欧美精品18| 久久午夜电影| 亚洲一区二区三区欧美| 一区二区三区四区五区精品| 好看的日韩精品| 欧美性久久久| 国产66精品久久久久999小说| 日韩精彩视频| 亚洲一区二区网站| 视频一区视频二区视频三区高| 国一区二区在线观看| 国产精品精品软件视频| 亚洲性图久久| 久久久久久99| 国产伦一区二区三区色一情| 日韩aⅴ视频一区二区三区| 国产日韩欧美一区二区三区在线观看| 国产伦视频一区二区三区| 在线观看视频日韩| 九九久久99| 国产精品伊人日日| 一区二区精品视频| 黑人另类av| 99亚洲伊人久久精品影院红桃| 欧洲亚洲一区二区| 97人人模人人爽人人少妇| 国产一区二区三区四区hd| 99伊人久久| 亚洲三级影院| 亚洲第一在线综合在线| 国产精品久久久久久免费观看| 国内视频精品| 五月天亚洲综合| 韩国精品一区二区三区六区色诱| 国产视频一区免费看| 亚洲精品一卡二卡三卡四卡| 国产精品久久久久久久久久久久午夜片 | 欧美亚洲不卡| 日韩欧美一区二区视频在线播放| www.久久久| 久久久久国产精品一区二区| 亚洲国产电影| 欧美一区视频| 亚洲精品tv久久久久久久久| 精品久久久久久一区二区里番| 亚洲欧美日韩国产一区| 亚洲美女黄色| 禁久久精品乱码| 欧美99在线视频观看| 少妇精品久久久久久久久久| 久久精品日产第一区二区三区乱码| 亚洲欧美日韩综合一区| 国产情侣一区| 一本色道88久久加勒比精品| 亚洲国产日韩美| 欧美精品九九| 国产精品chinese| 自拍视频一区二区三区| 亚洲在线播放电影| 婷婷久久青草热一区二区| 热re99久久精品国99热蜜月| 久久久99爱| 日本不卡在线播放| 日韩欧美在线电影| 日韩精品伦理第一区| 亚洲国产精品日韩| 欧美精品三级| 亚洲欧洲视频| 欧美亚洲视频| yy111111少妇影院日韩夜片 | 一区二区三区不卡在线| 欧美精品色网| 精品动漫av| 国产精品视频免费一区| 六月婷婷久久| 激情视频在线观看一区二区三区| 久久久久久九九九九| 亚洲国产欧美日韩| 国产精品九九| 乱人伦精品视频在线观看| 成人综合电影| 天堂精品一区二区三区| 国产精品v欧美精品v日韩| 一区二区三区福利| 不卡视频一区二区三区| 欧美日韩一区二区三区在线观看免 | 日本一区二区三区视频在线观看| 视频一区视频二区视频三区视频四区国产 | 99久久99久久| 欧美国产综合视频| 一区二区三区久久网| 亚洲另类黄色| 国产精品久久久对白| 亚洲三区视频| 免费日韩av片| 日韩一区免费观看| 日韩视频一区| 国内视频一区二区| 欧美视频亚洲视频| 97在线资源站| 亚洲二区自拍| 久久精品综合| 亚洲一区二区在线看| 奶水喷射视频一区| 欧美高清视频一区二区三区在线观看| 欧美精品成人| 成人三级在线| 欧美三级第一页| 国产一级精品aaaaa看| 国产精品v一区二区三区| 成人毛片网站| 国产在线日韩| 久久久精品动漫| 正在播放亚洲| 亚洲三级一区| 99视频免费观看| 黄色亚洲精品| 日韩福利视频| 99久久久精品免费观看国产| 欧美日韩在线精品一区二区三区| 99www免费人成精品| 国产精品va| 免费精品视频一区| 亚洲欧美日韩在线观看a三区| 亚洲欧洲精品一区二区| 成人动漫视频在线观看免费| 国产精品初高中精品久久| 精品国产乱码久久久久久郑州公司| 亚洲国产欧美不卡在线观看| 亚洲ai欧洲av| 国产一区二区无遮挡| 国产精品亚洲一区| 欧美va天堂| 日韩欧美一区二区三区四区| 91麻豆蜜桃| 亚洲欧美春色| 国产一区日韩一区| 亚洲视频精品一区| 精品一卡二卡三卡四卡日本乱码 | 激情久久久久| 少妇精品久久久久久久久久| av成人在线电影| 国产精品社区| 亚洲欧洲一级| 一区二区视频欧美| 国产精品草草|