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

PHP 异步IO扩展包 AsyncIO v2.0.0 发布

概述

AsyncIO 基于 PHP Fiber 和 Workerman 实现的高性能异步 IO 扩展包,提供类似 Python asyncio 的 API 和功能。

特性

  • 🚀 基于 PHP Fiber - 原生协程支持,性能卓越

  • ⚡ 完全事件驱动 - 零轮询,充分利用 Workerman 高性能

  • 🎯 并发控制 - gather, wait_for, 任务管理

  • ⏰ 精确定时 - < 0.1ms 延迟,Timer 事件驱动

  • 🛡️ 异常处理 - 完整的错误传播和处理

  • 📦 简洁API - 类似 Python asyncio 的使用体验

安装

composer require pfinalclub/asyncio

要求

  • PHP >= 8.1 (需要 Fiber 支持)

  • Workerman >= 4.1

快速开始

基础示例

<?php
require_once__DIR__ . '/vendor/autoload.php';usefunctionPfinalClub\Asyncio\{run, sleep};// 定义一个异步函数
function hello_world(): mixed
{echo"Hello\n";sleep(1); // 异步睡眠 1 秒echo"World\n";return"Done!";
}// 运行主函数
$result = run(hello_world(...));
echo"Result: {$result}\n";

并发任务

<?php
usefunctionPfinalClub\Asyncio\{run, create_task, gather, sleep};function task1(): string
{echo"Task 1 开始\n";sleep(2);echo"Task 1 完成\n";return"结果 1";
}function task2(): string
{echo"Task 2 开始\n";sleep(1);echo"Task 2 完成\n";return"结果 2";
}function main(): array
{// 创建任务$t1 = create_task(task1(...));$t2 = create_task(task2(...));// 并发等待所有任务完成$results = gather($t1, $t2);return $results; // ['结果 1', '结果 2']
}run(main(...));

超时控制

<?php
usefunctionPfinalClub\Asyncio\{run, wait_for, sleep};
usePfinalClub\Asyncio\TimeoutException;function slow_task(): string
{sleep(5);return"完成";
}function main(): void
{try {// 最多等待 2 秒$result = wait_for(slow_task(...), 2.0);echo"结果: {$result}\n";} catch (TimeoutException $e) {echo"任务超时: {$e->getMessage()}\n";}
}run(main(...));

任务管理

<?php
usefunctionPfinalClub\Asyncio\{run, create_task, await, sleep};function background_task(string $name): string
{for ($i = 1; $i <= 5; $i++) {echo"{$name}: 步骤 {$i}\n";sleep(0.5);}return"{$name} 完成";
}function main(): void
{// 创建多个后台任务$task1 = create_task(fn() => background_task("任务A"));$task2 = create_task(fn() => background_task("任务B"));// 等待一段时间sleep(2);// 检查任务状态echo"任务1 完成: " . ($task1->isDone() ? "是" : "否") . "\n";echo"任务2 完成: " . ($task2->isDone() ? "是" : "否") . "\n";// 等待任务完成$result1 = await($task1);$result2 = await($task2);echo"{$result1}, {$result2}\n";
}run(main(...));

API 参考

核心函数

run(callable $main): mixed

运行主函数直到完成并返回结果。这是程序的主入口点。

$result = run(my_function(...));
create_task(callable $callback, string $name = ''): Task

创建并调度一个任务,立即开始执行。

$task = create_task(my_function(...), 'my-task');
async(callable $callback, string $name = ''): Task

create_task 的别名,更符合异步编程习惯。

$task = async(my_function(...));
sleep(float $seconds): void

异步睡眠指定的秒数。必须在 Fiber 上下文中调用。

sleep(1.5); // 睡眠 1.5 秒
await(Task $task): mixed

等待任务完成并返回结果。

$result = await($task);
gather(Task ...$tasks): array

并发运行多个任务并等待它们全部完成。

$results = gather($task1, $task2, $task3);
wait_for(callable|Task $awaitable, float $timeout): mixed

等待任务完成,如果超时则抛出 TimeoutException。

try {$result = wait_for(my_task(...), 5.0);
} catch (TimeoutException $e) {echo "超时!\n";
}

事件循环

get_event_loop(): EventLoop

获取当前事件循环实例。

$loop = get_event_loop();

Task 类

isDone(): bool

检查任务是否已完成。

getResult(): mixed

获取任务结果(如果任务未完成会抛出异常)。

cancel(): bool

取消任务。

addDoneCallback(callable $callback): void

添加任务完成时的回调。

Future 类

Future 表示一个未来的结果,可以手动设置。

$future = create_future();// 在某处设置结果
$future->setResult("结果");// 等待结果
$result = await_future($future);

高级用法

HTTP 客户端

use functionPfinalClub\Asyncio\{run, create_task, gather};
usePfinalClub\Asyncio\Http\AsyncHttpClient;function main(): void
{$client = new AsyncHttpClient(['timeout' => 10]);// 单个请求$response = $client->get('https://api.example.com/users');echo"Status: {$response->getStatusCode()}\n";echo"Body: {$response->getBody()}\n";// 并发请求$task1 = create_task(fn() => $client->get('https://api.example.com/users/1'));$task2 = create_task(fn() => $client->get('https://api.example.com/users/2'));$task3 = create_task(fn() => $client->get('https://api.example.com/users/3'));$responses = gather($task1, $task2, $task3);foreach ($responses as $response) {echo"Status: {$response->getStatusCode()}\n";}
}run(main(...));

监控工具

use functionPfinalClub\Asyncio\{run, create_task, gather};
usePfinalClub\Asyncio\Monitor\AsyncioMonitor;function main(): void
{$monitor = AsyncioMonitor::getInstance();// 创建任务$tasks = [create_task(fn() => my_task1()),create_task(fn() => my_task2()),];gather(...$tasks);// 显示监控报告echo $monitor->report();// 导出 JSONecho $monitor->toJson();
}run(main(...));

调试器

use functionPfinalClub\Asyncio\run;
usePfinalClub\Asyncio\Debug\AsyncioDebugger;function main(): void
{$debugger = AsyncioDebugger::getInstance();$debugger->enable();// 你的代码...// 显示调用链echo $debugger->visualizeCallChain();// 显示报告echo $debugger->report();
}run(main(...));

与 v1.x 的区别

主要变更

v1.x (Generator)

v2.0 (Fiber)

function f(): \Generatorfunction f(): mixed
yield sleep(1)sleep(1)
yield $taskawait($task)
yield gather(...)gather(...)
run(generator())run(callable)

http://www.dtcms.com/a/523758.html

相关文章:

  • 《信息系统项目管理师》案例分析题及解析模拟题5
  • Jenkins上实现CI集成软件信息Teams群通知案例实现。
  • ZYNQ平台中断服务函数中的变量不加volatile修饰导致的奇怪问题解决
  • 2026年UX/UI五大趋势:AI、AR与包容性设计将重新定义用户体验
  • 网站做跳转自己建网站卖鞋
  • 百度网站服务器外贸网站优化
  • 应广单片机烧录跳线J7专用PCB使用说明
  • Java 前后端加密与编码技术:从概念到实战场景全解析
  • 拒绝笨重,一款轻量、极致简洁的开源接口管理工具 - PostIn
  • 建设银行信用卡网站是哪个茶叶seo网站推广与优化方案
  • vant van-uploader上传file文件;回显时使用imageId拼接路径
  • Java常用中间件整理讲解——Redis,RabbitMQ
  • JavaEE初阶7.0
  • 从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
  • 个人网站收款google play 应用商店
  • _撸猫websocket服务器端,手机远程服务端
  • 【论文精读】FDGaussian:基于几何感知扩散模型的单图快速高斯溅射 3D 重建
  • 功防世界-Web-bug
  • 做网站能拿多少钱平面设计 网站推荐
  • REST介绍,实质,六大约束,优缺点(数据冗余问题,身份验证困难(解决方式 -- JWT+集中式认证服务,使用代理))
  • Snapchat Data Scientist 面试经验分享|从 OA 到 Final Round 全流程复盘
  • 消息队列集群——RabbitMQ
  • 初识C语言14.动态内存管理
  • ks2e做网站高端品牌设计
  • 华为od-22届考研-C++面经
  • Win10 系统构建仿真 NVIDIA Jetson Orin Nano 环境部署 YOLOv8 模型
  • 英文网站开发付费下插件wordpress
  • 【面板数据】汽车之家及懂车帝汽车配置信息数据集(1999-2025.4)
  • Slotted Aloha
  • 「赤兔」Chitu 框架深度解读(六):剖析 Attention 机制后端实