往往我們會碰到乙個情況,需要寫乙個指令碼,這個指令碼要處理的資料量極大,單程序處理指令碼非常慢,那麼這個時候就會想到使用多程序或者多執行緒的方式了。
我習慣使用多程序的方式,php中使用多程序的時候需要使用pcntl,pcntl的使用可以看這個php的pcntl多程序
但是這裡有乙個問題,乙個主程序把任務分成n個部分,然後把任務分配給多個子程序,但是任務可能是有返回值的,所有的子程序處理完返回值以後需要把返回值返回給主程序。
這個就涉及到了程序間通訊了。程序間通訊可以使用的方法當然很多了,比如用redis,用資料庫,用檔案等。
php中最簡單的要算shmop相關函式了。
那怎麼讓乙個類很容易有多程序處理的能力呢?可以使用php的trait,建立乙個pcntltrait,所有需要有多程序處理功能的類就use 這個trait就行。
pcntltrait**如下:
<?php
namespace
trait pcntltrait
public
function
pcntl_call
($all, \closure $callback)
\r\n";
exit;
case
0: $data = ;
try catch(\exception $e)
$shm_key = ftok(__file__, 't') . getmypid();
$data = json_encode($data);
$shm_id = shmop_open($shm_key, "c", 0777, strlen($data) + 10);
shmop_write($shm_id, $data, 0);
shmop_close($shm_id);
exit;
default:
break;}}
// only master process will go into here
$ret = ;
foreach ($pids as $i => $pid)
}return $ret;
}}
它有兩個引數,第乙個引數為傳入陣列,第二個引數為陣列處理函式。
它的具體使用通過下面這個測試用例可以看出:
<?php
useclass
pcntlimp
class
testpcntltrait
extends \testcase
public
function
testpcntlcall
() $ret = ;
foreach ($info as $item)
return $ret;
});$this->assertequals(10, count($data));
$this->assertequals(25, $data[4]);
}}
非常方便~~ PHP多程序處理任務
系統 linux php 4 4.1.0,php 5,php 7 擴充套件 pcntlposixphp 多程序一般應用在 php cli 命令列中執行 php 指令碼,不要在 web 訪問時使用。多程序處理分解任務一般要比單程序更快。php 檢視是否安裝多程序模組 pcntl 是 process c...
PHP 多程序處理任務
乙個 php 多程序簡單例子大概是這個樣子 5 個子程序處理任務 for i 0 i 5 i elseif pid else 等待子程序執行結束 while pcntl waitpid 0 status 1 當然實際應用中我們不能夠這樣輸出 不夠健壯,也不夠優雅,我所以找了個基於pcntl封裝的擴充...
php利用多程序處理任務
注 php多程序一般應用在php cli命令列中執行php指令碼,做程序任務時要檢查php是否開啟了pcntl擴充套件,pcntl是process control程序管理的縮寫 pcntl fork 在當前程序當前位置產生分支 子程序 乙個fork子程序的基礎示例 pid pcntl fork 父程...