php异步实现
PHP 异步实现方法
PHP 本身是同步阻塞的语言,但可以通过以下方式实现异步操作:
多进程(PCNTL 扩展)
使用 pcntl_fork 创建子进程处理异步任务:
$pid = pcntl_fork();
if ($pid == -1) {
die('fork failed');
} elseif ($pid) {
// 父进程继续执行
pcntl_wait($status); // 可选:等待子进程结束
} else {
// 子进程执行异步任务
sleep(5);
file_put_contents('async.log', 'Done');
exit;
}
消息队列(Redis/RabbitMQ)
通过消息队列解耦处理:
// 生产者
$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);
// 处理异步任务
}
Swoole 扩展
高性能协程框架示例:
$server = new Swoole\Http\Server("0.0.0.0", 9501);
$server->on('Request', function($request, $response) {
// 异步任务
$task_id = $server->task(['type' => 'email']);
$response->end("Task started");
});
$server->on('Task', function($server, $task_id, $data) {
// 处理耗时任务
sleep(2);
return "Done";
});
$server->start();
Gearman 分布式任务系统
工作流程实现:
$client = new GearmanClient();
$client->addServer();
$client->doBackground('send_email', $email_data);
// Worker端
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('send_email', function($job) {
$data = $job->workload();
// 处理邮件发送
});
while ($worker->work());
ReactPHP 事件驱动
非阻塞 I/O 示例:
$loop = React\EventLoop\Factory::create();
$loop->addTimer(2.0, function () {
echo "Async task after 2 seconds\n";
});
$loop->run();
注意事项
- 进程管理需注意僵尸进程回收
- 消息队列需考虑消息持久化
- Swoole 需要安装 PHP 扩展
- 长时间运行脚本需处理内存泄漏
选择方案时应根据:
- 任务复杂度
- 系统资源
- 性能要求
- 运维成本







