在线看片18_亚洲性吧_在线污_神马午夜达达兔_奇米色网_在线免费看污

SyncInvoker 組件

使用場(chǎng)景

Swoole4.x 后,提供了非常強(qiáng)大的協(xié)程能力,讓我們可以更好地壓榨服務(wù)器性能,提高并發(fā)。然而,目前 PHPSwoole 協(xié)程生態(tài)上,并不是很完善,比如:沒(méi)有協(xié)程版本的 MonogoDB 客戶端,而為了避免在 Worker 進(jìn)程中調(diào)用了同步阻塞的 Api,例如在 Http 回調(diào)中使用了同步的 MonogoDB 客戶端,導(dǎo)致 Worker 進(jìn)程退化為同步阻塞,導(dǎo)致無(wú)法完全地發(fā)揮協(xié)程的優(yōu)勢(shì)。所以 EasySwoole 提供了一個(gè)同步程序協(xié)程調(diào)用轉(zhuǎn)化驅(qū)動(dòng)。

設(shè)計(jì)原理

啟動(dòng)自定義進(jìn)程監(jiān)聽(tīng) UnixSocket,然后在 Worker 進(jìn)程中調(diào)用協(xié)程客戶端發(fā)送命令到自定義進(jìn)程并處理,然后把處理結(jié)果返回給 Worker進(jìn)程中的協(xié)程客戶端。

組件要求

  • php: >= 7.1.0
  • ext-swoole: >= 4.4.23
  • easyswoole/component: ^2.0
  • opis/closure: ^3.5

安裝方法

composer require easyswoole/sync-invoker

倉(cāng)庫(kù)地址

easyswoole/sync-invoker

基本使用

首先定義一個(gè)驅(qū)動(dòng)工作實(shí)例(可以定義多個(gè)),示例代碼如下:

<?php

namespace App\Utility;

use EasySwoole\SyncInvoker\AbstractDriver;

class MyInvokerDriver extends AbstractDriver
{
    private $stdclass;

    function __construct()
    {
        $this->stdclass = new \stdClass();
        parent::__construct();
    }

    public function test($a, $b)
    {
        $this->response($a + $b);
    }

    public function a()
    {
        $this->response('this is a');
    }

    public function getStdClass()
    {
        return $this->stdclass;
    }
}

然后注冊(cè)一個(gè)對(duì)應(yīng)的調(diào)用器,示例代碼如下:

<?php

namespace App\Utility;

use EasySwoole\Component\Singleton;
use EasySwoole\SyncInvoker\SyncInvoker;

// 注冊(cè)一個(gè)對(duì)應(yīng)的調(diào)用器
class MyInvoker extends SyncInvoker
{
    use Singleton;
}

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

<?php

namespace EasySwoole\EasySwoole;

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

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        // TODO: Implement initialize() method.
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        $invokerConfig = \App\Utility\MyInvoker::getInstance()->getConfig();

        // 以下這些配置都是可選的,可以使用組件默認(rèn)的配置
        /*
        $invokerConfig->setServerName('EasySwoole'); // 設(shè)置服務(wù)名稱(chēng),默認(rèn)為 'EasySwoole'
        $invokerConfig->setWorkerNum(3); // 設(shè)置 Worker 進(jìn)程數(shù),默認(rèn)為 3
        $invokerConfig->setTempDir(EASYSWOOLE_ROOT . '/Temp'); // 設(shè)置 unixSocket 存放目錄,默認(rèn)為 系統(tǒng)臨時(shí)文件存放目錄('/tmp')
        $invokerConfig->setMaxPackageSize(2 * 1024 * 1024); // 設(shè)置最大允許發(fā)送數(shù)據(jù)大小,默認(rèn)為 2M
        $invokerConfig->setTimeout(3.0); // 設(shè)置服務(wù)調(diào)用超時(shí)時(shí)間,默認(rèn)為 3.0 秒
        $invokerConfig->setAsyncAccept(true); // 設(shè)置異步接收數(shù)據(jù),默認(rèn)為 異步接收(不建議修改)
        $invokerConfig->setOnWorkerStart(function (\EasySwoole\SyncInvoker\Worker $worker) {
            var_dump('worker start at Id ' . $worker->getArg()['workerIndex']);
        }); // 設(shè)置服務(wù)啟動(dòng)時(shí)執(zhí)行的事件回調(diào)
        */

        $invokerConfig->setDriver(new \App\Utility\MyInvokerDriver()); // 設(shè)置驅(qū)動(dòng)工作實(shí)例【必須配置】

        // 注冊(cè) Invoker
        \App\Utility\MyInvoker::getInstance()->attachServer(ServerManager::getInstance()->getSwooleServer());
    }
}

在框架服務(wù)啟動(dòng)后,即可在框架的任意位置調(diào)用 Invoker 服務(wù)了,使用示例如下:

例如在控制器中進(jìn)行調(diào)用:

<?php

namespace App\HttpController;

use EasySwoole\Http\AbstractInterface\Controller;

class Index extends Controller
{
    public function index()
    {
        $ret = \App\Utility\MyInvoker::getInstance()->invoke()->test(1, 2);
        var_dump($ret);
        var_dump(\App\Utility\MyInvoker::getInstance()->invoke()->a());
        $ret = \App\Utility\MyInvoker::getInstance()->invoke()->callback(function (\App\Utility\MyInvokerDriver $driver) {
            $std = $driver->getStdClass();
            if (isset($std->time)) {
                return $driver->response($std->time);
            } else {
                $std->time = time();
                return $driver->response('new set time');
            }
        });
        var_dump($ret);
    }
}

/**
 * 輸出結(jié)果:
 * int(3)
 * string(9) "this is a"
 * string(12) "new set time"
 * int(3)
 * string(9) "this is a"
 * int(1611071672)
 */

注意事項(xiàng)

  • 盡量使用函數(shù)名調(diào)用方式,閉包方式調(diào)用會(huì)存在部分閉包函數(shù)序列化失敗問(wèn)題
  • 傳遞參數(shù),返回結(jié)果盡量用數(shù)組或者字符串傳遞,資源對(duì)象無(wú)法序列化
主站蜘蛛池模板: 久久在线免费 | 91精品亚洲| 一级免费看片 | 伊人网伊人影院 | 网址av| 亚洲动态图| av片网站| 香蕉av网站| 成年人看的免费视频 | 一本av在线 | 国产婷婷 | 日韩一区二区三区免费观看 | 免费视频中文字幕 | 午夜在线一区 | 性巴克成人免费网站 | 看成人片 | 四虎影院在线免费 | h视频在线播放 | 午夜久久影院 | 亚洲综合五月 | 日韩精品久久久久久久的张开腿让 | 亚洲成人高清在线 | 98精品在线 | 免费黄色小视频在线观看 | 91在线公开视频 | 一级欧美一级日韩 | 日韩国产免费 | 久久久久久一区二区 | 国产精品一区二区久久 | 蜜桃色av | 欧美一区不卡 | 国产日韩精品一区二区 | 热久久最新 | 四虎免费看黄 | 天堂av中文在线 | 国产精品视频在线观看免费 | 久热中文字幕 | 国内av | 日韩一区免费视频 | 超碰在线网址 | 色综合成人|