× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

创建异步TCP客户端

程序代码

async_client.php

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);

//注册连接成功回调
$client->on("connect", function($cli) {
    $cli->send("hello world\n");
});

//注册数据接收回调
$client->on("receive", function($cli, $data){
    echo "Received: ".$data."\n";
});

//注册连接失败回调
$client->on("error", function($cli){
    echo "Connect failed\n";
});

//注册连接关闭回调
$client->on("close", function($cli){
    echo "Connection close\n";
});

//发起连接
$client->connect('127.0.0.1', 9501, 0.5);

异步客户端与上一个同步TCP客户端不同,异步客户端是非阻塞的。可以用于编写高并发的程序。swoole官方提供的redis-asyncmysql-async都是基于异步swoole_client实现的。

异步客户端需要设置回调函数,有4个事件回调必须设置onConnectonErroronReceiveonClose。分别在客户端连接成功、连接失败、收到数据、连接关闭时触发。

$client->connect() 发起连接的操作会立即返回,不存在任何等待。当对应的IO事件完成后,swoole底层会自动调用设置好的回调函数。

异步客户端只能用于cli环境


  • rady

    请问下这个可以支持http请求吗? 如果支持header头和post的数据怎么设置?

  • newbie_12138

    用在cli的意义是什么大多数都是web 浏览器能举个例子吗

  • 生活不能自理

    服务端调用redis的时候,服务端相当于客户端

  • 刘欣

    这个应用场合 可以用在tcp服务端处理mysql redis 这类情况。使用这个异步客户端? 这样节省了回调过来的处理逻辑 是这个使用场景吗?

  • 序状

    这个为什么没有返回任何数据?

  • 序状

    这个就一直连接着吗?

  • 弃天帝儿

    应该是需要自己手动调用关闭操作的 比如在on recerve里接到数据后调用关闭连接函数

  • 飞鸿影

    正常的代码逻辑里如果某个操作很耗时,可以使用异步的客户端去执行。

  • 蛟十五

    需要在receive中手动$cli->close();

  • wayde

    最新版本swoole报错,文档是不是需要调整一下了: PHP Deprecated: Swoole\Client::__construct(): async APIs will be removed in Swoole-v4.3.0, you should be using the coroutine APIs instead. in /hwfData/www/demo/swoole/demo/async_client/async_client.php on line 3

    Deprecated: Swoole\Client::__construct(): async APIs will be removed in Swoole-v4.3.0, you should be using the coroutine APIs instead. in /hwfData/www/demo/swoole/demo/async_client/async_client.php on line 3 Received: Server: hello world

  • tomRat

    我安装的swoole版本是4.8.12,此文章上面的代码执行会报错: PHP Fatal error: Swoole\Client::__construct(): please install the ext-async extension, using Swoole\Async\Client 出问题的原因可以看下https://wiki.swoole.com/wiki/page/p-client.html 解决方法就是需要安装一个ext-async扩展。 参考https://github.com/swoole/ext-async 安装好扩展后 代码也要调整下: $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); 改为: $client = new Swoole\Async\Client(SWOOLE_SOCK_TCP); 就没问题了

  • qinaction110

    这个为什么没有返回任何数据?

  • Roのck

    安装ext-async扩展报错: in file included from /data/ext-async/swoole_redis.c:17:0: /data/ext-async/php_swoole_async.h:78:0: warning: "SWOOLE_OBJECT_DEFAULT" redefined [enabled by default] #define SWOOLE_OBJECT_DEFAULT 8 ^ In file included from /data/ext-async/php_swoole_async.h:26:0, from /data/ext-async/swoole_redis.c:17: /usr/local/php7/include/php/ext/swoole/php_swoole.h:101:0: note: this is the location of the previous definition #define SWOOLE_OBJECT_DEFAULT 65536 ^ In file included from /data/ext-async/swoole_redis.c:17:0: /data/ext-async/php_swoole_async.h:87:3: error: conflicting types for ‘swoole_object_array’ } swoole_object_array; ^ In file included from /data/ext-async/php_swoole_async.h:26:0, from /data/ext-async/swoole_redis.c:17: /usr/local/php7/include/php/ext/swoole/php_swoole.h:110:3: note: previous declaration of ‘swoole_object_array’ was here } swoole_object_array; ^ In file included from /data/ext-async/swoole_redis.c:17:0: /data/ext-async/php_swoole_async.h:89:28: error: conflicting types for ‘swoole_objects’ extern swoole_object_array swoole_objects;

  • Roのck

    swoole_async

  • 看山似山

    注意和swool的版本号一致,如果用的swool最新版本,有时候ext这边还没同步,可以去以下的文件修改: php_swoole_async.h,把PHP_SWOOLE_EXT_ASYNC_VERSION_ID改为与swool版本一致即可