PHP异步编程实战:Swoole协程与多进程高效应用
1. Swoole协程基础用法
安装Swoole扩展后,可以编写协程风格的异步代码:
<?php
// 安装Swoole:pecl install swoole
Corun(function() {
$start = microtime(true);
go(function() {
Co::sleep(1);
echo "任务1完成n";
});
go(function() {
Co::sleep(2);
echo "任务2完成n";
});
echo "总耗时: ".(microtime(true)-$start)."秒n";
});
// 输出:总耗时: 0.0003秒 → 任务1完成 → 任务2完成
?>
2. 协程HTTP客户端实战
并发请求多个API接口:
<?php
Corun(function() {
$urls = [
'https://api.example.com/user/1',
'https://api.example.com/product/123',
'https://api.example.com/order/456'
];
$results = [];
$wg = new CoWaitGroup;
foreach ($urls as $url) {
$wg->add();
go(function() use ($url, $wg, &$results) {
$client = new CoHttpClient(parse_url($url, PHP_URL_HOST), 443, true);
$client->get($url);
$results[$url] = $client->body;
$wg->done();
});
}
$wg->wait();
print_r($results);
});
?>
3. PHP多进程编程方案
使用pcntl扩展实现多进程:
<?php
$workers = [];
$urls = ['url1', 'url2', 'url3'];
foreach ($urls as $url) {
$pid = pcntl_fork();
if ($pid == -1) {
die('创建子进程失败');
} elseif ($pid == 0) {
// 子进程处理
$result = process_url($url);
exit(0);
} else {
$workers[$pid] = true;
}
}
// 等待所有子进程结束
while (count($workers) {
$status = 0;
$pid = pcntl_wait($status);
if ($pid > 0) {
unset($workers[$pid]);
}
}
?>
性能对比:同步 vs 协程 vs 多进程
方式 | 100次HTTP请求耗时 | 内存占用 | 适用场景 |
---|---|---|---|
同步阻塞 | 12.3秒 | 8MB | 简单脚本 |
Swoole协程 | 1.2秒 | 12MB | 高并发IO |
多进程 | 2.1秒 | 50MB | CPU密集型 |
4. 生产环境最佳实践
- 协程池: 复用协程减少创建开销
- 进程管理: 使用Supervisor监控多进程
- 错误处理: 协程内异常要单独捕获
- 连接池: 数据库/Redis连接需要协程化
通过合理选择异步编程方案,PHP应用性能可提升10倍以上,特别适合微服务、即时通讯等高并发场景。