当前位置: 首页 > news >正文

PHP并发处理与协程入门

PHP并发处理与协程入门

说到PHP并发,传统PHP-FPM每个请求一个进程。但Swoole扩展让PHP有了协程能力。今天说说PHP中协程和并发处理。

生成器是协程的基础。每个yield点都可以暂停和恢复。

```php
class Task
{
private Generator $coroutine;
private string $name;
private bool $finished = false;

public function __construct(string $name, Generator $coroutine)
{
$this->name = $name;
$this->coroutine = $coroutine;
}

public function run(): void
{
if ($this->finished) return;
if ($this->coroutine->valid()) {
$this->coroutine->send(null);
} else {
$this->finished = true;
}
}

public function isFinished(): bool
{
return $this->finished || !$this->coroutine->valid();
}

public function getName(): string { return $this->name; }
}

class Scheduler
{
private array $tasks = [];

public function add(Task $task): void
{
$this->tasks[] = $task;
}

public function run(): void
{
while (!empty($this->tasks)) {
$task = array_shift($this->tasks);
$task->run();

if (!$task->isFinished()) {
$this->tasks[] = $task;
}
}
}
}

function task1(): Generator
{
for ($i = 1; $i <= 3; $i++) {
echo "任务1: 第{$i}步\n";
yield;
}
}

function task2(): Generator
{
for ($i = 1; $i <= 2; $i++) {
echo "任务2: 第{$i}步\n";
yield;
}
}

$scheduler = new Scheduler();
$scheduler->add(new Task('A', task1()));
$scheduler->add(new Task('B', task2()));
$scheduler->run();
?>

Swoole协程的用法。

```php
// Swoole协程
use function Swoole\Coroutine\go;
use function Swoole\Coroutine\run;

run(function () {
go(function () {
Swoole\Coroutine::sleep(1);
echo "协程1完成\n";
});

go(function () {
Swoole\Coroutine::sleep(2);
echo "协程2完成\n";
});

echo "主协程\n";
});
?>

协程在IO密集场景下优势明显。

```php
function simulateIO(string $name, int $ms): Generator
{
echo "{$name}: 开始\n";
yield;
echo "{$name}: 完成\n";
}

$scheduler = new Scheduler();
$scheduler->add(new Task('请求API1', simulateIO('请求API1', 2000)));
$scheduler->add(new Task('请求API2', simulateIO('请求API2', 1000)));

$start = microtime(true);
$scheduler->run();
echo "总耗时: " . round((microtime(true) - $start) * 1000) . "ms\n";
?>

协程在IO操作时让出CPU,等IO完成后再恢复执行。这让单进程可以处理大量并发连接。生成器实现的协程虽然不能实现真正的并行,但在IO密集场景下可以提升性能。生产环境建议用Swoole扩展。

http://www.rkmt.cn/news/1491971.html

相关文章:

  • 成本降87.5%:模具冲头助力3C企业年省28万 - 速递信息
  • OPTICS聚类原理与地理数据实战:破解密度不均聚类难题
  • 无人机管理系统|完整源码交付,支持私有化部署与定制开发
  • 鼻毛剪刀哪个牌子好?鼻毛器哪个牌子最好用?2026鼻毛修剪器第一名
  • 普元EOS平台深度体验:除了快速开发,它的监控治理工具EOS Governor到底有多强?
  • 51单片机控制16×16点阵LED,支持自定义文字滚动显示(含仿真+代码+文档)
  • 逆向工程师的利器:手把手教你将OLLVM-14.x集成到Android NDK(Windows 10环境)
  • 类风湿关节炎 干细胞试验进展怎么样了?
  • 别再只当LCD驱动器了!解锁STM32 FMC的‘隐藏技能’:连接AD7606、OLED等并行总线设备
  • 存量老旧视觉项目智能化升级改造(五):人工全检工位改造 TVA 落地指南|三级报价模板 + 标准工期 + 全维度避坑清单
  • 从GISInternals官网到命令行:一份给Windows用户的GDAL 3.x 最新版避坑配置指南
  • Vue3后台模板:TypeScript + Element Plus 实现多标签页管理界面,零配置开箱即用
  • 小程序毕业设计-基于协同过滤算法的运动场馆服务平台微信小程序基于Springboot+微信小程序的协同过滤算法的运动场馆服务平台设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 别再只会用二极管了!手把手教你用MOSFET搭建一个低压大电流同步整流Buck电路
  • 从“四皇后问题”到“八皇后”:一个Python递归解法,帮你彻底搞懂回溯搜索
  • 让AI成为肌肉记忆:第二自然人机协作工作流
  • 从一根电缆的延时算起:深入理解1553B总线100米长度限制背后的工程考量
  • 别再只会用cv2.blur了!OpenCV均值滤波的3个实战场景与内核大小选择避坑指南
  • 颠覆认知的6大经典数据悖论
  • 避坑指南:你的细胞类型注释靠谱吗?分享一套基于DotPlot和特异性基因的验证流程
  • REST 接口规范
  • 告别加班!用普元EOS Studio拖拽式开发,一天搞定一个审批模块(附实战截图)
  • 从V1到V3+:一文搞懂DeepLab系列的核心演进与PyTorch实战要点
  • 如何优化Spring Boot应用的第三方API调用
  • 莱阳SEO优化公司|品牌搜索曝光升级,莱阳网站优化公司能力解析 - 招财兔数字员工
  • 滨州滨城区黄金回收 卖黄金怎么不被坑 - 润富黄金回收
  • Hindsight 内存爆炸 4 个词排查清单:9,284 条 6 成是 SSH 调试日志——Agent 标签系统的实战复盘
  • 预训练 vs 后训练:用“培养一个员工“讲清大模型是怎么炼成的
  • FusionCompute CNA 8.0.0部署实战:在VMware里规划一个“生产级”测试环境(含IP、资源规划表)
  • 拒绝盲从!2026公考培训四强测评:粉笔师资与环境实测报告