网上类似的文章已经很多了,我也是刚入门。从头开始学习。所以如果重复写文章阐释,反而会浪费时间,于是就自己动手构建了一个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;
}

本文参考:

  1. swoole使用
  2. 理解RESTful架构
  3. PHP实现基于Swoole简单的HTTP服务器

使用Swoole 构建API接口服务的更多相关文章

  1. ASP.NET WebAPI构建API接口服务实战演练

    一.课程介绍 一.王小二和他领导的第一次故事 有一天王小二和往常一下去上早班,刚吃完早餐刚一打开电脑没一会儿.王小二的领导宋大宝走到他的面前,我们现在的系统需要提供服务给其他内部业务系统,我看你平时喜 ...

  2. ASP.NET Core WebApi构建API接口服务实战演练

    一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...

  3. 手把手教你用Abp vnext构建API接口服务

    ABP是一个开源应用程序框架,该项目是ASP.NET Boilerplate Web应用程序框架的下一代,专注于基于ASP.NET Core的Web应用程序开发,也支持开发控制台应用程序. 官方网站: ...

  4. 亿级用户下的新浪微博平台架构 前端机(提供 API 接口服务),队列机(处理上行业务逻辑,主要是数据写入),存储(mc、mysql、mcq、redis 、HBase等)

    https://mp.weixin.qq.com/s/f319mm6QsetwxntvSXpKxg 亿级用户下的新浪微博平台架构 炼数成金前沿推荐 2014-12-04 序言 新浪微博在2014年3月 ...

  5. API接口服务端

    <?php /** * API接口服务端 * * */ require 'mysql_class.php'; header('Content-Type:text/html;charset=utf ...

  6. 怎样提供一个好的移动API接口服务/从零到一[开发篇]

    引语:现在互联网那么热,你手里没几个APP都不好意思跟别人打招呼!但是,难道APP就是全能的神吗?答案是否定的,除了优雅的APP前端展示,其实核心还是服务器端.数据的保存.查询.消息的推送,无不是在服 ...

  7. 四十五:漏洞发现-API接口服务之漏洞探针类型利用修复

    接口服务类安全测试 根据前期信息收集针对目标端口服务类探针后进行的安全测试,主要涉及攻击方法:口令安全,WEB类漏洞,版本漏洞等,其中产生的危害可大可小,属于端口服务/第三方服务类安全测试.一般在已知 ...

  8. Api接口服务的设计和安全解决方案

    这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) 普通网站应 ...

  9. Python Tornado搭建高并发Restful API接口服务

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快能实现高并发.得利于其 非阻塞的方式和对epoll的运用,Torn ...

随机推荐

  1. Git 管理项目

    一个很小的HTML项目,使用.Git来记录和跟踪这个项目.包括以下内容: 创建版本库. 添加与修改文件. 创建新分支. 打标签并整理版本库. 克隆版本库. 创建版本库 Creating a Repos ...

  2. Oracle存储过程编译卡死的解决方法

    转自: https://www.cnblogs.com/liang-ling/p/5395249.html 解决方法如下: 1:查V$DB_OBJECT_CACHE SELECT * FROM V$D ...

  3. 微服务之kong+consul(二)

    一.kong 1.使用kong来做服务网关,目前kong使用的是0.13版本现在地址:https://docs.konghq.com/install,kong的社区版没有dashboard,可以使用k ...

  4. (转)Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

    Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置MapperFactoryBea ...

  5. 【JS】input输入框只能输入数字

    一.实现思路 input只能输入纯数字的思路其实很简单,监听输入框值的变化,每次输入检索输入框的值,将非数字的字段替换成空,再将此值赋予给输入框. 关键代码: \d:匹配数字 ^/d:全文匹配非数字 ...

  6. 【nginx笔记】系统参数设置-使Nginx支持更多并发请求的TCP网络参数

    首先,需要修改/etc/sysctl.conf来更改内核参数.例如,最常用的配置: fs.file-max = 999999 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tc ...

  7. zoj 2723 Semi-Prime(素筛打表+搜索优化)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2723 题目描述: Prime Number Definitio ...

  8. Go语言封装Http协议GET和POST请求

    本文几乎没有文字叙述: /* 有关Http协议GET和POST请求的封装 */ package net import ( "net/http" "io" &qu ...

  9. MyBatis动态添加—trim标签

    做添加时,部分字段有值,没值的字段不添加,这就是动态添加,使用 trim 标签就可以实现. <insert id="insertSysUser" parameterType= ...

  10. Evolution(矩阵快速幂)zoj2853

    Evolution Time Limit: 5 Seconds      Memory Limit: 32768 KB Description Evolution is a long, long pr ...