php-strict/cooperative-worker

用于在多个进程中执行一个任务列表的类

dev-master 2024-06-03 12:11 UTC

This package is auto-updated.

Last update: 2024-09-03 13:11:27 UTC


README

Software License Build Status codecov Codacy Badge

用于在多个进程中执行一个任务列表的类。该类不包含创建进程的机制,消费者必须自行创建。每个单独的进程可以创建类的实例,这些实例将使用共享存储而不发生冲突。作业(队列)的临时存储将在类的第一个实例中创建,并由所有实例使用。

要求

  • PHP >= 7.1

安装

作为独立类使用

require 'CooperativeWorker.php';
use PhpStrict\CooperativeWorker\CooperativeWorker;

使用 Composer 安装

composer require php-strict/cooperative-worker

用法

之前(所有作业通过一个进程运行)

//$jobs - list of commands, files to processing, ...
$jobs = ['job 1', 'job 2', 'job 3', 'job 4', 'job 5'];

foreach ($jobs as $job) {
    echo 'Start job: ' . $job . PHP_EOL;
    //do some job
}

使用协作工作者

cw.php

use PhpStrict\CooperativeWorker\CooperativeWorker;

$cw = new CooperativeWorker(
    function() {
        return ['job 1', 'job 2', 'job 3', 'job 4', 'job 5'];
    }, 
    function(string $job) {
        echo 'Start job: ' . $job . PHP_EOL;
        //do some job
    }
);
$cw->run();

cw.bat(在Windows上使用 start 命令创建两个单独的进程)

start php -f cw.php
start php -f cw.php

cw.sh(在Linux上使用 & 在命令末尾创建两个单独的进程)

php -f cw.php &
php -f cw.php &

使用 ScriptRunner

use PhpStrict\ScriptRunner\ScriptRunner;

//path_to_script, processes count (if omitted then system CPU cores count will be used) 
$sr = new ScriptRunner('cw.php', 4);
$sr->run();

处理图像(日志文件、数据文件等)

cw.php

use PhpStrict\CooperativeWorker\CooperativeWorker;

$cw = new CooperativeWorker(
    //returns array of images (with path to it) from dir
    function() {
        $images = glob('/path_to_images/*.jpg');
        array_walk(
            $images, 
            function(&$val, $key, $path) {
                $val = $path . '/' . $val;
            }, 
            '/path_to_images'
        );
        return $images;
    }, 
    function(string $image) {
        echo 'Processing image: ' . $image . PHP_EOL;
        //do some image operation (resizing, cropping, etc.)
    }
);
$cw->run();

测试

要执行测试套件,您需要 Codeception

vendor/bin/codecept run