cmhc / sworker
此包的最新版本(1.0.0)没有可用的许可证信息。
一个php多进程框架
1.0.0
2017-12-14 07:58 UTC
This package is auto-updated.
Last update: 2024-09-09 01:02:36 UTC
README
sworker是一个多进程框架,可以让PHP脚本以守护进程方式运行。通常用于处理队列、定时任务等。
以下介绍sworker的使用方法
普通多进程模式
多进程框架相当于一个容器,你需要做的就是编写需要运行的方法,然后在这个容器中运行。以测试类Test为例:
class Test
{
static $count = 0;
/**
* 测试普通的方法
* 该方法整体可以看成原子操作,不会被中断,除非使用kill -9强制杀进程
*/
public function sleepMethod($i)
{
echo "process:" . $i ."\tcount: ". self::$count . "\tsleep 1s\n";
sleep(1);
self::$count ++;
}
}
然后我们可以实例化Process类。
use sworker\Process\Process;
$process = new Process();
//加入worker,可以直接使用类的名称
$process->addWorker('Test', 'sleepMethod');
//也可以使用实例化之后的类
$process->addWorker(new Test(), 'sleepMethod');
//这一步是开始执行
$process->start();
任务执行间隔及定时执行
可以将Sworker视为一个crontab,让任务在某个时间之后,每隔一定时间执行一次。只需使用Process::after() 和 Process::interval(),这两个方法就可以实现定时任务。代码示例如下。
,
class Test
{
static $count = 0;
/**
* 测试普通的方法
* 该方法整体可以看成原子操作,不会被中断,除非使用kill -9强制杀进程
*/
public function method($i)
{
echo "process:" . $i ."\tcount: ". self::$count . "\tsleep 1s\n";
self::$count ++;
}
}
use sworker\Process\Process;
$process = new Process();
//通过这两个组合,method进程会在每天的9点1分1s之后执行一次
$process->addWorker('Test', 'method')->interval(86400)->after('09:01');
//这一步是开始执行
$process->start();
方法参数
Process::after(string $time)
Process::interval(int $seconds)
参数
默认情况下,Sworker内置了一些参数,通过-h或--help参数可以看到。
-d <value> daemon模式
-e <value> 开启调试模式
-h <value> 显示帮助信息
-i <value> 指定执行某个worker,可以使用-h参数查看worker索引号
-s <value> 给主进程发送信号,支持stop信号,终止进程
-l <value> 指定循环次数,0为无限循环
-u <value> 指定以某个用户来执行该程序
--pid=<value> pid路径
--help=<value> 输出帮助信息
当然,可以扩展这些参数,Sworker提供Option类来扩展参数。在调用Process::addWorker()之前,使用Option::add()方法来增加自定义参数。
Option::add(string $name[, boolean $required = false[, string $description = '']]);
name 参数名称必须以大写字母开头,与系统定义的参数区分开;required 表明是否必须要有值的参数;description 通过help打印出的描述信息。
进程通信
在1.1版本之后,Sworker增加了一个Router类,可以创建Router进程来实现进程间的通信。Router进程负责消息转发。以下是创建一个router进程的方法:
class RouterProcess
{
protected $router;
public function routerInit()
{
$this->router = new Router('0.0.0.0', 13000);
}
public function router()
{
$this->router->start();
}
}
$process = new Process();
$process->addWorker('RouterProcess', 'router');
之后可以使用messenger提供的一些通信方法进行进程间通信,例如使用tcp进行通信。
class Messenger
{
public function proc1Init()
{
sleep(1);
$this->tcp = new TCP;
$this->tcp->connect('127.0.0.1', 13000, 'proc1');
echo "connected\n";
}
public function proc1()
{
for ($i=0;$i<100;$i++) {
$data = $this->tcp->receive();
print_r($data);
}
}
public function proc2Init()
{
sleep(1);
$this->tcp = new TCP;
$this->tcp->connect('127.0.0.1', 13000, 'proc2');
echo "connected\n";
}
public function proc2()
{
for ($i=0; $i<100;$i++) {
$this->tcp->send('proc1', "hello world".$i);
sleep(1);
}
}
}
$process->addWorker('tests\Messenger', 'proc1');
$process->addWorker('tests\Messenger', 'proc2');
$process->start();