自定义进程
支持开发者创建一些特殊的工作进程,用于监控、上报或者其他特殊的任务,参考addProcess。
- 创建Proccess类,实现CustomProcessInterface接口。
- namespace App\Processes;
- use App\Tasks\TestTask;
- use Hhxsv5\LaravelS\Swoole\Process\CustomProcessInterface;
- use Hhxsv5\LaravelS\Swoole\Task\Task;
- use Swoole\Coroutine;
- use Swoole\Http\Server;
- use Swoole\Process;
- class TestProcess implements CustomProcessInterface
- {
- public static function getName()
- {
- // 进程名称
- return 'test';
- }
- public static function callback(Server $swoole, Process $process)
- {
- // 进程运行的代码,不能退出,一旦退出Manager进程会自动再次创建该进程。
- \Log::info(__METHOD__, [posix_getpid(), $swoole->stats()]);
- while (true) {
- \Log::info('Do something');
- // sleep(1); // Swoole < 2.1
- Coroutine::sleep(1); // Swoole>=2.1 callback()方法已自动创建了协程。
- // 自定义进程中也可以投递Task,但不支持Task的finish()回调。
- // 注意:
- // 1.参数2需传true
- // 2.config/laravels.php中修改配置task_ipc_mode为1或2,参考 https://wiki.swoole.com/wiki/page/296.html
- $ret = Task::deliver(new TestTask('task data'), true);
- var_dump($ret);
- // 上层会捕获callback中抛出的异常,并记录到Swoole日志,如果异常数达到10次,此进程会退出,Manager进程会重新创建进程,所以建议开发者自行try/catch捕获,避免创建进程过于频繁。
- // throw new \Exception('an exception');
- }
- }
- // 要求:LaravelS >= v3.4.0 并且 callback() 必须是异步非阻塞程序。
- public static function onReload(Server $swoole, Process $process)
- {
- // Stop the process...
- // Then end process
- $process->exit(0);
- }
- }
- 注册TestProcess。
- // 修改文件 config/laravels.php
- // ...
- 'processes' => [
- [
- 'class' => \App\Processes\TestProcess::class,
- 'redirect' => false, // 是否重定向输入输出
- 'pipe' => 0 // 管道类型:0不创建管道,1创建SOCK_STREAM类型管道,2创建SOCK_DGRAM类型管道
- ],
- ],
- 注意:TestProcess::callback()方法不能退出,如果退出次数达到10次,Manager进程将会重新创建进程。