天天看點

php 非阻塞mysql_php多程序中的阻塞與非阻塞操作執行個體分析

本文執行個體講述了php多程序中的阻塞與非阻塞操作。分享給大家供大家參考,具體如下:

我們通過pcntl_fork來建立子程序,使用pcntl_wait和pcntl_waitpid來回收子程序。

子程序退出後,父程序沒有及時回收,就會産生僵屍程序。

例1:

define('FORK_NUMS', 5);

$pids = array();

//我們建立5個子程序

for($i = 0; $i < FORK_NUMS; ++$i) {

$pids[$i] = pcntl_fork();

if($pids[$i] == -1) {

die('fork error');

} else if ($pids[$i]) {

pcntl_wait($status);

} else {

echo getmypid() , " {$i} \r\n";

exit;

}

}

我們通過for循環fork出5個子程序,父程序會阻塞着等待子程序退出,然後建立下一個子程序。

上述代碼輸出結果如下:

20081 0

20082 1

20083 2

20084 3

20085 4

但我們建立多程序的目的,就是為了能夠并行的處理任務,阻塞的方式并不是我們想看到的。

例2:

define('FORK_NUMS', 5);

$pids = array();

//我們建立5個子程序

for($i = 0; $i < FORK_NUMS; ++$i) {

$pids[$i] = pcntl_fork();

if($pids[$i] == -1) {

die('fork error');

} else if ($pids[$i]) {

pcntl_wait($status, WNOHANG);

} else {

echo getmypid() , " {$i} \r\n";

exit;

}

}

我們可以通過設定pcntl_wait的第二個參數為WNOHANG來控制程序是否阻塞。

該函數可以在沒有子程序退出的情況下立刻跳出執行後續代碼。

pcntl_wait等同于以pid為-1調用pcntl_waitpid函數。

pcntl_waitpid函數可以等待指定pid的程序。

希望本文所述對大家PHP程式設計有所幫助。