php怎么实现多线程
PHP 实现多线程的方法
PHP 本身是单线程语言,但可以通过扩展或特定方式模拟多线程行为。以下是几种常见实现方式:
使用 PCNTL 扩展(进程控制)
PCNTL 是 PHP 的进程控制扩展,允许创建子进程模拟多线程:
if (!function_exists('pcntl_fork')) {
die('PCNTL extension not available');
}
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程代码
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程代码
sleep(2);
echo "Child process done\n";
exit(0);
}
注意:PCNTL 只能在 CLI 模式下运行,不支持 Web 环境。
使用 pthreads 扩展(真正的多线程)
pthreads 是为 PHP 提供的多线程扩展,需安装 ZTS(Zend Thread Safety)版本的 PHP:
class MyThread extends Thread {
public function run() {
echo "Thread running\n";
sleep(1);
}
}
$thread = new MyThread();
$thread->start();
$thread->join();
要求:
- PHP 7.2+(pthreads v3 仅支持 PHP 7)
- 编译时启用 ZTS(
--enable-zts) - 仅限 CLI 模式使用
使用多进程模拟(适合 Web 环境)
通过 exec() 或 shell_exec() 调用 CLI 脚本:
// 主脚本
$scriptPath = __DIR__.'/worker.php';
exec("php $scriptPath > /dev/null &");
worker.php:
<?php
file_put_contents('log.txt', date('Y-m-d H:i:s')." Worker running\n", FILE_APPEND);
使用消息队列(Gearman/RabbitMQ)
通过消息队列实现任务分发:
$client = new GearmanClient();
$client->addServer();
$client->doBackground('process_data', json_encode(['task' => 'example']));
Worker 端:
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('process_data', function($job) {
$data = json_decode($job->workload(), true);
// 处理任务
});
while ($worker->work());
使用 ReactPHP 或 Amp 异步框架
基于事件循环实现并发:
$loop = React\EventLoop\Factory::create();
$loop->addTimer(0.1, function () {
echo "Async task 1\n";
});
$loop->addTimer(0.2, function () {
echo "Async task 2\n";
});
$loop->run();
注意事项
- Web 环境下推荐使用消息队列或异步任务
- CLI 环境下可选择 PCNTL 或 pthreads
- 共享资源需使用同步机制(如 Semaphore)
- Windows 系统对多线程支持有限,建议在 Linux 环境下使用
根据具体需求选择合适方案,Web 应用通常推荐消息队列方案,后台处理可选择多进程或多线程方案。







