首頁  >  文章  >  後端開發  >  php如何實作多進程

php如何實作多進程

王林
王林原創
2020-08-26 13:31:333448瀏覽

php實現多進程的方法:透過pcntl與posix擴展來實現。根據需求我們可以使用pcntl_fork()函數建立子進程,使用pcntl_wait()函數來阻塞目前進程。

php如何實作多進程

php多重處理需要pcntl,posix擴充支援。

多進程實作只能在cli模式下,在web伺服器環境下,會出現無法預期的結果。

(推薦影片教學:php影片教學

多重行程核心函式:

pcntl_fork(建立子行程)、pcntl_wait(阻塞目前進程)

詳細介紹:

pcntl_fork:

一次呼叫兩次返回,在父進程中返回子進程pid,在子進程中返回0,出錯返回-1。

pcntl_wait ( int &$status [, int $options ] ):

阻塞目前進程,直到任意一個子進程退出或收到一個結束當前進程的信號,注意是結束當前進程的信號,子進程結束發送的SIGCHLD不算。使用$status傳回子程序的狀態碼,並可以指定第二個參數來說明是否以阻塞狀態呼叫

阻塞方式呼叫的,函數傳回值為子程序的pid,如果沒有子程序回傳值為-1;

非阻塞方式調用,函數還可以在有子進程在運行但沒有結束的子進程時返回0。

pcntl_waitpid ( int $pid , int &$status [, int $options ] )

功能同pcntl_wait,區別為waitpid為等待指定pid的子程序。當pid為-1時pcntl_waitpid與pcntl_wait 一樣。在pcntl_wait和pcntl_waitpid兩個函數中的$status中存了子程序的狀態資訊。

(相關教學建議:php圖文教學

範例:

php中一個總是保持固定個數的子行程在執行。

根據需求使用pcntl_fork(建立子進程)、pcntl_wait(阻塞目前進程)等核心函數

程式碼實作:

<?php

//最大的子进程数量
$maxChildPro = 8;

//当前的子进程数量
$curChildPro = 0;

//当子进程退出时,会触发该函数,当前子进程数-1
function sig_handler($sig)
{
    global $curChildPro;
    switch ($sig) {
        case SIGCHLD:
            echo &#39;SIGCHLD&#39;, PHP_EOL;
            $curChildPro--;
            break;
    }
}

//配合pcntl_signal使用,简单的说,是为了让系统产生时间云,让信号捕捉函数能够捕捉到信号量
declare(ticks = 1);

//注册子进程退出时调用的函数。SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。
pcntl_signal(SIGCHLD, "sig_handler");

while (true) {
    $curChildPro++;
    $pid = pcntl_fork();
    if ($pid) {
//父进程运行代码,达到上限时父进程阻塞等待任一子进程退出后while循环继续
        if ($curChildPro >= $maxChildPro) {
            pcntl_wait($status);
        }
    } else {
//子进程运行代码
        $s = rand(2, 6);
        sleep($s);
        echo "child sleep $s second quit", PHP_EOL;
        exit;
    }
}

以上是php如何實作多進程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn