Swoole 官方文档: https://wiki.swoole.com/
根据慕课网视频学习:https://coding.imooc.com/class/197.html服务端
1.快速搭建TCP服务端
<?php
//创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);
$serv->set([
'worker_num' => 4,
'max_request' => 1000
]);
//监听连接进入事件
/**
* $fd 是客户端连接的唯一标识
* $reactor_id 线程id
*/
$serv->on('connect', function ($serv, $fd ,$reactor_id) {
echo " Client {$reactor_id} - {$fd}: Connect.\n";
});
//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
echo $data."\n";
$serv->send($fd, "Server {$reactor_id} - {$fd} : ".$data);
});
//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
echo "Client: {$fd} Close.\n";
});
//启动服务器
$serv->start();
先new一个swoole_server对象
可以set设置配置项,具体配置的意义可参考文档
函数
connect监听连接进入事件函数,在有用户连接tcp服务,自动调用
参数:
$serv 是tcp服务的实例
$fd 是客户端连接的唯一标识
$reactor_id 是线程id
receive监听数据接收函数,在用户发送数据给tcp服务时,自动调用
参数:
$data 接收的客户端发送过来的数据
send ( $fd,$data )发送数据函数 ,是给指定的客户端发送数据
参数:
$fd 需要发送给哪个客户端
$data 需要发送的数据
close监听连接关闭函数,当一个连接关闭时自动调用
start 启动服务器,上述的操作都应该在start之前执行
连接服务端:
telnet 127.0.0.1 9501
2.UDP服务端
与TCP类似//创建Server对象,监听 127.0.0.1:9502端口,类型为SWOOLE_SOCK_UDP
$serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
//设置参数
$serv->set([
'worker_number' =>5, //worker的进程数
'max_request' =>5000 //一个进程可以处理用户数
]);
//监听数据接收事件
$serv->on('packet',function ($serv,$data,$client_info){
$serv->sendto($client_info['address'],$client_info['port'],$data,$client_info['server_socket']);
var_dump($client_info);
});
//启动服务器
$serv->start();
与TCP不同的是 在new 一个swoole_server对象的时候,最后一个参数要改成SWOOLE_SOCK_UDP这是swoole自带的常量
swoole自带常量 : https://wiki.swoole.com/wiki/page/26.html
在UDP中,使用onPacket回调函数来监听数据接收事件.
$data接收客户端发送的数据
$client_info客户端的信息,是一个数组格式,包括 address,port,server_socket
example:
Array
(
[server_socket] => 3
[server_port] => 9502
[address] => 127.0.0.1
[port] => 44833
)
发送消息给客户端时,使用sendto函数
$ip也就是ip
$port端口号
$data要发送的数据内容
其他似乎与TCP基本一样
3.HTTP服务端
基于swoole_server , 但与swoole_server区别挺大的
<?php
$http = new swoole_http_server('0.0.0.0',8811);
$http->set([
'enable_static_handler' => true,
'document_root' => '/marun'
]);
$http->on('request',function ($request,$response){
print_r($request->get);
$response->cookie('run','666666666',60);
$response->end(json_encode($request->get));
});
$http->start();
在HTTP服务端中,我们需要new 一个 swoole_http_server对象 ,只需要传递ip和端口就行
这里将ip设置为0.0.0.0 我们就可以通过外网直接在浏览器中来访问这个页面
具体效果,通过网站加端口的方式访问,还可以通过地址栏传递数据,并通过$request->get接收,response只能返回字符串格式,所以使用json_decode将数据转换
set这里设置两个参数,目的是与Apache和nginx类似.可以通过路径访问某个静态页面
enable_static_handler在使用静态页面的时候,必须开启
document_root 静态页面的路径
具体效果: 我们通过地址栏访问index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>通过swoole访问的</title>
</head>
<body>
<h1>我是通过swoole访问进来的静态资源内容.</h1>
</body>
</html>
index.html放到document_root
指定的路径下就行,具体用法与Apache一样
onrequest
回调函数,监听连接事件.在有连接进入的时候自动调用$request
与$response
可以参考文档 https://wiki.swoole.com/wiki/page/328.html
客户端
使用客户端连接服务端
<?php
//连接 swoole tcp服务端
$client = new swoole_client(SWOOLE_SOCK_TCP);
//连接到服务器
if(!$client->connect('127.0.0.1',9501)){
echo '连接失败';
exit;
}
//php cli模式下
fwrite(STDOUT,"请输入消息: ");
$msg = trim(fgets(STDIN));
//向服务器发送数据
if (!$client->send($msg))
{
echo '发送失败';exit;
}
//从服务器接收数据
$data = $client->recv();
if (!$data)
{
echo '接收失败';exit;
}
echo $data."\n";
//关闭连接
$client->close();
与服务端类似,先new一个swoole_client对象,参数是swoole的常量SWOOLE_SOCK_TCP 代表这是一个TCP客户端
connect连接服务端,传递ip和端口.返回值是true 或false
这里的fwrite(STDOUT,"请输入消息: ")视频里老师说的是swoole是基于PHP cli模式运行的 使用CLI的常量,以后再说,可以参考下PHP手册 http://php.net/manual/zh/features.commandline.php 具体运行效果如下:
在后面输入数据.会被fgets(STDIN)接收.然后下面使用send发送给服务端
send函数 , 向服务端发送数据,成功返回发送数据的长度,失败返回false
recv接收服务端发送给客户端的数据 , 成功收到数据返回字符串, 连接关闭返回空字符串失败返回 false,并设置$client->errCode属性
2.UDP客户端
与TCP一样 , 不过在new swoole_client客户端的时候,传递SWOOLE_SOCK_UDP常量,代表UDP模式
<?php
/**
* SWOOLE_SOCK_UDP 代表UDP模式
*/
$client = new swoole_client(SWOOLE_SOCK_UDP);
//连接 与服务端的host和poet一致
if(!$client->connect('127.0.0.1',9502)){
echo '连接失败';
die;
}
/**
* PHP CLi模式下的一个常量
*/
fwrite(STDOUT,'请输入消息: '); //输入消息
$msg = trim(fgets(STDIN)); //返回值就是输入的消息
//发送消息给 tcp 服务端
$client->send($msg);
//接收来自server服务端的返回消息
$res = $client->recv();
echo $res."\n";
3.HTTP客户端
不用了…直接用浏览器访问对应的ip和端口就可以了.