php 实现异步
PHP 实现异步的方法
PHP 本身是同步执行的脚本语言,但可以通过以下几种方式实现异步操作:
多进程方式(pcntl_fork)
利用 pcntl_fork 创建子进程执行异步任务,主进程继续执行后续代码。需要注意 pcntl 扩展仅在 CLI 模式下可用。
$pid = pcntl_fork();
if ($pid == -1) {
die('fork failed');
} elseif ($pid) {
// 父进程
pcntl_wait($status); // 可选:等待子进程结束
} else {
// 子进程执行异步任务
sleep(5);
file_put_contents('async.log', 'Task done');
exit(0);
}
消息队列(Redis/Beanstalkd)
通过消息队列将任务放入队列,由后台 worker 异步处理。例如使用 Redis 的 RPUSH 和 BLPOP:
// 生产者
$redis = new Redis();
$redis->connect('127.0.0.1');
$redis->rPush('task_queue', json_encode(['task' => 'async_work']));
// 消费者(worker)
while (true) {
$task = $redis->blPop('task_queue', 0);
processTask(json_decode($task[1], true));
}
协程(Swoole)
使用 Swoole 扩展的协程实现高性能异步编程:
Swoole\Runtime::enableCoroutine();
go(function () {
$client = new Swoole\Coroutine\Http\Client('example.com', 80);
$client->get('/');
echo $client->body;
});
定时任务(Cron)
通过 Cron 定时执行 PHP 脚本处理异步任务:
# 每分钟执行一次
* * * * * /usr/bin/php /path/to/async_task.php
第三方库(Guzzle Async)
使用 Guzzle 的异步 HTTP 请求:

$client = new GuzzleHttp\Client();
$promise = $client->getAsync('http://example.com');
$promise->then(
function ($response) { echo $response->getBody(); },
function ($reason) { echo $reason; }
);
$promise->wait(); // 可选:等待完成
注意事项
- Web 环境下避免长时间阻塞,异步任务建议通过队列或定时任务处理。
- 多进程方式需注意僵尸进程回收(
pcntl_wait)。 - Swoole 等扩展需额外安装,但性能最佳。
- 消息队列方案需保证消息可靠性(如 ACK 机制)。






