php异步实现
PHP 异步实现方法
PHP 传统上是同步执行的,但可以通过以下方式实现异步操作:
多进程(PCNTL 扩展)
使用 pcntl_fork 创建子进程执行异步任务:
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程继续执行
pcntl_wait($status); // 可选:等待子进程结束
} else {
// 子进程执行异步任务
sleep(5);
file_put_contents('async.log', 'Done');
exit;
}
消息队列(如 RabbitMQ/Redis)
通过消息队列解耦任务执行:
// 生产者
$connection = new AMQPConnection(['host' => 'localhost']);
$channel = $connection->channel();
$channel->queue_declare('async_tasks');
$msg = new AMQPMessage('Task data');
$channel->basic_publish($msg, '', 'async_tasks');
// 消费者需单独运行
Swoole 扩展
高性能异步框架示例:
$server = new Swoole\Http\Server("0.0.0.0", 9501);
$server->on('request', function ($request, $response) {
// 异步任务
$task_id = $server->task("async data");
$response->end("Task dispatched");
});
$server->start();
Generator 协程(PHP 5.5+)
使用 yield 实现协程风格的异步:
function asyncTask() {
yield from someAsyncOperation();
yield from anotherAsyncOperation();
}
$scheduler = new Scheduler();
$scheduler->newTask(asyncTask());
$scheduler->run();
ReactPHP 事件循环
事件驱动编程示例:
$loop = React\EventLoop\Factory::create();
$loop->addTimer(1.0, function () {
echo "Async timer\n";
});
$loop->run();
异步 HTTP 请求
使用 Guzzle 异步客户端:
$client = new GuzzleHttp\Client();
$promise = $client->getAsync('http://example.com')
->then(function ($response) {
echo $response->getBody();
});
$promise->wait();
注意事项
- 进程隔离:多进程方式需注意内存隔离
- 错误处理:异步场景需完善异常捕获机制
- 资源清理:长时间运行需管理连接/文件资源
- 扩展依赖:部分方案需安装特定PHP扩展
选择方案时应考虑:任务类型(CPU/IO密集型)、执行时长、系统环境等因素。短时任务适合进程/协程,分布式系统适合消息队列,高性能服务建议Swoole/ReactPHP。







