easyswoole - 基于swoole扩展实现的一款高性能php框架

自定義進程

PHP自帶的pcntl存在許多不足,不支持重定向標準輸入和輸出及進程間通信的功能,且容易使用錯誤。
EasySwoole基于SwooleProcess模塊進行了封裝,來創建工作進程,用于處理耗時任務,消息隊列,等其它的特殊任務。
EasySwoole啟動時,會自動創建注冊的進程,并執行進程指定的邏輯代碼,進程意外退出時,會被重新拉起。

創建一個自定義進程

需要定義一個進程類繼承EasySwoole\Component\Process\AbstractProcess。

定義進程內執行邏輯回調

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

    $this->getProcess(); // 獲取進程實例 \Swoole\Process

    $this->getPid(); // 獲取當前進程Pid

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

進程間通信Pipe回調

protected function onPipeReadable(Process $process)
{
    // 該回調可選
    // 當主進程對子進程發送消息的時候 會觸發
    $process->read(); // 讀取消息
}

進程間異?;卣{

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

進程信號回調

protected function onSigTerm()
{
    // 當進程接收到 SIGTERM 信號觸發該回調
}

進程意外退出回調

protected function onShutDown()
{
    // 該回調可選
    // 進程意外退出 觸發此回調
    // 大部分用于清理工作
}

注冊進程

EasySwoole 全局的 mainServerCreate 事件中進行進程注冊

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

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

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

注意:用戶在注冊多個相同配置的自定義進程時,請一定不要復用實例化后的進程對象,而應該重新實例化一個新的進程對象。如果復用了將導致不可預知的結果。正確注冊和錯誤注冊的參考示例代碼如下:

錯誤的注冊示例:

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', // 設置 進程名稱為 TickProcess
        ]);

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

        ### !!! 錯誤原因:把上述實例化得到的自定義進程對象 $testProcess 進行了復用,注冊了 2 次,將導致未知錯誤。
        // 注冊進程
        \EasySwoole\Component\Process\Manager::getInstance()->addProcess($testProcess);
        \EasySwoole\Component\Process\Manager::getInstance()->addProcess($testProcess);
    }
}

正確的注冊示例:

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', // 設置 進程名稱為 TickProcess
        ]);

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

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

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

完整示例代碼

1. 定義自定義進程類示例

首先,我們定義一個自定義進程類繼承 \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(); // 獲取 注冊進程名稱
        $swooleProcess = $this->getProcess(); // 獲取 注冊進程的實例 \Swoole\Process
        $processPid = $this->getPid(); // 獲取 當前進程 Pid
        $args = $this->getArg(); // 獲取 注冊進程時傳遞的參數

        var_dump('### 開始運行自定義進程 start ###');
        var_dump($processName, $swooleProcess, $processPid, $args);
        var_dump('### 運行自定義進程結束 end ###');
    }

    protected function onPipeReadable(Process $process)
    {
        // 該回調可選
        // 當主進程對子進程發送消息的時候 會觸發
        $recvMsgFromMain = $process->read(); // 用于獲取主進程給當前進程發送的消息
        var_dump('收到主進程發送的消息: ');
        var_dump($recvMsgFromMain);
    }

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

    protected function onShutDown()
    {
        // 該回調可選
        // 進程意外退出 觸發此回調
        // 大部分用于清理工作
    }

    protected function onSigTerm()
    {
        // 當進程接收到 SIGTERM 信號觸發該回調
    }
}

2. 注冊進程示例

然后在 mainServerCreate 事件中進行注冊進程,示例代碼如下:

<?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', // 設置 進程名稱為 TickProcess
            'processGroup' => 'Custom', // 設置 進程組名稱為 Tick
            'arg' => [
                'arg1' => 'this is arg1!',
            ], // 傳遞參數到自定義進程中
            'enableCoroutine' => true, // 設置 自定義進程自動開啟協程環境
        ]);

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

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

3. 向自定義進程中傳遞消息

<?php

namespace App\HttpController;

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

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

進程管理命令說明

EasySwoole 內置了對于 Process 的命令行操作,方便開發者非常友好地去管理 Process。

可執行 php easyswoole.php process -h 來查看具體操作。

顯示所有進程

php easyswoole.php process show

如果想要以 MB 形式顯示:

php easyswoole.php process show -d

殺死指定進程(PID)

php easyswoole.php process kill --pid=PID

殺死指定進程組(GROUP)

php easyswoole.php process kill --group=GROUP_NAME

殺死所有進程

php easyswoole.php process killAll

強制殺死進程

需要帶上 -f 參數,例如:

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

主站蜘蛛池模板: 智能照明模块,智能动力控制器,巨川电气-智能电气领航 | 五金冲压厂家_五金冲压件加工_微细孔加工-深圳市浩鑫精密五金制品有限公司 | 河北万岁药业有限公司 | 智能调光模块,调光系统巨川电气-专注智能照明 | 硬度计-布氏硬度计-维氏硬度计-莱洛特试验仪器有限公司 | 河北太尚园林-太尚雕塑厂家_石雕_不锈钢雕塑厂家_铸铜雕塑_雕塑设计定制 | 深圳市中控智能科技有限公司 | 十堰急开锁0719-8888139|十堰开锁公司|十堰开锁电话|十堰换锁价格-同福锁城-十堰同福锁城 | 新乡市大成数控机械有限公司| 江西蔬菜配送,南昌蔬菜配送,南昌食堂承包,江西饭堂承包-江西菜篮子农产品发展有限公司 | 喷涂流水线,喷漆流水线-山东天意设备科技 | 机械设备回收_二手机器回收_设备拆除回收_广州益美机械设备回收公司 | 惠声电子、广州市惠声电子科技有限公司、VBS、VBS惠声电子、VBS公共广播生产厂家、VBS广播功放生产厂家、VBS会议系统设备批发、VBSIP网络对讲系统厂家、VBS会议系统厂家、VBS智能中控厂家、VBS专业扩声厂家 | 陕西筱润智能科技有限公司 干部人事智能档案柜 智能密集架 智能档案柜 部队选层文件智能柜 智能枪弹柜 财务智能档案柜 边防武警智能密集架 医院智能档案柜 部队选层文件智能柜智能枪弹柜 学校医院文件柜 企事业单位公检法智能文件柜 生产厂家-筱润智能科技有限公司 RFID射频智能密集架 全自动智能选层档案柜 智能密保柜 枪柜部队营房营具床桌椅办公家具 办公用品档案盒设备货架 全自动智能选层柜生产厂家-筱润智能科技有限公司 | 深圳注册公司-工商注册代理-深圳注册公司流程及费用-记帐报税-公司注销-[深圳市悟空企业管理(深圳)有限公司] | 江苏圣博莱自动化科技有限公司| 消防巡检柜-EPS应急电源-交直流屏厂家-中央信号屏-万正电源 | 柔性电缆-专业机器人电缆,拖链电缆生产厂家| 江西同欣机械制造股份有限公司 | 轮转印刷机_商标印唛机_超声波切唛机_瑞安市明辉机械有限公司 | 津南人才网_津南招聘网_求职找工作平台 | 泡沫混凝土垫层填充厂家,发泡混凝土垫层填充,轻质混凝土垫层填充厂家,深圳市鸿奥建材发展有限公司 | 绝缘纸板-3240环氧板-酚醛布板-FR4环氧板-沈阳友达绝缘材料有限公司 | 建材制品燃烧热值试验仪_建筑材料不燃性试验仪-华阳试验机制造 | 山东装卸登车桥_液压装卸升降平台_固定|移动登车桥_山东牛斗重工厂家 | 开拓者喷雾设备有限公司专业生产喷嘴,喷雾设备,清洗,喷涂,降温,除尘,润滑等喷雾系统的方案解决商 | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 蒸汽孔板流量计-法兰式孔板流量计-一体化标准孔板流量计-金湖中原仪表有限公司 | 欧洲_西班牙进口_燃木真火壁炉集成服务商_燃木壁炉官方网站.hergom | 造型松|泰山迎客松|造型油松-泰安小苹果园林 | 天下机械|机床商讯-机械网|机械技术|机械信息|机床资讯|机床设备|机床商讯杂志 | 新鲜水果 新鲜茶 - 甜啦啦官网 | 深圳LED显示屏厂家_室内户外LED显示屏_彩屏电子有限公司 | 上海舞台灯光音响租赁搭建线阵_年会演出摇头光束面光灯出租_led电子显示屏出租-上海led大屏幕租赁 | 欧美日韩人妻精品一区二区三区_欧美成人精品欧美一级乱黄_亚洲欧美日韩高清一区二区三区_国产一级做a爰片久久毛片_日韩一级视频在线观看播放_精品一区二区三区免费毛片爱_完整观看高清秒播国内外精品资源 | 提供专业.全面.优质的壁炉服务-莫洛尼官方网站moloney | 台车炉厂家_台车式退火炉_台车式回火炉—安徽大新工业炉有限公司 | 精品中文字幕在线观看,粉嫩av一区二区三区,最近中文字幕在线看免费视频,亚洲高清在线观看,日本一区二区视频手机免费看,国产黄色小视频,亚洲高清免费视频,国产精品一区二区欧美视频,亚洲人免费视频,亚洲视频在线观看免费,国产免费高清综合视频,中文字幕永久在线 | 五凌汽配-轮胎螺丝|中心螺丝|小螺丝|轮胎螺栓|扭力杆螺丝|高强度紧固件|螺丝螺母|汽车配件 | 微型电磁阀_隔膜泵_活塞泵_微型水泵_微型真空泵_微型气泵【东莞市宗旨电子科技有限公司】 | 宁波管道安装_宁波工业冷风机_宁波冷风机厂家_宁波厂房通风降温_「浙江甬风机电」 |