Swoole
  1. 入门
    1. Swoole - 入门 - 安装
    2. Swoole - 入门 - 创建TCP服务器
    3. Swoole - 入门 - 创建UDP服务器
    4. Swoole - 入门 - 创建HTTP服务器
    5. Swoole - 入门 - 创建websocket服务器
    6. Swoole - 入门 - 创建同步TCP客户端
    7. Swoole - 入门 - 创建异步TCP客户端
    8. Swoole - 入门 - 网络通信协议设计
    9. Swoole - 入门 - 使用异步客户端(MySQL,Redis,Http)

Swoole - 入门 - 使用异步客户端(MySQL,Redis,Http)

程序员日记      2019-09-20

PHP提供的MySQL、CURL、Redis 等客户端是同步的,会导致服务器程序发生阻塞。Swoole提供了常用的异步客户端组件,来解决此问题。编写纯异步服务器程序时,可以使用这些异步客户端。

异步客户端可以配合使用SplQueue实现连接池,以达到长连接复用的目的。在实际项目中可以使用PHP提供的Yield/Generator语法实现半协程的异步框架。也可以基于Promises简化异步程序的编写。


MySQL

$db = new Swoole\MySQL;
$server = array(
    'host' => '127.0.0.1',
    'user' => 'test',
    'password' => 'test',
    'database' => 'test',
);
$db->connect($server, function ($db, $result) {
    $db->query("show tables", function (Swoole\MySQL $db, $result) {
        var_dump($result);
        $db->close();
    });
});

mysqliPDO等客户端不同,Swoole\MySQL是异步非阻塞的,连接服务器、执行SQL时,需要传入一个回调函数。connect的结果不在返回值中,而是在回调函数中。query的结果也需要在回调函数中进行处理。


Redis

$redis = new Swoole\Redis;
$redis->connect('127.0.0.1', 6379, function ($redis, $result) {
    $redis->set('test_key', 'value', function ($redis, $result) {
        $redis->get('test_key', function ($redis, $result) {
            var_dump($result);
        });
    });
});

Swoole\Redis需要Swoole编译安装hiredis,详细文档参见异步Redis客户端


Http

$cli = new Swoole\Http\Client('127.0.0.1', 80);
$cli->setHeaders(array('User-Agent' => 'swoole-http-client'));
$cli->setCookies(array('test' => 'value'));
$cli->post('/dump.php', array("test" => 'abc'), function ($cli) {
    var_dump($cli->body);
    $cli->get('/index.php', function ($cli) {
        var_dump($cli->cookies);
        var_dump($cli->headers);
    });
});

Swoole\Http\Client的作用与CURL完全一致,它完整实现了Http客户端的相关功能。具体请参考 HttpClient文档


其他客户端

Swoole底层目前只提供了最常用的MySQL、Redis、Http异步客户端,如果你的应用程序中需要实现其他协议客户端,如Kafka、AMQP等协议,可以基于Swoole\Client异步TCP客户端,开发相关协议解析代码,来自行实现。