sqonk / phext-detach
Detach 是一个库,可以在 PHP 脚本中使用分叉进程并行运行任务。
Requires
- php: ^8
- ext-apcu: *
- ext-pcntl: *
- ext-posix: *
- sqonk/phext-core: ^1.1
Requires (Dev)
- phpstan/phpstan: ^1.9
- phpunit/phpunit: ^9
README
Detach 是一个库,可以在 PHP 脚本中使用分叉进程并行运行任务。它会克隆一个基于父进程的独立进程并执行请求的回调。
它体积小,仅依赖于 PCNTL 和 APCu PHP 扩展以及一些基本的 composer 包。
Detach 还具有极简主义的特点,只包含一组简单的函数和类,无需学习事件系统或架构,可以轻松集成到现有代码结构中。
查看 示例 以获取快速入门指南。
虽然生成的任务可以将数据返回给父任务,但也可以使用通道(Go 语言的通道的松散实现),提供一种简单的方法,允许独立进程之间发送和接收数据。
通道还可以用作逻辑门,通过强制任务等待所需的数据来控制各种任务的执行。
安装
通过 Composer
$ composer require sqonk/phext-detach
更新到 V1.0 之前
版本 1.1 更改了 通道和缓冲通道关闭时返回的值。以前它们返回 NULL
,现在返回常量 CHAN_CLOSED
。这样做是为了清楚地区分有意插入通道的空值和通道关闭。
类似于以下先前编写的代码
while ($value = $chan->get()) { // process value. }
现在应编写如下
while (($value = $chan->get()) !== CHAN_CLOSED) { // process value. }
或者,为了保持更简单的语法,您现在可以使用生成器
// function call.. foreach ($chan->incoming() as $value) { // process value. } // or directly passing the object as the iterator.. foreach ($chan as $value) { // process value. }
从 V0.4 更新
版本 0.5+ 调整了 Dispatcher::map() 的工作方式,使其自动构建并启动 TaskMap,返回映射对象的 ->start()
的结果。其参数也已扩展,可以直接接受各种 TaskMap 配置选项,为 PHP8 的命名参数做准备。
从 V0.3 更新
版本 0.4+ 是从先前版本的重大更新。它将破坏为使用 V0.3 构建的现有代码。
最值得注意的是,之前名为 Channel
的类已被重命名为 BufferedChannel
,并出现了一个新的 Channel
类。您可以在下面了解更多关于这两个类的信息。
此外,在开发后期,用于在任务之间传输数据的基于文件的存储切换到 APCu,现在除了 PCNTL 之外还需要扩展。
文档
API 参考 现已可用。
示例
浏览 示例代码 以获取基本概念快速入门指南。
致谢
Theo Howell
请参阅 Tudor Barbu 在 motanelu/php-thread 上的原始概念 pnctl 线程
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。