PHP多進程通常應用在PHP_CLI命令行中執行php腳本,不要在web訪問時使用。php
php -m | grep pcntl
(pcntl是process control的縮寫)web
<?php $pid = pcntl_fork(); //父進程和子進程都會執行下面代碼 if ($pid == -1) { //錯誤處理:建立子進程失敗時返回-1. die('could not fork'); } else if ($pid) { //父進程會獲得子進程號,因此這裏是父進程執行的邏輯 pcntl_wait($status); //等待子進程中斷,防止子進程成爲殭屍進程。 } else { //子進程獲得的$pid爲0, 因此這裏是子進程執行的邏輯。 }
split -l 25000 -d file.log prefix_name
-l是按照行分割,-d是分割後的文件名按照數字,-a是分割後的文件個數位數(默認是2,作多就是99個;好比超過100個,-a能夠寫3)。本身嘗試分割一下就知道了。shell
處理代碼:函數
<?php shell_exec('split -l 25000 -d file.log prefix_name'); // 3個子進程處理任務 for ($i = 0; $i < 3; $i++){ $pid = pcntl_fork(); if ($pid == -1) { die("could not fork"); } elseif ($pid) { echo "I'm the Parent $i\n"; } else {// 子進程處理 $content = file_get_contents("prefix_name0".$i); // 業務處理 begin // 業務處理 end exit;// 必定要注意退出子進程,不然pcntl_fork() 會被子進程再fork,帶來處理上的影響。 } } // 等待子進程執行結束 while (pcntl_waitpid(0, $status) != -1) { $status = pcntl_wexitstatus($status); echo "Child $status completed\n"; }