PHP多进程并发处理技术
PHP多进程并发处理技术PHP的pcntl扩展提供了多进程编程的能力。CLI模式下可以用多进程并行处理任务。今天说说PHP多进程的实现。pcntl_fork创建子进程。父进程和子进程在fork之后各自执行不同的路径。phpif (!extension_loaded(pcntl)) die(pcntl扩展未安装\n);if (!extension_loaded(posix)) die(posix扩展未安装\n);echo 父进程 PID: . posix_getpid() . \n;$pid pcntl_fork();if ($pid -1) {die(fork失败\n);} elseif ($pid 0) {echo 子进程 PID: . posix_getpid() . , 父进程 PID: . posix_getppid() . \n;for ($i 0; $i 3; $i) {echo 子进程工作... {$i}\n;sleep(1);}exit(0);} else {echo 创建了子进程 PID: $pid\n;pcntl_wait($status);echo 子进程已结束\n;}?多进程并行处理任务。phpfunction parallelProcess(array $tasks, int $workerCount 4): void{$chunks array_chunk($tasks, ceil(count($tasks) / $workerCount));$children [];foreach ($chunks as $chunkId $taskList) {$pid pcntl_fork();if ($pid -1) die(fork失败\n);elseif ($pid 0) {echo Worker $chunkId 开始处理 . count($taskList) . 个任务\n;foreach ($taskList as $task) {echo Worker $chunkId 处理: $task\n;sleep(1);}exit(0);} else {$children[] $pid;}}foreach ($children as $pid) {pcntl_waitpid($pid, $status);}echo 所有任务完成\n;}$tasks range(1, 20);parallelProcess($tasks, 4);?进程池控制并发数量。phpclass ProcessPool{private int $maxWorkers;private array $workers [];public function __construct(int $maxWorkers 4){$this-maxWorkers $maxWorkers;}public function submit(callable $task, array $args []): void{$this-waitForSlot();$pid pcntl_fork();if ($pid -1) throw new RuntimeException(fork失败);elseif ($pid 0) {exit($task(...$args) ? 0 : 1);} else {$this-workers[$pid] true;}}public function wait(): void{foreach ($this-workers as $pid $_) {pcntl_waitpid($pid, $status);}$this-workers [];}private function waitForSlot(): void{while (count($this-workers) $this-maxWorkers) {$pid pcntl_wait($status);unset($this-workers[$pid]);}}}$pool new ProcessPool(3);for ($i 1; $i 10; $i) {$pool-submit(function ($id) {echo 进程 . posix_getpid() . 执行任务 #$id\n;sleep(rand(1, 2));return true;}, [$i]);}$pool-wait();echo 全部完成\n;?多进程编程需要注意几个问题。子进程会继承父进程的文件描述符和数据库连接。进程退出前要清理资源。信号处理要做好避免出现僵尸进程。多进程适合数据采集、日志处理、批量计算等场景。