php如何实现异步
PHP 实现异步的常见方法
使用多进程(PCNTL 扩展)
PCNTL 扩展允许创建子进程处理异步任务。需确保 PHP 编译时启用了 --enable-pcntl。
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程继续执行
pcntl_wait($status); // 可选:等待子进程结束
} else {
// 子进程执行异步任务
sleep(5);
file_put_contents('async.log', 'Task completed');
exit;
}
消息队列(如 RabbitMQ/Redis)
通过消息队列解耦任务处理,生产者发送消息后立即返回,消费者异步处理。

// 生产者示例(使用 Redis)
$redis = new Redis();
$redis->connect('127.0.0.1');
$redis->lPush('task_queue', json_encode(['task' => 'async_work']));
// 消费者脚本(常驻运行)
while ($task = $redis->rPop('task_queue')) {
$data = json_decode($task, true);
// 处理任务...
}
定时任务(Cron)
将耗时任务写入脚本,通过 Cron 定时触发。适用于不要求实时性的场景。
# 在 crontab 中添加(每分钟执行一次)
* * * * * php /path/to/async_task.php
协程(Swoole 扩展)
Swoole 提供了协程支持,能实现非阻塞 I/O 操作。

Swoole\Runtime::enableCoroutine();
go(function () {
$result = file_get_contents('http://example.com'); // 异步 HTTP 请求
echo $result;
});
异步 HTTP 请求(Guzzle 异步客户端)
使用 Guzzle 的异步特性发送非阻塞请求。
$client = new GuzzleHttp\Client();
$promise = $client->getAsync('http://example.com');
$promise->then(
function ($response) { echo $response->getBody(); },
function ($exception) { echo $exception->getMessage(); }
);
$promise->wait(); // 可选:等待所有请求完成
数据库异步操作(如 MySQLi 异步查询)
部分数据库扩展支持异步模式。
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$mysqli->query('SELECT * FROM large_table', MYSQLI_ASYNC);
// 主程序继续执行...
$links = $errors = $reject = [$mysqli];
mysqli_poll($links, $errors, $reject, 0); // 检查结果是否就绪
注意事项
- 多进程需处理僵尸进程(
pcntl_signal注册信号处理器)。 - 消息队列需考虑消息持久化和重试机制。
- Swoole 扩展需安装并启用,适用于高性能场景。
- 异步 HTTP 请求可能受限于 PHP 的脚本执行超时时间。






