php如何实现多进程
PHP 多进程实现方法
PHP 本身是单线程语言,但可以通过扩展或系统调用来实现多进程。以下是几种常见的实现方式:
pcntl 扩展
pcntl 是 PHP 的多进程扩展,适用于 Unix-like 系统:
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程
echo "Child process\n";
exit(0);
}
需要注意 pcntl 扩展只能在 CLI 模式下运行,不支持 Web 服务器环境。
popen/proc_open 函数
通过系统命令创建子进程:
$handle = popen('/path/to/script.php', 'r');
// 或
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$process = proc_open('/path/to/script.php', $descriptorspec, $pipes);
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($process) {
echo "Child process\n";
});
$process->start();
Swoole\Process::wait();
多进程注意事项
进程间通信可以使用共享内存、消息队列、管道等方式:
// 共享内存示例
$shm_key = ftok(__FILE__, 't');
$shm_id = shmop_open($shm_key, "c", 0644, 100);
shmop_write($shm_id, "Hello", 0);
需要处理僵尸进程问题,父进程应调用 pcntl_wait 或 pcntl_waitpid 回收子进程。
多进程程序应避免竞态条件,必要时使用信号量或文件锁:
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) {
// 临界区代码
flock($fp, LOCK_UN);
}
fclose($fp);
对于高并发需求,建议考虑更专业的解决方案如 Swoole 或 ReactPHP。







