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数据