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命令,...
快速排序演算法實現(遞迴實現 棧實現)
基本思想 選擇乙個基準元素,比如選擇最後乙個元素,通過一趟掃瞄,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,又稱為軸位置,此位置的元素確定後不再參與排序,然後再用同樣的方法遞迴地排序劃分的兩部分。分析 快速排序是不穩定的排序。快速排序的時間複...
介面實現與配置實現
在實現系統功能的時候,通常會首先定義好功能的介面,在系統功能不斷被實現的過程中,慢慢的發現有些介面的實現很類似,這個時候通常會開始做一次抽象,形 成乙個共同的部分,慢慢的系統形成了乙個抽象的層次,而為了通用,通常是通過定義介面,形成乙個抽象類,抽象類中暴露出一些抽象方法供外部擴充套件實 現,逐步的積...