php多程序處理

2021-07-13 09:05:13 字數 1534 閱讀 1216

往往我們會碰到乙個情況,需要寫乙個指令碼,這個指令碼要處理的資料量極大,單程序處理指令碼非常慢,那麼這個時候就會想到使用多程序或者多執行緒的方式了。

我習慣使用多程序的方式,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 父程...