自定义进程

支持开发者创建一些特殊的工作进程,用于监控、上报或者其他特殊的任务,参考addProcess

  • 创建Proccess类,实现CustomProcessInterface接口。
  1. namespace App\Processes;
  2. use App\Tasks\TestTask;
  3. use Hhxsv5\LaravelS\Swoole\Process\CustomProcessInterface;
  4. use Hhxsv5\LaravelS\Swoole\Task\Task;
  5. use Swoole\Coroutine;
  6. use Swoole\Http\Server;
  7. use Swoole\Process;
  8. class TestProcess implements CustomProcessInterface
  9. {
  10. public static function getName()
  11. {
  12. // 进程名称
  13. return 'test';
  14. }
  15. public static function callback(Server $swoole, Process $process)
  16. {
  17. // 进程运行的代码,不能退出,一旦退出Manager进程会自动再次创建该进程。
  18. \Log::info(__METHOD__, [posix_getpid(), $swoole->stats()]);
  19. while (true) {
  20. \Log::info('Do something');
  21. // sleep(1); // Swoole < 2.1
  22. Coroutine::sleep(1); // Swoole>=2.1 callback()方法已自动创建了协程。
  23. // 自定义进程中也可以投递Task,但不支持Task的finish()回调。
  24. // 注意:
  25. // 1.参数2需传true
  26. // 2.config/laravels.php中修改配置task_ipc_mode为1或2,参考 https://wiki.swoole.com/wiki/page/296.html
  27. $ret = Task::deliver(new TestTask('task data'), true);
  28. var_dump($ret);
  29. // 上层会捕获callback中抛出的异常,并记录到Swoole日志,如果异常数达到10次,此进程会退出,Manager进程会重新创建进程,所以建议开发者自行try/catch捕获,避免创建进程过于频繁。
  30. // throw new \Exception('an exception');
  31. }
  32. }
  33. // 要求:LaravelS >= v3.4.0 并且 callback() 必须是异步非阻塞程序。
  34. public static function onReload(Server $swoole, Process $process)
  35. {
  36. // Stop the process...
  37. // Then end process
  38. $process->exit(0);
  39. }
  40. }
  • 注册TestProcess。
  1. // 修改文件 config/laravels.php
  2. // ...
  3. 'processes' => [
  4. [
  5. 'class' => \App\Processes\TestProcess::class,
  6. 'redirect' => false, // 是否重定向输入输出
  7. 'pipe' => 0 // 管道类型:0不创建管道,1创建SOCK_STREAM类型管道,2创建SOCK_DGRAM类型管道
  8. ],
  9. ],
  • 注意:TestProcess::callback()方法不能退出,如果退出次数达到10次,Manager进程将会重新创建进程。