cellard/process-manager

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

管理cron任务的线程

v1.0.1 2022-06-22 14:05 UTC

This package is auto-updated.

Last update: 2023-11-23 14:34:50 UTC


README

Manager 允许您控制cron任务线程。

#crontab
* * * * * php example.php
* * * * * php converter.php

只允许一个cron任务实例。如果前一个任务仍在运行,则下一个任务将被拒绝。

example.php

$pm = new ProcessManager('example');

if ($pm->lock()) {
    // Do your job
 
} else {
    // All threads are engaged
}

由于基于进程ID进行进程管理,您无需手动释放锁,它将自动释放。

您可以使用静态快捷方式而不是实例化 ProcessManager 类。

$pm = ProcessManager::queue('example');

闭包风格

在这个例子中,两个cron任务实例可以同时运行。

converter.php

$lock = ProcessManager::queue('converter')
    ->threads(2)
    ->lock(function(ProcessManager $pm) {
        // Do your job
    
    });

if ( ! $lock) {
    // All threads are engaged
}

主题

当与队列一起工作时,我们需要控制每个任务仅执行一次。

我们可以用任务编号(或其他类似的东西)来定义进程主题。

在这个例子中,将有最多两个进程,并且每个文件只转换一次。

$pm = ProcessManager::queue('converter')
    ->threads(2);

if (!$pm->lock()) {
    exit('Too many threads');
}

while (FilesToConvert::getOne() as $filename) {
    if (!$pm->subject($filename)->lock()) {
        // file is converting now by other thread
        continue;
    }
    
    // Your code to convert file here
}

此示例可以简化。

while (FilesToConvert::getOne() as $filename) {
    ProcessManager::queue('converter')
        ->threads(2)
        ->subject($filename)
        ->lock(ProcessManager $pm) use ($filename) {
            // Your code to convert file here
        });
}

工作原理

进程管理器通过进程ID保持锁。它监视进程是否存活,并在进程消失时自动释放锁。

即使您的任务运行数小时,管理器也会监视其活动。

驱动程序

文件系统

默认使用。管理器在系统临时目录中保持锁文件,但您可以重新定义它。

ProcessManager::$driver = new \Cellard\ProcessManager\Drivers\FilesystemDriver(/* optional */ $loc_dir);

Redis

ProcessManager::$driver = new \Cellard\ProcessManager\Drivers\RedisDriver(/* optional */ $predis_config);

命名空间

由于管理器在文件系统或Redis键中存储锁,因此不同的项目可能会使用相同的名称。为了避免冲突,建议重新定义管理器的前缀。

ProcessManager::$prefix = 'your-project-name';