edwardstock / forker
此包已被废弃,不再维护。未建议替代包。
PHP POSIX 进程管理器和异步作业处理器
1.0.2
2016-12-19 12:53 UTC
Requires
- php: >=7.0.0
- ext-pcntl: *
- jeremeamia/superclosure: ^2.2.0
- monolog/monolog: ^1.22.0
- php-ds/php-ds: *
- psr/log: *
- react/event-loop: ^0.4.2
Requires (Dev)
- kujira/phpunit-printer: 1.0.1
- phpunit/phpunit: *
This package is not auto-updated.
Last update: 2023-09-17 18:40:07 UTC
README
PHP POSIX 进程管理器和异步 ProcessPool
新闻
-
1.0.2
- 修复进程池并添加了每个 "now" 限制进程数的方法
<?php $pm = new ProcessManager(); $pm->pool(2 /*pool size*/, true /*join processes*/); for($i = 0; $i < 10; $i++) { // when 2 jobs will added to pm queue, they will run, and cleaned after complete // calling $pm->run() manually not needed $pm->add($job); }
-
1.0.1
- 支持在后台函数中使用自定义参数
特性
- 易于创建多进程守护进程
- POSIX 信号分发
- 序列化包含闭包的对象/数组(感谢 SuperClosure)
- 使用共享内存
- 管理 *.pid 文件
使用示例
基本使用
<?php use edwardstock\forker\handler\CallbackTask; use edwardstock\forker\ProcessManager; $updated = 0; // simple background job $bigTableUpdate = CallbackTask::create(function(CallbackTask $task) { return DB::bigQuery('UPDATE very_big_table SET field=TRUE WHERE another=FALSE'); //it's just example })->future(function($updatedCount, CallbackTask $task) use(&$updated) { $updated = $updatedCount; })->error(function(\Throwable $exception, CallbackTask $task){ // handle exception occurred while DB::bigQuery() Logger::log($exception); }); $processManager = new ProcessManager('/path/to/file.pid'); $processManager ->add($bigTableUpdate) ->run(true) // true - join to main process, if you don't have an expensive and complex logic in future method ->wait(); // wait while process will complete doing job // if don't call wait() method, process will be detached from terminal or main process and continue to working in background echo $updated; // count of updated very_big_table
这只是一个非常简单的示例,现在更有用
批量使用
<?php use edwardstock\forker\handler\CallbackTask; use edwardstock\forker\handler\BatchTask; use edwardstock\forker\ProcessManager; $toDownload = [ 'https://google.com', 'https://facebook.com', ]; $results = []; /** @var BatchTask $downloads */ $downloads = BatchTask::create($toDownload, function ($toDownloadItem, CallbackTask $task) { return @file_get_contents($toDownloadItem); })->future(function ($sitesContent, BatchTask $task) use (&$results) { $results = $sitesContent; }); $pm = new ProcessManager(); $pm->add($downloads); $pm->run(true)->wait(); var_dump($results); // result // array(2) { // 0 => string(28) 'html_content_from_google.com' // 1 => string(30) 'html_content_from_facebook.com' // } // Order of results in this case is random, cause, for example, // facebook.com can be downloaded faster than google.com
更多示例即将到来... ;)