使用异步客户端

最后更新于:2022-04-02 06:16:22

# 使用异步客户端 [TOC] `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(); }); }); ~~~ 与`mysqli`和`PDO`等客户端不同,`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客户端](异步Redis客户端.md "异步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文档](异步Http-WebSocket客户端.md) ## 其他客户端 `Swoole`底层目前只提供了最常用的`MySQL`、`Redis`、`Http`异步客户端,如果你的应用程序中需要实现其他协议客户端,如`Kafka`、`AMQP`等协议,可以基于`Swoole\Client`异步`TCP`客户端,开发相关协议解析代码,来自行实现。
';