<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 2.1.2 進程池模塊的使用 在`Swoole-2.1.2`版本中我們將`Server`的進程管理模塊封裝成了`PHP`類,現在可以在`PHP`代碼中使用`Swoole`的進程管理器了。 在實際項目中經常需要寫一些長期運行的腳本,如基于`redis`、`kafka`、`rabbitmq`實現的多進程隊列消費者,多進程爬蟲等等。程序員需要使用`pcntl`和`posix`相關的擴展庫實現多進程編程,需要開發者具備深厚的`Linux`系統編程功底,否則很容易出現問題。 `Swoole`提供的進程管理器來自于`Swoole\Server`,經過大量生產項目驗證,穩定性和健壯性都非常高。可大大簡化多進程腳本編程工作。 一、 創建進程池 ----- 在`PHP`代碼中使用`new Swoole\Process\Pool`即可創建一個進程池,構造方法的第一個參數傳入工作進程的數量。使用`on`方法設置`WorkerStart`即可在工作進程啟動時執行指定的代碼,可以在這里進行`while(true)`循環從`redis`隊列中獲取任務并處理。使用`start`方法啟動所有進程,管理器開始進入`wait`狀態。 ```php $workerNum = 10; $pool = new Swoole\Process\Pool($workerNum); $pool->on("WorkerStart", function ($pool, $workerId) { echo "Worker#{$workerId} is started\n"; $redis = new Redis(); $redis->pconnect('127.0.0.1', 6379); $key = "key1"; while (true) { $msgs = $redis->brpop($key, 2); if ( $msgs == null) continue; var_dump($msgs); } }); $pool->on("WorkerStop", function ($pool, $workerId) { echo "Worker#{$workerId} is stopped\n"; }); $pool->start(); ``` 使用進程管理器,可以保證工作進程的穩定性。 * 某個工作進程遇到致命錯誤、主動退出時管理器會進行回收,避免出現僵尸進程 * 工作進程退出后,管理器會自動拉起、創建一個新的工作進程 二、信號處理 ---- `Swoole`進程管理器自帶了信號處理,向管理器進程發送: * `SIGTERM`信號:中止服務,向所有工作進程發送`SIGTERM`關閉進程 * `SIGUSR1`信號:重啟工作進程,管理器會逐個重啟工作進程 在工作進程中可以配合使用`pcntl_signal`和`pcntl_signal_dispatch`實現信號處理。 ```php $pool->on("WorkerStart", function ($pool, $workerId) { $running = true; pcntl_signal(SIGTERM, function () use (&$running) { $running = false; }); echo "Worker#{$workerId} is started\n"; $redis = new Redis(); $redis->pconnect('127.0.0.1', 6379); $key = "key1"; while ($running) { $msgs = $redis->brpop($key, 2); pcntl_signal_dispatch(); if ( $msgs == null) continue; var_dump($msgs); } }); ``` 三、任務投遞 ----- `Swoole`進程管理器自帶了消息隊列和`TCP-Socket`消息投遞的支持。可設置監聽系統隊列或者`TCP`端口,接收任務數據。此項功能是可選的,要使用任務投遞功能,需要對進程池對象設置`onMessage`回調。 #### 消息隊列 ```php $pool = new Swoole\Process\Pool(2, SWOOLE_IPC_MSGQUEUE, 0x7000001); $pool->on("WorkerStart", function ($pool, $workerId) { echo "Worker#{$workerId} is started\n"; }); $pool->on("Message", function ($pool, $message) { echo "Message: {$message}\n"; }); $pool->start(); ``` 需要在構造方法的第二個參數傳入`SWOOLE_IPC_MSGQUEUE`,第三個參數設置監聽的消息隊列`KEY`。其他程序中使用消息隊列相關`API`就可以向工作進程投遞任務了。 #### TCP 端口 ```php $pool = new Swoole\Process\Pool(2, SWOOLE_IPC_SOCKET); $pool->on("WorkerStart", function ($pool, $workerId) { echo "Worker#{$workerId} is started\n"; }); $pool->on("Message", function ($pool, $message) { echo "Message: {$message}\n"; }); $pool->listen('127.0.0.1', 8089); $pool->start(); ``` 使用`TCP`端口監聽,需要設置構造方法的第二個參數為`SWOOLE_IPC_SOCKET`,并使用`listen`方法設置監聽的主機和端口。 底層使用了`4`字節長度+包體的協議。其他程序中向此端口發送數據時,需要在數據包之前增加一個長度字段。 ```php $fp = stream_socket_client("tcp://127.0.0.1:8089", $errno, $errstr) or die("error: $errstr\n"); $msg = json_encode(['data' => 'hello', 'uid' => 1991]); fwrite($fp, pack('N', strlen($msg)).$msg); fclose($fp); ```
                  <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>

                              哎呀哎呀视频在线观看