swoole process實現多程序

2022-02-01 01:04:59 字數 3836 閱讀 2337

swoole_process 是swoole提供的程序管理模組,用來替代php的pcntl擴充套件。

首先,確保安裝的swoole版本大於1.7.2:

$ php --ri swoole

swoole

swoole support => enabled

version => 1.10.1

注意:swoole_process在最新的1.8.0版本已經禁止在web環境中使用了,所以也只能支援命令列。這時候如果要做併發,multi-curl是不錯的選擇。

本例裡待消費的是三個shell命令,會分別建立乙個子程序來消費。消費的時候故意sleep了1秒,以便直**到效果。

process_t1.php

<?php

$start_time = microtime(true);

$cmds = [

"uname",

"date",

"whoami"

];foreach ($cmds as $cmd)

//子程序建立成功後要執行的函式

function my_process(swoole_process $worker)

//子程序結束必須要執行wait進行**,否則子程序會變成殭屍程序

while($ret = swoole_process::wait())

$end_time = microtime(true);

echo sprintf("use time:%.3f s\n", $end_time - $start_time);

命令列裡執行:

$ php process_t1.php  

linux

sat apr 21 15:29:55 cst 2018

root

worker exit, pid=672

worker exit, pid=674

worker exit, pid=676

use time:3.080 s

大家會覺得很奇怪,為什麼開了三個子程序,還是用了3秒,應該是1秒左右才對呀。

原因是父程序讀取子程序返回的資料的時候,是同步阻塞讀取:

echo $rec = $process->read();//同步阻塞讀取管道資料
導致的後果就是父程序依次等待每個程序處理完並返回了內容,才走下一次迴圈。

解決方案1:

使用swoole_event_add將管道加入到事件迴圈中,變為非同步模式:

// echo $rec = $process->read();//同步阻塞讀取管道資料

//使用swoole_event_add將管道加入到事件迴圈中,變為非同步模式

swoole_event_add($process->pipe, function($pipe) use($process) );

執行結果:

worker exit, pid=686

worker exit, pid=687

worker exit, pid=688

use time:1.060 s

linux

sat apr 21 15:37:14 cst 2018

root

大家會發現,use time資料並不是最後列印出來的。已經是非同步的了。 實際執行時間1s左右。

解決方案2:

先不獲取子程序返回值,迴圈結束後統一返回:

foreach ($cmds as $cmd) 

foreach ($process_arr as $process)

執行結果:

linux

sat apr 21 15:52:24 cst 2018

root

worker exit, pid=694

worker exit, pid=693

worker exit, pid=695

use time:1.061 s

swoole_process::__construct(callable $function, $redirect_stdin_stdout = false, $create_pipe = true);
第乙個引數是子程序建立成功後要執行的函式。

$redirect_stdin_stdout,重定向子程序的標準輸入和輸出。啟用此選項後,在子程序內輸出內容將不是列印螢幕,而是寫入到主程序管道(例如用echo列印的內容也寫入管道)。讀取鍵盤輸入將變為從管道中讀取資料。預設為阻塞讀取。

$create_pipe,是否建立管道,啟用$redirect_stdin_stdout後,此選項將忽略使用者引數,強制為true。如果子程序內沒有程序間通訊,可以設定為 false

如果跑的服務需要一直常駐後台,可以在$process->start();前面加上:

swoole_process::daemon();
服務會在後台執行。

<?php

//獲取多個網頁資訊

$urls = [

'','',

'/1',

'',];foreach ($urls as $key => $url) , true);

$process->start();

swoole_event_add($process->pipe, function($pipe) use($process, $url) );

}echo "ok.\n";

while($ret = swoole_process::wait())

/** * 獲取網頁http code

*/function gethttpcode($url)

執行:

$ php process_get.php

ok. code: 403

/1 code: 404

code: 200

code: 403

<?php

//獲取多個網頁資訊

$urls = [

'','',

'/1',

'',];$process = new swoole_process(function(swoole_process $worker) use($urls)

$worker->push('exit');

}, false, false); //不建立管道

$process->usequeue(1, 2); //使用訊息佇列。訊息佇列通訊方式與管道不可共用。訊息佇列不支援eventloop,使用訊息佇列後只能使用同步阻塞模式非阻塞

$process->start();

while(1)

echo "ok.\n";

while($ret = swoole_process::wait())

/** * 獲取網頁http code

*/function gethttpcode($url)

執行:

$ php process_get_queue.php

: 200

: 403

/1: 404

: 403

ok.worker exit, pid=1222

1、process

2、swoole_process->read

swoole process實現多程序

swoole process 是swoole提供的程序管理模組,用來替代php的pcntl擴充套件。首先,確保安裝的swoole版本大於1.7.2 php ri swoole swoole swoole support enabled version 1.10.1本例裡待消費的是三個shell命令,...

快速排序演算法實現(遞迴實現 棧實現)

基本思想 選擇乙個基準元素,比如選擇最後乙個元素,通過一趟掃瞄,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,又稱為軸位置,此位置的元素確定後不再參與排序,然後再用同樣的方法遞迴地排序劃分的兩部分。分析 快速排序是不穩定的排序。快速排序的時間複...

介面實現與配置實現

在實現系統功能的時候,通常會首先定義好功能的介面,在系統功能不斷被實現的過程中,慢慢的發現有些介面的實現很類似,這個時候通常會開始做一次抽象,形 成乙個共同的部分,慢慢的系統形成了乙個抽象的層次,而為了通用,通常是通過定義介面,形成乙個抽象類,抽象類中暴露出一些抽象方法供外部擴充套件實 現,逐步的積...