php使用多進程


多進程使用場景

多進程一般用來處理消息隊列,等數據量比大的任務。

使用限制

php多進程需要pcntlposix擴展支持。可以使用php -m查看是否安裝該擴展。
需要注意的是CLI模式和CGI模式時用的php.ini並非同一個配置,需要單獨配置。一般情況下使用默認配置即可
php多進程只能運行在CLI環境下,在web服務器環境下會出現無法預期的結果,要慎用!
子進程的個數最好和服務器的核數匹配,子進程超過cpu核數就會存在執行分配問題,所以不建議子進程開得很多。

核心函數

pcntl_fork
創建子進程,一次調用兩次返回。在父進程中返回子進程id,在子進程中返回0,創建子進程失敗返回-1。所以可以根據返回值判斷當前是處於子進程或父進程。
pcntl_waitpid
等待或返回fork的子進程狀態,具體參數可以參考文檔,我也沒有太理解是什么原理,就不多說了。

for($i=0; $i<4; $i++){
    $pid = pcntl_fork();	//創建子進程
    if($pid == -1){
        echo "子進程創建失敗".PHP_EOL;
    } elseif($pid){
        //$ppid = posix_getpid();
        //echo "父進程--".$ppid.PHP_EOL;
    } else {
        $pid = posix_getpid();    //獲取當前進程id
        $ppid = posix_getppid();  //獲取父進程id
        echo "父進程--{$ppid}子進程--".$pid.PHP_EOL;
        exit(); //子進程需要exit,防止子進程繼續執行pcntl_fork
    }
}

//等待子進程結束
while(pcntl_waitpid(0, $status) != -1){
    echo "子進程結束了".PHP_EOL;
}

//所有子進程結束
echo "父進程結束".PHP_EOL;

執行結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM