<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 1.7.2 task進程使用消息隊列 [TOC] 1.7.2新增特性,可將task進程單獨設置為消息隊列。帶來的好處是: ## 任務排隊容量增加 在維持worker進程異步的前提下,task進程可使用消息隊列提升任務排隊的容量,unix sock受到緩存區尺寸限制,而消息隊列不受限制,可以利用到操作系統所有的內存。 如你的機器有32G內存,如果是unix sock一般緩沖區只有8M。如果你的任務很多,會堆積在socket緩存區中。當超過緩沖區時就會無法再投遞新的任務。 而消息隊列,只要操作系統有剩余內存,那一直可以投遞新的任務到隊列中。 ## 支持外部程序投遞任務 當前的`swoole`使用`Unix Socket`,只允許程序內部進行通信。采用消息隊列后,拿到消息隊列的`key`。其他程序就可以向此隊列投遞數據了。 #### 實例 ~~~ class SwooleTask { protected $queueId; protected $workerId; protected $taskId = 1; const SW_TASK_TMPFILE = 1; //tmp file const SW_TASK_SERIALIZE = 2; //php serialize const SW_TASK_NONBLOCK = 4; //task const SW_EVENT_TASK = 7; /** * SwooleTask constructor. * @param $key * @param int $workerId * @throws Exception */ function __construct($key, $workerId = 0) { $this->queueId = msg_get_queue($key); if ($this->queueId === false) { throw new \Exception("msg_get_queue() failed."); } $this->workerId = $workerId; } protected static function pack($taskId, $data) { $flags = self::SW_TASK_NONBLOCK; $type = self::SW_EVENT_TASK; if (!is_string($data)) { $data = serialize($data); $flags |= self::SW_TASK_SERIALIZE; } if (strlen($data) >= 8180) { $tmpFile = tempnam('/tmp/', 'swoole.task'); file_put_contents($tmpFile, $data); $data = pack('l', strlen($data)) . $tmpFile . "\0"; $flags |= self::SW_TASK_TMPFILE; $len = 128 + 24; } else { $len = strlen($data); } return pack('lSsCCS', $taskId, $len, 0, $type, 0, $flags) . $data; } function dispatch($data) { $taskId = $this->taskId++; if (!msg_send($this->queueId, 2, self::pack($taskId, $data), false)) { return false; } else { return $taskId; } } } echo "Sending text to msg queue.\n"; $task = new SwooleTask(0x70001002, 1); //普通字符串 $task->dispatch("Hello from PHP!"); ~~~ task進程是可以與swoole\_server所有的客戶端連接進行通信的,所以外部程序使用消息隊列作為IPC,就可以與所有客戶端連接進行通信。 ## 使用方法 只需設置swoole\_server::set參數即可。新增的參數如下: * task\_ipc\_mode => 1 | 2 | 3,默認為1就是普通的unix socket通信方式,2, 3就是使用消息隊列模式。模式2和模式3的不同之處是,模式2支持定向投遞,$serv->task($data, $task\_worker\_id) 這里可以指定投遞到哪個task進程。模式3是完全爭搶模式,task進程會爭搶隊列,將無法使用定向投遞,即使指定了$task\_worker\_id,在模式3下也是無效的。 * message\_queue\_key => 0x72000100 ,指定一個消息隊列key。如果需要運行多個swoole\_server的實例,務必指定。否則會發生數據錯亂
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看