EasySwoole中使用异步客户端

为方便查看代码,本文没有使用自定义进程类模板,如果需要开发,可查看自定义进程 在run方法里面使用异步客户端

请不要直接在worker进程使用自定义进程,否则将出现问题

纯原生异步

  1. public static function mainServerCreate(EventRegister $register)
  2. {
  3. // //纯原生异步
  4. ServerManager::getInstance()->getSwooleServer()->addProcess(new Process(function ($worker){
  5. $client = new \swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
  6. $client->on("connect", function(\swoole_client $cli) {
  7. $cli->send("test:delay");
  8. });
  9. $client->on("receive", function(\swoole_client $cli, $data){
  10. echo "Receive: $data";
  11. $cli->send("test:delay");
  12. sleep(1);
  13. });
  14. $client->on("error", function(\swoole_client $cli){
  15. echo "error\n";
  16. });
  17. $client->on("close", function(\swoole_client $cli){
  18. echo "Connection close\n";
  19. });
  20. $client->connect('192.168.159.1', 9502);
  21. //本demo自定义进程采用的是原生写法,如果需要使用,请使用自定义进程类模板开发
  22. if (extension_loaded('pcntl')) {//异步信号,使用自定义进程类模板不需要该代码
  23. pcntl_async_signals(true);
  24. }
  25. Process::signal(SIGTERM,function ()use($worker){//信号回调,使用自定义进程类模板不需要该代码
  26. $worker->exit(0);
  27. });
  28. }));
  29. }

伪异步-eventLoop

利用swoole自带的事件循环,实现异步

  1. public static function mainServerCreate(EventRegister $register)
  2. {
  3. ServerManager::getInstance()->getSwooleServer()->addProcess(new Process(function ($worker){
  4. $client = new \swoole_client(SWOOLE_SOCK_TCP);
  5. $client->connect('192.168.159.1', 9502);
  6. //该出send是为了触发服务端主动返回消息,方便直观测试
  7. $client->send("test:delay");
  8. swoole_event_add($client->sock,function()use($client){
  9. //服务端中,在\Tcp\Parser中,因为你发test:delay命令,是依旧会先给你返回\n,因此请做下空判定
  10. $data = trim($client->recv());
  11. if(!empty($data)){
  12. var_dump('rec from ser');
  13. $client->send("test:delay");
  14. }
  15. });
  16. //本demo自定义进程采用的是原生写法,如果需要使用,请使用上文的自定义进程类模板开发
  17. if (extension_loaded('pcntl')) {//异步信号,使用自定义进程类模板不需要该代码
  18. pcntl_async_signals(true);
  19. }
  20. Process::signal(SIGTERM,function ()use($worker){//信号回调,使用自定义进程类模板不需要该代码
  21. $worker->exit(0);
  22. });
  23. }));
  24. }

伪异步-socket select

  1. public static function mainServerCreate(EventRegister $register)
  2. {
  3. ServerManager::getInstance()->getSwooleServer()->addProcess(new Process(function ($worker){
  4. $client = new \swoole_client(SWOOLE_SOCK_TCP);
  5. $client->connect('192.168.159.1', 9502);
  6. //该出send是为了触发服务端主动返回消息,方便直观测试
  7. $client->send("test:delay");
  8. Timer::loop(100,function ()use($client){
  9. $write = $error = array();
  10. $read = [$client];
  11. $n = swoole_client_select($read, $write, $error, 0.01);
  12. if($n > 0){
  13. $data = trim($client->recv());
  14. if(!empty($data)){
  15. $client->send("test:delay");
  16. var_dump('rec:'.$data);
  17. }
  18. }
  19. });
  20. //本demo自定义进程采用的是原生写法,如果需要使用,请使用上文的自定义进程类模板开发
  21. if (extension_loaded('pcntl')) {//异步信号,使用自定义进程类模板不需要该代码
  22. pcntl_async_signals(true);
  23. }
  24. Process::signal(SIGTERM,function ()use($worker){//信号回调,使用自定义进程类模板不需要该代码
  25. $worker->exit(0);
  26. });
  27. }));
  28. }