<?php
set_time_limit(0);
ini_set('memory_limit', '1024M');
//配合pcntl_signal使用
declare(ticks=1);
//最大的子进程数量
$max = 30;
//当前的子进程数量
$child = 0;
//当子进程退出时,会触发该函数
function sig_handler($sig)
{
global $child;
switch($sig) {
case SIGCHLD:
//echo 'SIGCHLD received'."\n";
$child--;
}
}
//注册子进程退出时调用的函数
pcntl_signal(SIGCHLD, "sig_handler");
while(true)
{
$child++;
if(****) // 根据实际业务设计退出条件
{
break;
}
$pid = pcntl_fork();
if (-1 == $pid)
{
echo date("H:i:s")." error : ×××××××";// 创建进程失败,打印错误信息
}
else if (!$pid)
{
// 业务逻辑代码
// todo...
exit; // 最好要有该语句
}
else
{
if ($child >= $max)
{
pcntl_waitpid($pid, $status);
}
}
}
1.多进程之间的任务分配,比如一个表,每启动一个进程时可能要分配一个id段给该进程负责
2.设置最大进程并发数,要根据机器的性能资源进行设置,内存、cpu都要考虑
3.如果报异常:pcntl_fork(): Error 11,则需要对当前用户设置最多连接数,
命令为:limit -u 9999 ,这样就设置为了9999,默认是1024。