当前位置: 首页 > 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.jsqmd.com/news/980245/

相关文章:

  • 成本降87.5%:模具冲头助力3C企业年省28万 - 速递信息
  • Python小说章节自动采集入库工具:含MySQL连接池、去重建表与配置化部署
  • vue3实现的纯前端护肤品商城网站
  • 无人机管理系统|完整源码交付,支持私有化部署与定制开发
  • 手把手教你用Simulink搭建永磁直驱风机并网模型(附单位功率因数控制与弱磁控制仿真)
  • 2026年6月岳阳楼区流量卡“闭眼入”指南:39元电信神卡杀疯了!
  • 鼻毛剪刀哪个牌子好?鼻毛器哪个牌子最好用?2026鼻毛修剪器第一名
  • 普元EOS平台深度体验:除了快速开发,它的监控治理工具EOS Governor到底有多强?
  • LLM多智能体语义传播监控与漂移治理方法
  • UniVidX——基于扩散先验的统一多模态视频生成框架
  • 小程序毕设选题推荐:基于python的档案室档案宝微信小程序基于python的档案室档案宝微信小程序【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 手机拍证件照哪个好2026年专业证件照工具推荐
  • 51单片机控制16×16点阵LED,支持自定义文字滚动显示(含仿真+代码+文档)
  • 别再只当LCD驱动器了!解锁STM32 FMC的‘隐藏技能’:连接AD7606、OLED等并行总线设备
  • 逆向工程师的利器:手把手教你将OLLVM-14.x集成到Android NDK(Windows 10环境)
  • 告别迷茫!工业组态软件选型指南:从Qt、C#到Web,5分钟帮你找到最适合的技术栈
  • 类风湿关节炎 干细胞试验进展怎么样了?
  • 医院HIS药房模块实战避坑系列》之三:公立/私立医院药品调价模式对比:账务处理与行业演进
  • 基于STC89C52的智能洗衣机控制原型:三档面料适配+LCD实时显示+Proteus可运行仿真工程
  • 别再为VC++和LabVIEW报错头疼了!手把手教你搞定USB-CAN分析仪软件安装(附避坑指南)
  • 告别Softmax:YOLOv3的多标签分类与Binary Cross-Entropy Loss实战调优指南
  • XUnity Auto Translator:高效配置智能翻译插件的深度解析与实战指南
  • NCMconverter终极指南:3步解锁网易云音乐加密格式,免费实现ncm到mp3/flac批量转换
  • 从GISInternals官网到命令行:一份给Windows用户的GDAL 3.x 最新版避坑配置指南
  • Vue3后台模板:TypeScript + Element Plus 实现多标签页管理界面,零配置开箱即用
  • STM32F4 CANopen SDO通信避坑指南:心跳关了没?COB-ID算对了吗?
  • 存量老旧视觉项目智能化升级改造(五):人工全检工位改造 TVA 落地指南|三级报价模板 + 标准工期 + 全维度避坑清单
  • 别再买错卡了!Arduino+RC522复制门禁卡全指南:从M1 S50卡到UID卡避坑详解
  • 零基础可跑的MATLAB平面应力FEA代码包,含网格设置、求解与应力可视化
  • 从零到一:拆解一个开源QScada项目(HmiFuncDesigner),搞懂工业组态软件的核心模块设计