php实现多进程
PHP 多进程实现方法
PHP 本身是单线程语言,但可以通过扩展或系统调用实现多进程功能。以下是几种常见的实现方式:
pcntl 扩展
pcntl 是 PHP 的多进程扩展,主要用于 Unix-like 系统:
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程
// 执行具体任务
exit();
}
需要注意 pcntl 扩展只能在 CLI 模式下运行,不支持在 Web 服务器环境中使用。
popen/proc_open 函数
通过系统调用创建独立进程:
$handle = popen('/path/to/command 2>&1', 'r');
while (!feof($handle)) {
$output = fgets($handle);
echo $output;
}
pclose($handle);
Gearman 分布式任务系统
使用 Gearman 实现分布式任务处理:
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", function($job) {
return strrev($job->workload());
});
while ($worker->work());
Swoole 扩展
Swoole 提供了更强大的多进程支持:
$process = new Swoole\Process(function(Swoole\Process $worker) {
echo "Child PID: ".$worker->pid."\n";
});
$pid = $process->start();
Swoole\Process::wait();
多进程注意事项
进程间通信需要特别处理,常见方法包括:
- 共享内存 (shmop)
- 消息队列 (msg_* 函数)
- 文件锁
- 套接字通信
多进程程序需要处理僵尸进程问题,及时回收子进程资源。在 PHP 中可以使用 pcntl_signal 安装信号处理器:
pcntl_signal(SIGCHLD, function($signo) {
while (pcntl_waitpid(-1, $status, WNOHANG) > 0);
});
实际应用建议
对于需要长时间运行的后台任务,建议使用专业的进程管理工具如 Supervisor 来管理 PHP 多进程应用。对于简单的并行任务处理,可以考虑使用更高级的抽象如 Laravel 的队列系统。







