课程表

Swoole基础

Swoole实例

工具箱
速查手册

Swoole 2.0 正式版发布

当前位置:免费教程 » 程序设计 » Swoole

Swoole 2.0正式版发布了。2.0版本最大的更新是增加了对协程(Coroutine)的支持。正式版已同时支持PHP5和PHP7。基于Swoole2.0协程PHP开发者可以已同步的方式编写代码,底层自动进行协程调度,转变为异步IO。解决了传统异步编程嵌套回调的问题。

与Node.js(ES6+)、Python等语言使用yield/generator、async/await的实现方式相比,Swoole协程无需修改代码添加额外的关键词。

与Go语言的goroutine相比,Swoole协程是内置式的,应用层代码无需添加go关键词启动协程,只需要使用封装好的协程客户端即可,使用更简单。另外Swoole协程的IO组件在底层内置了超时机制,不需要使用复杂的select/chan/timer实现客户端超时。

目前Swoole底层内置的协程客户端组件包括:udpclient、tcpclient、httpclient、redisclient、mysqlclient,基本涵盖了开发者常用的几种通信协议。协程组件只能在服务器的onConnect、onRequest、onReceive、onMessage 回调函数中使用。

使用示例:

  1. $server = new Swoole\Http\Server('127.0.0.1', 9501);
  2.  
  3. /*
  4.     触发on request事件时,SWOOLE会开辟一个协程栈,对协程栈进行初始化
  5. */
  6. $server->on('Request', function ($request, $response) {
  7.     $tcp_cli = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP);
  8.     /**
  9.         client在调用connect函数后,SWOOLE会将PHP上下文信息保存到当前栈内
  10.         然后将协程挂起,待确认连接成功后,触发epoll事件,然后协程切换
  11.         恢复PHP上下文信息,返回结果,继续执行PHP代码
  12.      */
  13.     if ($tcp_cli->connect('127.0.0.1', 9906) === false) {
  14.         $response->end("connect server failed.");
  15.         return;
  16.     }
  17.     $tcp_cli->send('test for the coro');
  18.     /*
  19.         client在调用recv函数后,SWOOLE会将PHP上下文信息保存到当前栈内
  20.         然后将协程挂起待后端svr回包,触发epoll事件,然后协程切换
  21.         恢复PHP上下文信息,返回结果,继续执行PHP代码
  22.         如果后端在设定的超时时间内,未能回包,返回false
  23.         client的errCode定为110
  24.      */
  25.     $ret = $tcp_cli->recv(100);
  26.     $tcp_cli->close();
  27.     if ($ret) {
  28.         $response->end(" swoole response is ok");
  29.     } else {
  30.         $response->end(" recv failed error : {$tcp_cli->errCode}");
  31.     }
  32. });
  33.  
  34. $server->start();

UDP客户端

  1. $udp_cli = new Swoole\Coroutine\Client(SWOOLE_SOCK_UDP);
  2.  
  3. $ret = $udp_cli->connect('127.0.0.1', 9906);
  4. $udp_cli->send('test for the coro');
  5.  
  6. $ret = $udp_cli->recv(100);
  7. $udp_cli->close();
  8.  
  9. if ($ret)
  10. {
  11.     $response->end("swoole response is ok");
  12. }
  13. else
  14. {
  15.     $response->end("recv failed error : {$client->errCode}");
  16. }

MySQL客户端

  1. $swoole_mysql = new Swoole\Coroutine\MySQL();
  2. $swoole_mysql->connect([
  3.     'host' => '127.0.0.1',
  4.     'user' => 'user',
  5.     'password' => 'pass',
  6.     'database' => 'test'
  7. ]);
  8. $res = $swoole_mysql->query('select sleep(1)');

Redis客户端

  1. $redis = new Swoole\Coroutine\Redis();
  2. $redis->connect('127.0.0.1', 6379);
  3. $val = $redis->get('key');

Http客户端

  1. $cli = new Swoole\Coroutine\Http\Client('127.0.0.1', 80);
  2. $cli->setHeaders([
  3.     'Host' => "localhost",
  4.     "User-Agent" => 'Chrome/49.0.2587.3',
  5.     'Accept' => 'text/html,application/xhtml+xml,application/xml',
  6.     'Accept-Encoding' => 'gzip',
  7. ]);
  8. $cli->set([ 'timeout' => 1]);
  9. $cli->get('/index.php');
  10. echo $cli->body; 
  11. $cli->close();
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号