cellard / process-manager
此包已被废弃且不再维护。未建议替代包。
管理cron任务的线程
v1.0.1
2022-06-22 14:05 UTC
Requires
- php: >=5.6
- ext-mbstring: *
- mozartk/process-finder: ^1.0
- predis/predis: *
Requires (Dev)
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';