ncrypthic/daemon

1.0.0 2013-12-23 10:20 UTC

This package is auto-updated.

Last update: 2024-09-24 15:32:30 UTC


README

我们经常需要在后台实现一个长时间运行的脚本,以对我们的应用程序进行维护任务。

以下列出了一些我们可以使用的技巧

  1. 默认情况下,使用cron没有进程控制机制。如果我们将一个脚本设置为每分钟运行一次,那么当脚本中的每个进程所需时间超过计划时间时,将会有进程执行之间的竞争条件。

  2. 当我们使用一个脚本通过循环在一个数组中执行一系列任务时,任务将依次执行。这将使得集合中的最后一个任务必须等待早期任务完成。

这个库的功能

这个库提供了基本的线程化进程控制,以运行我们的任务,但我们想通过使用PHP pcntl 扩展在派生的子进程中按顺序运行每个任务来防止竞争条件。

最低要求

  1. PHP >= 5.3.6
  2. 安装并启用了 pcntl 扩展

安装

  • 通过 composer
requires: {
    "ncrypthic/daemon": "dev-master"
}

运行

  • 创建实现 ProcessInterface 接口的进程(es)类
<?php
use Ncrypthic\Daemon\Interfaces\ProcessInterface;

class AliceProcess implements ProcessInterface
{
    public function execute()
    {
        sleep(3);
        echo 'Alice done'.PHP_EOL;
        exit;
    }    
}

class BobProcess implements ProcessInterface
{
    public function execute()
    {
        sleep(3);
        echo 'Bob done'.PHP_EOL;
        exit;
    }    
}
  • 创建默认管理器实例并注册任务
<?php

// ... Other commands

$manager = new \Ncrypthic\Daemon\Manager\DefaultManager();
$manager->addProcess(new AliceProcess());
$manager->addProcess(new BobProcess());
  • 现在将管理器守护化
<?php

try {
    $manager->daemonize();
} catch (\Ncrypthic\Daemon\Exception\ChildProcessException $exc) {
    echo $exc->getMessage();
}

输出

  • 控制台输出
bash-4.2$ php <your_script>.php 
Alice done
Bob done
        No child processes
Alice done
Bob done
        No child processes
Alice done
Alice done
Bob done
        No child processes
Alice done
Bob done
        No child processes
Alice done
  • 进程管理器输出
php
   `+-php
    +-php

-- 请参阅示例