网上类似的文章已经很多了,我也是刚入门。从头开始学习。所以如果重复写文章阐释,反而会浪费时间,于是就自己动手构建了一个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. 人工智能日常应用举例-nlp+视觉(听说看)

  2. laravel 单词

    return view('admin.user.login'); 返回 admin文件夹下, user文件夹中 login文件模板 setcookie 语法 setcookie(name,value, ...

  3. 【learning】多项式开根详解+模板

    概述 多项式开跟是一个非常重要的知识点,许多多项式题目都要用到这一算法. 用快速数论变换,多项式求逆元和倍增法可以在$O(n log n)$的时间复杂度下求出一个$n$次多项式的开根. 前置技能 快速 ...

  4. VS2012 扩展和更新里 插件状态 为禁用 的解决办法!

    在vs2012 里安装完插件,重启VS,结果 插件没有加载,查看 扩展和更新,里面显示禁用,如图: 解决方法: 点击界面上 “启用每用户扩展的加载” 蓝色文字,弹出如下界面: 选中 以管理员运行时加载 ...

  5. 处理html内容,获取纯文本

    import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.rege ...

  6. 使用VS2013 + EF6 连接Mysql数据库

    使用VS2013 + EF6 + .NET4.5 连接Mysql数据库 1.安装插件 在使用Visual Studio 2013添加ADO.NET实体数据模型新建连接时,默认是没有Mysql选项的.此 ...

  7. 关于 luv_letters

    luv_letters是一枚现高二文化课菜鸡,是一枚临汾一中联赛oier(我太菜了),也是一名Cher. (好像没有好的地方 真名不提跟某个当红女明星一样(正经汉子不女装 话说当初选择竞赛科目的时候( ...

  8. PHP语法-该注意的细节

    php in_array(mixed $needle, array $haystack[, bool $strict = FALSE] ) 注意: 一.如果$needle 是字符串,则比较是区分大小写 ...

  9. Hadoop windows 环境配置

    下载 winutils 点击 这里下载 winutils 包,并解压缩. 此处解压缩后目录位置为 D:\software\hadoop2.6 配置环境变量 变量名 变量值 HADOOP_USER_NA ...

  10. 漫画 | Java多线程与并发(一)

    1.什么是线程? 2.线程和进程有什么区别? 3.如何在Java中实现线程? 4.Java关键字volatile与synchronized作用与区别? volatile修饰的变量不保留拷贝,直接访问主 ...