Home  >  Article  >  Backend Development  >  pcntl multi-process

pcntl multi-process

高洛峰
高洛峰Original
2016-10-20 14:11:301199browse

Code

<?php
$arChildId = array();

for($i = 0; $i < 10; $i++)
{
$iPid = pcntl_fork();
if($iPid == -1)
{
    die(&#39;can\&#39;t be forked.&#39;);
}

if($iPid)
{
    # 主进程逻辑
    $arChildId[] = $iPid;
}
else
   {
    # 子进程逻辑
    $iPid = posix_getpid();  # 获取子进程的ID
    $iSeconds = rand(5, 30);
    echo &#39;* Process &#39;. $iPid. &#39; was created, and Executed, and Sleep &#39;. $iSeconds. PHP_EOL;
    excuteProcess($iPid, $iSeconds);
    exit();
}
}

while(count($arChildId) > 0)
{
foreach($arChildId as $iKey=> $iPid)
{
    $res = pcntl_waitpid($iPid, $status, WNOHANG);

    if($res == -1 || $res > 0)
    {
        unset($arChildId[$iKey]);
        echo &#39;* Sub process: &#39;. $iPid. &#39; exited with &#39;. $status. PHP_EOL;
    }
}
}



# 子进程执行的逻辑
function excuteProcess($iPid, $iSeconds)
{
file_put_contents(&#39;./log/&#39;.$iPid.&#39;.log&#39;, $iPid.PHP_EOL, FILE_APPEND);
sleep($iSeconds);
}
?>

Run result

* Process 16163 was created, and Executed, and Sleep 11
* Process 16164 was created, and Executed, and Sleep 21
* Process 16165 was created, and Executed, and Sleep 24
* Process 16166 was created, and Executed, and Sleep 27
* Process 16167 was created, and Executed, and Sleep 8
* Process 16168 was created, and Executed, and Sleep 14
* Process 16169 was created, and Executed, and Sleep 14
* Process 16170 was created, and Executed, and Sleep 26
* Process 16171 was created, and Executed, and Sleep 20
* Process 16172 was created, and Executed, and Sleep 21
* Sub process: 16167 exited with 0
* Sub process: 16163 exited with 0
* Sub process: 16169 exited with 0
* Sub process: 16168 exited with 0
* Sub process: 16171 exited with 0
* Sub process: 16164 exited with 0
* Sub process: 16172 exited with 0
* Sub process: 16165 exited with 0
* Sub process: 16170 exited with 0
* Sub process: 16166 exited with 0


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn