php实现同步异步
PHP 实现同步与异步处理
同步处理
同步处理是代码按顺序执行,每个操作完成后再执行下一个。PHP 默认以同步方式运行。
// 同步示例
function syncTask() {
echo "Task 1\n";
echo "Task 2\n"; // Task 2 会在 Task 1 完成后执行
}
syncTask();
异步处理
PHP 本身是单线程语言,但可通过以下方式模拟异步:

1. 多进程(PCNTL 扩展)
$pid = pcntl_fork();
if ($pid == -1) {
die("Fork failed");
} elseif ($pid) {
// 父进程
pcntl_wait($status); // 可选:等待子进程结束
} else {
// 子进程(异步执行)
sleep(2);
echo "Async task completed\n";
exit;
}
2. 消息队列(如 RabbitMQ)

// 生产者(发送异步任务)
$connection = new AMQPConnection(['host' => 'localhost']);
$channel = $connection->channel();
$channel->queue_declare('async_queue');
$channel->basic_publish(new AMQPMessage('Task data'), '', 'async_queue');
3. 协程(Swoole 扩展)
Swoole\Runtime::enableCoroutine();
go(function () {
co::sleep(1); // 非阻塞睡眠
echo "Async coroutine\n";
});
echo "Main script\n"; // 先输出
4. 忽略客户端(快速响应)
ignore_user_abort(true); // 忽略客户端断开
ob_start();
echo "Response sent to client";
header('Connection: close');
header('Content-Length: ' . ob_get_length());
ob_end_flush();
flush();
// 继续执行后台任务
file_put_contents('async.log', 'Task completed', FILE_APPEND);
关键区别
- 同步:阻塞式,适合需要严格顺序的任务。
- 异步:非阻塞式,适合耗时操作(如邮件发送、文件处理)。
注意事项
- PCNTL 和 Swoole 需安装扩展。
- 消息队列需额外服务支持(如 RabbitMQ)。
- 异步日志建议记录执行状态以便排查问题。






