协程:协程可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。Swoole可以为每一个请求创建对应的协程,根据IO的状态来合理的调度协程,这会带来了以下优势:
-
开发者可以无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护。
-
同时由于swoole是在底层封装了协程,所以对比传统的php层协程框架,开发者不需要使用yield关键词来标识一个协程IO操作,所以不再需要对yield的语义进行深入理解以及对每一级的调用都修改为yield,这极大的提高了开发效率。
//需要获取redis内的数据和mysql里的数据 $http_server = new swoole_http_server('0.0.0.0', 9503); $http_server->on('request',function($request, $response){ $result = ''; //获取redis的时间 $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6379); $result .= 'redis:' . $redis->get($request->get['name']) . '<br>'; //获取mysql的时间 $mysql = new Swoole\Coroutine\Mysql(); $res = $mysql->connect([ 'host' => '127.0.0.1', 'port' => 3306, 'user' => 'root', 'password' => 'XXX', 'database' => 'swoole', 'charset' => 'utf8', //指定字符集 'timeout' => 2, // 可选:连接超时时间(非查询超时时间),默认为SW_MYSQL_CONNECT_TIMEOUT(1.0) ]); if($res){ $result .= 'mysql:' . json_encode($mysql->query('select * from user where id = ' . $request->get['id']) ); } //总时间 = max(time(redis),time(mysql)); $response->header('Content-Type', 'text/html'); $response->end($result); }); $http_server->start();
注意:协程只能写在回调方法中例如onconnect,onrequest,onmessage等.