本篇文章給大家分享的是有關如何在php多進程中實現阻塞與非阻塞,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
通過pcntl_fork來創建子進程,使用pcntl_wait和pcntl_waitpid來回收子進程。
子進程退出后,父進程沒有及時回收,就會產生僵尸進程。
例1:
<?php
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:
<?php
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;
}
}以上就是如何在php多進程中實現阻塞與非阻塞,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。