swoole框架中swoole_client的实现
13 April 2016
swoole_client的实现源码主要在swoole-src/swoole_client.c中。
swoole_client有同步和异步两种使用方式,如下:
同步方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$client = new swoole_client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9501, 0.5))
{
die("connect failed.");
}
if (!$client->send("hello world"))
{
die("send failed.");
}
$data = $client->recv();
if (!$data)
{
die("recv failed.");
}
$client->close();
异步方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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);
与swoole_client相关的几个实体如下图:
以本文开头两个示例代码为例子:
同步方式的执行
1、执行connect方法
2、执行send方法,调用swClient_tcp_send_sync()->swConnection_send()->send(/*系统调用*/)
3、执行recv方法,调用swClient_tcp_recv_no_buffer()->swConnection_recv()->recv(/*系统调用*/)
4、执行close方法,调用swClient_close()
异步方式的执行
1、执行__construct方法
2、执行on方法,设置回调函数
3、执行connect方法
4、执行php_swoole_event_wait函数