Swoole协程实现redis和mysql示例

协程:协程可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。Swoole可以为每一个请求创建对应的协程,根据IO的状态来合理的调度协程,这会带来了以下优势:

  1. 开发者可以无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护。

  2. 同时由于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等.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值