自定义进程

在webman中你可以像workerman那样自定义监听或者进程。

自定义监听例子

新建 process/Pusher.php

  1. <?php
  2. namespace process;
  3. use Workerman\Connection\TcpConnection;
  4. class Pusher
  5. {
  6. public function onConnect(TcpConnection $connection)
  7. {
  8. echo "onConnect\n";
  9. }
  10. public function onWebSocketConnect(TcpConnection $connection, $http_buffer)
  11. {
  12. echo "onWebSocketConnect\n";
  13. }
  14. public function onMessage(TcpConnection $connection, $data)
  15. {
  16. $connection->send($data);
  17. }
  18. public function onClose(TcpConnection $connection)
  19. {
  20. echo "onClose\n";
  21. }
  22. }

注意:所有onXXX属性均为public

config/process.php中添加如下配置

  1. return [
  2. // ... 其它进程配置省略
  3. // websocket_test 为进程名称
  4. 'websocket_test' => [
  5. // 这里指定进程类,就是上面定义的Pusher类
  6. 'handler' => process\Pusher::class,
  7. 'listen' => 'websocket://0.0.0.0:8888',
  8. 'count' => 1,
  9. ],
  10. ];

自定义非监听进程例子

新建 process/TaskTest.php

  1. <?php
  2. namespace process;
  3. use Workerman\Timer;
  4. use support\Db;
  5. class TaskTest
  6. {
  7. public function onWorkerStart()
  8. {
  9. // 每隔10秒检查一次数据库是否有新用户注册
  10. Timer::add(10, function(){
  11. Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
  12. });
  13. }
  14. }

config/process.php中添加如下配置

  1. return [
  2. // ... 其它进程配置省略
  3. 'task' => [
  4. 'handler' => process\TaskTest::class
  5. ],
  6. ];

注意:listen省略则不监听任何端口,count省略则进程数默认为1。

配置文件说明

一个进程完整的配置定义如下:

  1. return [
  2. // ...
  3. // websocket_test 为进程名称
  4. 'websocket_test' => [
  5. // 这里指定进程类
  6. 'handler' => process\Pusher::class,
  7. // 监听的协议 ip 及端口 (可选)
  8. 'listen' => 'websocket://0.0.0.0:8888',
  9. // 进程数 (可选,默认1)
  10. 'count' => 2,
  11. // 进程运行用户 (可选,默认当前用户)
  12. 'user' => '',
  13. // 进程运行用户组 (可选,默认当前用户组)
  14. 'group' => '',
  15. // 当前进程是否支持reload (可选,默认true)
  16. 'reloadable' => true,
  17. // 是否开启reusePort (可选,此选项需要php>=7.0,默认为true)
  18. 'reusePort' => true,
  19. // transport (可选,当需要开启ssl时设置为ssl,默认为tcp)
  20. 'transport' => 'tcp',
  21. // context (可选,当transport为是ssl时,需要传递证书路径)
  22. 'context' => [],
  23. // 进程类构造函数参数,这里为 process\Pusher::class 类的构造函数参数 (可选)
  24. 'constructor' => [],
  25. ],
  26. ];

总结

webman的自定义进程实际上就是workerman的一个简单封装,它将配置与业务分离,并且将workerman的onXXX回调通过类的方法来实现,其它用法与workerman完全相同。