swoole学习之二:入门小实例
下面这几个实例都来源于swoole官网,某些地方稍微改了下。
一:HTTP
基于swoole构建一个简单的http服务器,类似于nginx和apache,不过没有这么强大,这个例子只有简单的请求和响应。
1:先创建一个http.php文件。
<?php
//初始化http服务,绑定端口9501,IP为160
$ip = '192.168.17.160';
$http = new swoole_http_server($ip, 9501); //swoole_http_server 继承自 swoole_server
//服务器启动后响应信息
$http->on("start", function ($server)use($ip) {
echo "Swoole http server is started at $ip:9501\n";
});
//该服务收到请求时的响应,这里可以设置响应头,响应内容,可以获取请求的参数
$http->on("request", function ($request, $response) {
$response->header("Content-Type", "text/plain"); //响应头
print_r($request->get); //输出GET请求参数
$response->end("Hello World\n"); //响应内容
});
$http->start(); //启动服务
2:CGI方式运行程序
$ /usr/local/php/bin/php http.php #找到php位置
可以看到,红色部分为启动后响应的信息
3:客服端访问
因为我们是http服务,我们就用浏览器访问一下
成功输出
我们加点参数
这里我们GET一个name=李小龙的参数,看看服务有没有收到这个参数
可以看到数据成功接收。
二:TCP
创建TCP服务端,tcp_server.php
<?php
$ip = '192.168.17.160';
//创建TCP服务
$server = new swoole_server($ip, 9503);
//服务启动后响应信息
$server->on("start", function ($server)use($ip) {
echo "Swoole tcp server is started at $ip:9503\n";
});
//服务链接时响应信息
$server->on('connect', function ($server, $fd){
echo "connection open: {$fd}\n";
});
//接受消息后返回信息
$server->on('receive', function ($server, $fd, $reactor_id, $data) {
$server->send($fd, "Swoole: {$data}");
$server->close($fd);
});
//链接关闭时返回信息
$server->on('close', function ($server, $fd) {
echo "connection close: {$fd}\n";
});
//启动服务
$server->start();把程序跑起来:

我们用客服端工具链接一下:
这张图展示了链接和发送,以及断开过程
用程序演示一下这个过程,新建一个tcp_client.php
<?php
/*创建客户端
SWOOLE_SOCK_TCP:tcp socket
SWOOLE_SOCK_ASYNC:异步客户端 */
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
//发送数据 hello world
$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";
});
//链接 0.5:网络IO的超时:0.5s
$client->connect("192.168.17.160", 9501, 0.5); 前面我们启动了服务端,现在运行一下客服端,客服端会链接TCP服务端,然后发出hello world。
可以看到服务端返回了我们发送的消息
服务端本身也记录了过程日志
三:UDP
在swoole中,TCP和UDP的使用方法差不多,只要修改几个配置即可
//创建TCP服务端,默认为TCP $server = new swoole_server($ip, 9503); //TCP客服端:SWOOLE_SOCK_TCP $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); //创建UDP服务端:SWOOLE_SOCK_UDP $server = new swoole_server($ip, 9503,SWOOLE_PROCESS, SWOOLE_SOCK_UDP); //UDP客服端:SWOOLE_SOCK_UDP $client = new swoole_client(SWOOLE_SOCK_UDP, SWOOLE_SOCK_ASYNC);
四:WebSocket
新建websocket.php
<?php
$ip = '0.0.0.0';
//创建websocket服务端
//swoole_websocket_server 继承swoole_http_server
$server = new swoole_websocket_server($ip, 9504);
//链接时响应
$server->on('open', function($server, $req) {
echo "connection open: {$req->fd}\n";
});
//响应消息
$server->on('message', function($server, $frame) {
echo "received message: {$frame->data}\n";
$server->push($frame->fd, json_encode(["hello", "world"]));
});
//链接关闭时返回信息
$server->on('close', function($server, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();启动后,用chrome浏览器模拟一下JS: // 打开一个 web socket
var ws = new WebSocket("ws://192.168.17.160:9504");
ws.onopen = function()
{
// Web Socket 已连接上,使用 send() 方法发送数据
ws.send("Test数据");
alert("数据发送中...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert("数据已接收...");
};
ws.onclose = function()
{
// 关闭 websocket
alert("连接已关闭...");
};
F12->Console,粘贴以上js,然后回车运行
再去看看服务端:
可以看到php 服务端已经接受到信息:Test数据