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的运行环境 以前弄过好多次,都没有成功,昨天晚上不知怎么地就成功了,借用我同学的一句话,这叫“灵光一闪”,废话不多说了,这个成功是有图有视频有真相地哈! ...
随机推荐
- 在windows上用apache+mod_wsgi服务部署django项目
之前一直在本地跑django项目,最近尝试在服务器上部署项目,目前已经成功部署,也花了好多时间,这里跟大家交流一下,希望对像我一样的新手有帮助. 一.配置环境: 1.Python版本3.7 2.服务器 ...
- 【使用篇二】Quartz自动化配置集成(17)
出处:https://www.jianshu.com/p/49133c107143 定时任务在企业项目比较常用到,几乎所有的项目都会牵扯该功能模块,定时任务一般会处理指定时间点执行某一些业务逻辑.间隔 ...
- redis启动错误: Warning: no config file specified, using the default config. In order to specify a config
redis启动错误: Warning: no config file specified, using the default config. In order to specify a config ...
- Java连载58-静态内部类、成员内部类详解
一.内部类的分类: (1)静态内部类(2)成员内部类(3)局部内部类(4)匿名内部类 二.静态内部类 1.静态内部类可以等同的看做是静态变量 内部类的重要作用:可以访问外部类中的私有数据 2.静态内部 ...
- IT兄弟连 HTML5教程 CSS3揭秘 CSS3属性2
3 背景属性 在CSS3中提供了多个背景属性,这里只介绍两个比较常用的属性,其他属性可以从手册中获取帮助.在CSS3中,通过background-image或者background属性可以为一个容器 ...
- 分享学习 PHP 源码的方法
每天抽一点时间来看看 PHP 源码方面的书,说实话,无法在调试器下观察 PHP 运行状态的上下文实在是一件痛苦的事情.不过还好不是一无所获,虽然内容比较多,但是掌握方法挨着看下去还是 ...
- PHP实现微信提现(企业付款到零钱)
怎么开通企业付款到零钱? 有的商户号的产品中心是没有这个功能的,不过,该功能的pid(product id)是5,只要随便进去某一个产品,在地址栏把pid改为5. 即可进入该功能页面,进行开通,不过要 ...
- INT 3 中断调试处理流程
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html INT 3 中断调试处理流程 一.调试器如何下INT 3 断点 1 ...
- 应用InstallShield 2015打包软件打包C#程序
大家都明白,程序员写出的程序与用户直接使用的程序之间还有一个简单的环节,就是打包.今天就简单介绍下用InstallShield 2015打包工具进行程序的打包, 有兴趣的可以看看! 首先前面安装打包工 ...
- Swift设置只读(readOnly)属性
class ReadOnly { private(set) var name: String init(_ name: String) { self.name = name } } let obj = ...