<?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。