分享PHP-pcntl 实现多进程代码

网络编程 2021-07-05 09:10www.168986.cn编程入门
PHP可通过PCNTL扩展实现进程控制,如进程创建,信号处理,进程中断判断等。但只能在CLI模式下操作。PCNTL的信号机制是基于 ticks 机制实现的。

PHP使用PCNTL系列的函数也能做到多进程处理一个事务。比如我需要从数据库中获取80w条的数据,再做一系列后续的处理,这个时候,用单进程?你可以等到明年今天了。。。所以应该使用ptl函数了。

狼蚁网站SEO优化我们来看个实例

代码

<?php
$arChildId = array();

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

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

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

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

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

运行结果

 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

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by