使用异步客户端

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

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

MySQL

  1. $db = new Swoole\MySQL;
  2. $server = array(
  3. 'host' => '127.0.0.1',
  4. 'user' => 'test',
  5. 'password' => 'test',
  6. 'database' => 'test',
  7. );
  8. $db->connect($server, function ($db, $result) {
  9. $db->query("show tables", function (Swoole\MySQL $db, $result) {
  10. var_dump($result);
  11. $db->close();
  12. });
  13. });

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

Redis

  1. $redis = new Swoole\Redis;
  2. $redis->connect('127.0.0.1', 6379, function ($redis, $result) {
  3. $redis->set('test_key', 'value', function ($redis, $result) {
  4. $redis->get('test_key', function ($redis, $result) {
  5. var_dump($result);
  6. });
  7. });
  8. });

Http

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

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

其他客户端

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

原文:https://wiki.swoole.com/wiki/page/788.html