网上类似的文章已经很多了,我也是刚入门。从头开始学习。所以如果重复写文章阐释,反而会浪费时间,于是就自己动手构建了一个demo,使用swoole 的TCP 服务器接受TCP客户端的发来的http请求,然后将GET请求简单分割,获取需要的参数,然后将参数重新返回给TCP客户端。这个例子,旨在说明TCP 是属于传输层,而我们获取HTTP请求后,怎样解析发送过来的文本是属于应用层,也就是平时apache 或者nginx帮我们做好的工作。
以下是全部代码,因为是练习代码,所以命名不太规范。本想要解析post请求和GET请求,但是实践之后发现,POST请求比较难解析,而已swoole已经有了完善的swoole_http_server 这个工具,可以帮助我处理好一些繁琐的准备工作,下面的代码只是用来展示自己对swoole的一些流程和理解,欢迎各位好友共同探讨。
<?php
/**
* 用swoole 搭建一个API服务器
*/
$serv = new swoole_server('127.0.0.1', 9888, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
$serv->set(array(
'worker_num' => 4,
'daemonize' => false,
'backlog' => 128,
));
$serv->on('Connect', 'onConnect');
$serv->on('Receive', 'onReceive');
$serv->on('Close', 'onClose');
$serv->start();
/**
*Http建立连接回调函数
*/
function onConnect($serv, $fd)
{
echo "Server is running on 127.0.0.1:9888".PHP_EOL;
}
/**
* 开始接受客户端信息回调函数
*/
function onReceive($serv, $fd, $from_id, $data)
{
formatRequest($serv, $fd, $data);
}
/**
* 连接关闭后回调函数
*/
function onClose($serv, $fd)
{
return false;
}
/**
* 封装response 的内容
*/
function response($serv, $fd, $res_data='')
{
//响应行
$response = array(
'HTTP/1.1 200',
);
//响应头
$headers = array(
'Server'=>'SwooleServer',
'Content-Type'=>'text/html;charset=utf8',
'Content-Length'=>strlen($res_data),
);
foreach($headers as $key=>$val){
$response[] = $key.':'.$val;
}
//空行
$response[] = '';
//响应体
$response[] = $res_data;
$send_data = join("\r\n",$response);
$serv->send($fd, $send_data);
}
function formatRequest($serv, $fd, $data)
{
$tmp_data = explode("\r\n", $data);
if (!is_array($tmp_data) || empty($tmp_data)) return false;
$request_info = explode(" ", $tmp_data[0]);
if (!is_array($request_info) || empty($request_info)) return false;
switch ($request_info[0]) {
case 'GET':
$tmp_str = urldecode($request_info[1]);
$query_info = parse_url($tmp_str);
$query = $query_info['query'];
$path = $query_info['path'];
global $_GET;
parse_str($query, $_GET);
response($serv, $fd, json_encode($_GET));
break;
case 'POST':
//needs some code
break;
default:
return false;
break;
}
}
function urlRouter()
{
}
/*
* 注册全局的变量POST参数
* 注册全局的变量GET参数
*/
function register_global_request_var($data, $type)
{
return false;
}
本文参考: