
PHP fiber示例多任务协作
在PHP8.1
中发布了一项重要功能有栈协程Fiber
,相比原来的Generator(无栈协程),它无需自己实现调度器,可在任意地方中断执行,不需要改变自己的返回类型(生成器需要一直返回Generator
)。让我们写几简单使用的程序,熟悉下Fiber
类的使用方法。
什么是Fiber
虽然Fiber
不是Thread
,但它们可以帮助您的代码更有效地更快地完成多项任务,这从表面上看可能看起来像线程。Fiber
的作用是允许您并行发起多个请求,然后等待所有请求完成(以任何顺序),从而让您的代码花更少的时间等待外部资源。
要使用Fiber
,您的情况必须满足以下几个条件:
必须处理PHP
以外的东西
您的资源必须位于 PHP 外部,以便可以与 PHP 代码并行处理。 PHP 仍然是单线程的,因此当特定的纤程正在执行时,脚本中的任何其他内容都不会执行。这意味着实际工作需要卸载到单独的进程中。满足这种要求的常见场景是网络请求或子流程。
需要能够以不阻止脚本执行的方式请求外部资源
例如,复杂的数据库查询不满足此要求,因为无法在查询运行时继续脚本并稍后收集结果。
Fiber类摘要
基础用法
编写一个使用基本的挂起、恢复、返回的程序。
以上示例会输出:
多任务
Fiber
主要目的就是并行处理多个任务,在不同任务之间中断恢复即可快速完成所有任务。
同时读取多目录文件
在没有fiber
之前可能读取多个目录只能同步一个个读,像下面这样的。
如何使用fiber
改造呢,把两次读取当成两个任务,一个任务相当于一个fiber
。改造之后的代码。
上面的示例可能看起来提升不是很明显,试想下如果换成远程http
请求,ffmpeg
视频转换呢。
发送多次Http请求
ffmpeg处理外部视频
下面是未使用Fiber
处理6次视频的示例和处理的时间.
使用fiber
之后,能让整成个程序速度提升30%。这是使用fiber
后的代码。
打印的结果.
终结
相信你看完之后对php
的fiber
有个大概的了解和基本用法的使用以及它的使用场景。你可以从许多项目学习更深层的使用技巧。推荐你学习下Amp异步框架,你还可以学习事件循环框架revolt。