edwardstock/forker

此包已被废弃,不再维护。未建议替代包。

PHP POSIX 进程管理器和异步作业处理器

1.0.2 2016-12-19 12:53 UTC

This package is not auto-updated.

Last update: 2023-09-17 18:40:07 UTC


README

PHP POSIX 进程管理器和异步 ProcessPool

Build Status

新闻

  • 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

更多示例即将到来... ;)