定义进程
定义进程主要是通过 @Process
注解完成定义。
注解
@Process
拥有属性:
name
进程唯一标识,默认类名boot
是否为Server前置进程,默认falseinout
参数,参考 swoole $redirect_stdin_stdout,默认false
pipe
参数,参考 swoole $create_pipe,默认true
coroutine
是否启动一个协程来运行进程逻辑即开启协程模式,默认falsenum
启动进程的个数,默认是1
创建进程类
无论是Server前置进程或用户自定义进程,定义方式都是一样,实现 ProcessInterface
接口,需要实现run和check方法
- run 方法里面实现进程的主要业务逻辑
- check 方法用于验证进程启动的前置条件,返回true启动进程,返回false不启动进程。
Server 前置进程
- 随着server启动,将会附加到 server, 并被其管理
- 保证
boot=true
和check()
返回true
才会启动
/**
* Boot process
*
* @Process(boot=true)
*/
class MyProcess implements ProcessInterface
{
public function run(SwoftProcess $process)
{
$pname = App::$server->getPname();
$processName = "$pname myProcess process";
$process->name($processName);
echo "Custom boot process \n";
$result = Task::deliverByProcess('sync', 'deliverCo', ['p', 'p2']);
var_dump($result);
// 在此自启动进程中,
// 我们手动的创建了另一个自定义进程
// 实际使用中是无需这样做的,在这个方法里我们已经可以写需要的逻辑了
ProcessBuilder::create('customProcess')->start();
}
public function check(): bool
{
return true;
}
}
用户自定义进程
- 不会随着server启动
- 可以使用
ProcessBuilder::create('customProcess')->start()
来创建它 - 如何启动使用
- 如上面的,在一个自启动进程里来启动它。 :) 当然,这其实是没必要的
- 监听server的相关事件,在里面启动它
- 命令行里,执行某个命令时。启动使用它
- … 在你需要的时候
/**
* Custom process
*
* @Process(name="customProcess", coroutine=true)
*/
class MyProcess implements ProcessInterface
{
public function run(SwoftProcess $process)
{
$pname = App::$server->getPname();
$processName = "$pname myProcess process";
$process->name($processName);
echo "Custom child process \n";
var_dump(Coroutine::id());
}
public function check(): bool
{
return true;
}
}
提示!
run 方法里面可以使用 Swoft 所有功能。
唯一不一样的是,如果进程不是协程模式运行,所有IO操作,框架底层会自动切换成传统的同步阻塞,但是使用方法是一样的
运行进程
运行进程很简单,是通过进程唯一标识名称运行。
ProcessBuilder::create('customProcess')->start();
前置进程会被swoft主动调用并运行
投递任务
若进程里面需要投递任务功能,需要依赖 swoft/task
组件。
组件安装成功后,直接调用方法投递,具体如何投递任务Task里面有详细介绍。
$result = Task::deliverByProcess('sync', 'deliverCo', ['p', 'p2']);
var_dump($result);