chemem / asyncify
一个运行同步PHP函数异步的包。
Requires
- php: >=7.2
- chemem/bingo-functional: ~2
- react/child-process: ~0
- react/promise: ~2
Requires (Dev)
- ergebnis/composer-normalize: ~2
- friendsofphp/php-cs-fixer: ~2 || ~3
- phpunit/phpunit: ~8 || ~9
- react/async: ~3 || ~4
README
一个简单的PHP库,可以异步运行你的同步PHP函数。
要求
- PHP 7.2或更高版本
理由
PHP是一个主要同步(阻塞)运行时。异步性(可以通过ReactPHP和其他类似套件实现)是减轻在日常工作编程中突出显示的I/O操作困难的一种有效方法。在PHP中将阻塞和非阻塞例程结合起来可能是一个棘手的问题:如果随意尝试,可能会导致不美观的结果。
创建和维护asyncify
的动力是结合阻塞和非阻塞PHP。建立在ReactPHP之上,asyncify
是一个工具,允许在事件驱动的I/O环境中运行阻塞PHP函数。
安装
尽管可以克隆仓库,但Composer仍然是安装asyncify
的最佳工具。要使用Composer安装此包,请在选择的控制台中输入以下内容。
$ composer require chemem/asyncify
用法
如果您想采取函数式编程方法,通过currying辅助,以下示例应该足够。
use function Chemem\Asyncify\call; $call = call('file_get_contents', ['foo.txt']) ->then( function (?string $contents) { echo $contents; }, function (\Throwable $err) { echo $err->getMessage(); } );
或者
如果您更喜欢更传统的OOP方法,下面的片段应该合适。
use Chemem\Asyncify\Async; $exec = Async::create() ->call('file_get_contents', ['foo.txt']) ->then( function (?string $contents) { echo $contents; }, function (\Throwable $err) { echo $err->getMessage(); } );
示例目录包含更细致的库使用方法,我建议您查看。
限制
-
asyncify
并非万能良药,但能够异步执行大量阻塞调用。就目前而言,该库无法处理无法序列化的输入和输出。其基本的异步函数应用原语call()
几乎只与通过自动加载机制导入的本地语言函数和lambda的字符串编码一起使用。 -
库无法解析闭包。所有可执行的任意代码应放置在仅包含立即可调用匿名函数的字符串中,其格式为
(function (...$args) { /* signature */ })
。
API参考
对象
namespace Chemem\Asyncify; class Async { /* Methods */ public static create( ?string $autoload = null [, ?React\EventLoop\LoopInterface $rootDir = null ] ) : Async; public function call( string $function [, array $args ] ) : React\Promise\PromiseInterface; }
Async::__construct
- 创建一个新的Async对象实例
Async::call
- 异步调用同步(阻塞)PHP函数
函数
namespace Chemem\Asyncify; call ( string $func [, array $args [, ?string $autoload = null [, ?React\EventLoop\LoopInterface $args = null ] ] ] ) : React\Promise\PromiseInterface;
call
- 启动异步函数调用的curried函数
注意:
asyncify
使用由调用它的项目的根目录中的自动加载文件。
处理问题
需要时,请在GitHub上创建一个问题,或向lochbm@gmail.com发送电子邮件。
贡献
如果您喜欢这个项目,或者想为我继续工作提供更多动力,请考虑给我买杯咖啡。