PHP提供了一個Pcntl擴展,Pcntl基於Linux的進程,Windows系統暫時沒有這個擴展,用於實現基礎的多進程實現,能夠利用這個處理一個很耗時的任務,例如發訂閱郵件,短信,站內信等。php
參考連接:html
php.net/manual/zh/r…swoole
rango.swoole.com/archives/36…學習
示例代碼:this
代碼是基於Laravel 框架的,建議使用此框架來容許這部分代碼。spa
public function index(Request $request)
{
pcntl_signal(SIGCHLD, SIG_IGN); //若是父進程不關心子進程何時結束,子進程結束後,內核會回收。
$max = 8000;
$workers = 10;
$pids = array();
for($i = 0; $i < $workers; $i++){
$pids[$i] = pcntl_fork();
$pid = posix_getpid();
switch ($pids[$i]) {
case -1:
echo "fork error : {$i} \r\n";
exit;
case 0:
$param = array(
'lastid' => $max / $workers * $i,
'maxid' => $max / $workers * ($i+1),
);
$this->doSomething($pid, $param);
exit;
default:
break;
}
}
foreach ($pids as $i => $pid) {
if($pid) {
//父進程會獲得子進程號,因此這裏是父進程執行的邏輯
//若是不須要阻塞進程,而又想獲得子進程的退出狀態,則能夠註釋掉pcntl_wait($status)語句,或寫成:
pcntl_wait($status,WNOHANG); //等待子進程中斷,防止子進程成爲殭屍進程。
//pcntl_waitpid($pid, $status);
}
}
}
// 能夠看到那個子進程在處理哪些數據
public function doSomething($filename, $param)
{
for ($i = $param['lastid']; $i < $param['maxid']; $i++) {
$path = "./test/";
if (!is_dir($path)){
mkdir($path, 0777, true);
}
$content = $i . '|';
$file = $path . $filename . ".txt";
file_put_contents($file, $content, FILE_APPEND);
}
}
複製代碼
更多建議讀文檔,進程和線程,還有不少內容的,須要讀書去學習了.net