swoole中http_server的配置与使用
swoole中为我们提供了一个swoole_http_server类,方便我们处理http请求。
但是它对http协议的支持并不完整,所以一般建议在前面加一层nginx进行代理,对于php文件的处理交由swoole处理。
一、创建一个简单的http服务
<?php //创建一个http server服务
$server = new swoole_http_server('0.0.0.0', 8888); $server->set([
'package_max_length' => 1024 * 1024 * 10,
//设置文件上传的临时目录
'upload_tmp_dir' => __DIR__ . '/uploads/',
]); //设置request事件回调
//函数有两个参数:
//swoole_http_request对象,负责http请求相关信息
//swoole_http_response对象,负责向客户端响应相关信息
$server->on('request', function (swoole_http_request $request, swoole_http_response $response) {
//请求的头部信息
var_dump($request->header); //请求相关的服务器信息,相当于PHP中的$_SERVER
var_dump($request->server); //请求的GET参数,相当于PHP中的$_GET
var_dump($request->get); //请求的POST参数,相当于PHP中的$_POST
var_dump($request->post); //请求的COOKIE信息
var_dump($request->cookie); //文件上传信息,文件大小不超过package_max_length的值
var_dump($request->files); //获取原始POST请求数据,相当于fopen('php://input');
var_dump($request->rawContent()); //获取完整http请求报文
var_dump($request->getData()); //向客户端发送信息
$response->end('hello');
}); //启动服务
$server->start();
二、处理静态文件
swoole中已经帮我们内置了两个配置参数,只需要简单配置一下就可以实现。
不过功能简易,不建议外网使用,有需求的可以自已实现。
<?php $server = new swoole_http_server('0.0.0.0', 8888); $server->set([
//配置静态文件根目录
'document_root' => __DIR__ . '/statics/',
//开启静态文件请求处理功能,这样当请求的是一个静态文件时,swoole自动会在上面配置的目录中查找并返回
'enable_static_handler' => true,
]); $server->on('request', function ($request, $response) { }); $server->start();
三、处理文件上传
<?php //创建一个http server服务
$server = new swoole_http_server('0.0.0.0', 8888); $server->set([
//文件上传大小不超过该值
'package_max_length' => 1024 * 1024 * 50,
//设置文件上传的临时目录
'upload_tmp_dir' => __DIR__ . '/tmp/',
'upload_dir' => __DIR__ . '/uploads/',
'document_root' => __DIR__ . '/statics/',
'enable_static_handler' => true,
]); $server->on('request', function ($request, $response) use ($server) {
if ($request->server['path_info'] == '/upload') {
$tmp = $request->files['upload']['tmp_name'];
$upload = $server->setting['upload_dir'] . $request->files['upload']['name'];
if (file_exists($tmp) &&
move_uploaded_file($tmp, $upload)) {
$response->header('Content-Type', 'text/html; charset=UTF-8');
$response->end('上传成功');
} else {
$response->end('上传失败');
}
}
}); //启动服务
$server->start();
我们在statics目录下创建一个upload.html文件:
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="upload" value="">
<input type="submit" value="提交">
</form>
</body>
</html>
四、处理路由文件自动加载
<?php //创建一个http server服务
$server = new swoole_http_server('0.0.0.0', 8888); $server->set([
//配置项目的目录
'project_path' => __DIR__ . '/src/',
]); $server->on('WorkerStart', function ($server, $worker_id) {
//注册自动加载函数
spl_autoload_register(function ($class) use($server) {
$class = $server->setting['project_path'] . str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php'; if (file_exists($class)) {
include_once $class;
}
});
}); $server->on('request', function ($request, $response) use ($server) {
$pathInfo = explode('/', ltrim($request->server['path_info'], '/')); //模块/控制器/方法
$module = $pathInfo[0] ?? 'Index';
$controller = $pathInfo[1] ?? 'Index';
$method = $pathInfo[2] ?? 'index'; try {
$class = "\\{$module}\\{$controller}";
$result = (new $class)->{$method}();
$response->end($result);
} catch (\Throwable $e) {
$response->end($e->getMessage());
}
}); //启动服务
$server->start();
我们在目录 src 下创建 test 目录,并创建 test.php 文件
<?php namespace Test; class Test
{
public function test()
{
return 'test';
}
}
然后访问 127.0.0.1:8888/test/test/test 就可以看到返回结果了。
通过$request->server['path_info'] 来找到模块,控制器,方法,然后注册我们自已的加载函数,引入文件。实例化类对象,然后调用方法,返回结果。
注意,不要将 spl_autoload_register 放到 onStart 事件回调函数中。
onStart 回调中,仅允许echo、打印Log、修改进程名称。不得执行其他操作。
swoole中http_server的配置与使用的更多相关文章
- WCF学习之旅—WCF4.0中的简化配置功能(十五)
六 WCF4.0中的简化配置功能 WCF4.0为了简化服务配置,提供了默认的终结点.绑定和服务行为.也就是说,在开发WCF服务程序的时候,即使我们不提供显示的 服务终结点,WCF框架也能为我们的服务提 ...
- asp.net中web.config配置节点大全详解
最近网上找了一些关于Web.config配置节点的文章,发现很多都写的都比较零散,而且很少有说明各个配置节点的作用和用法.搜索了一下发现有一篇写的不错,这里引用一下 原文地址 http://www.c ...
- CentOS-7.0.中安装与配置Tomcat-7的方法
安装说明 安装环境:CentOS-7.0.1406安装方式:源码安装 软件:apache-tomcat-7.0.29.tar.gz 下载地址:http://tomcat.apache.org/down ...
- 在Web.config或App.config中的添加自定义配置
.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置,所以忍 ...
- IIS7错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")......
不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的(overrideModeDefault="Deny")...... 解决方案: 因为 II ...
- 深入理解php中的ini配置(1)
这篇文章不会详细叙述某个ini配置项的用途,这些在手册上已经讲解的面面俱到.我只是想从某个特定的角度去挖掘php的实现机制,会涉及到一些php内核方面的知识:-) 使用php的同学都知道php.ini ...
- IIS关于“ 配置错误 不能在此路径中使用此配置节”的解决办法
IIS关于“ 配置错误 不能在此路径中使用此配置节”的解决办法 原文链接:http://www.cnblogs.com/200325074/p/3679316.html 今天刚安装好IIS8.5, 我 ...
- [转]通过继承ConfigurationSection,在web.config中增加自定义配置
本文转自:http://www.blue1000.com/bkhtml/2008-02/55810.htm 前几天写了一篇使用IConfigurationSectionHandler在web.conf ...
- Win7旗舰版中的IIS配置asp.net的运行环境
Win7旗舰版中的IIS配置asp.net的运行环境 以前弄过好多次,都没有成功,昨天晚上不知怎么地就成功了,借用我同学的一句话,这叫“灵光一闪”,废话不多说了,这个成功是有图有视频有真相地哈! ...
随机推荐
- SpringBoot开发准备工作,保存备用,
application.properties server.port=8080 spring.thymeleaf.prefix = classpath:/static/ spring.thymelea ...
- [考试反思]1111csp-s模拟测试110:三思
题目名是为了照应3天的倒计时(我才不会说是因为我考场又摸鱼了) 在OJ上得到了295的好成绩,但是本地评测没有O2掉了10分. 总体来说还可以.T1全场切,T2半场切,T3纯暴力不卡常都有95... ...
- 【algo&ds】9.拓扑排序、AOV&AOE、关键路径问题
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性 ...
- Repeater嵌套
我们自己观察 这是由两个重复项组成的 重复项包含重复项 而重复项的数据源是由订单号决定 即父Repeater的某数据源字段 protected void Repeater1_ItemDataBound ...
- ASP.NET MVC5基础-控制器(Controller)详解
在上文ASP.NET MVC5基础 – MVC文件架构中我们简单了解了下控制器Controller的作用,本文我将详细介绍控制器Controller的使用方法. Controller的运行过程 上文我 ...
- C# 同步转异步 TaskCompletionSource
当我们遇到一些异步执行又无法等待时的逻辑,比如动画的执行. 而业务上又需要等待逻辑的完成,再去处理后续的操作.这时需要转成异步方法 如下,同步执行一个动画后,再输出日志: private async ...
- C# - VS2019 DataGridView导出到Excel的三种方法
//原文出处:http://www.yongfa365.com/Item/DataGridViewToExcel.html 1 #region DataGridView数据显示到Excel /// & ...
- Mybatis专题
Java后端知识点汇总——Java基础专题 全套Java知识点汇总目录,见https://www.cnblogs.com/autism-dong/p/11831922.html 1.什么是Mybati ...
- Eclipse中Junit测试中@Before不执行
场景 在使用Junit进行单元测试时,一部分获取JPA的entityManager的代码将其放在了 @Before标注的方法中,这样每次执行@TEST标注的方法时会首先执行@Before标注的方法. ...
- Java的三种代理模式&完整源码分析
Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCache缓存的实现机制](https://www.c ...