Swoole 结合TP5创建http服务
下载TP5框架,在项目根目录下创建server目录
http_service.php
<?php
//创建服务
$http = new swoole_http_server("0.0.0.0", 8811);
//设置参数
$http->set(
[
'enable_static_handler' => true, //开启静态资源目录
'document_root' => "/home/work/hdtocs/swoole_mooc/thinkphp/public/static", //设置静态资源目录
'worker_num' => 4, //开启进程数
]
);
//WorkerStart事件监听进程启动
//进程启动时发生,这里创建的对象可以在进程生命周期内使用
//在进程启动时加载ThinkPHP框架,启动程序放在request回调中
$http->on('WorkerStart', function(swoole_server $server, $worker_id) {
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架里面的文件
require __DIR__ . '/../thinkphp/base.php';
});
//监听用户请求
//ThinkPHP Request对象是从PHP系统超全局数组 $_SERVER/$_GET/$_POST/$_SESSION 中获取访问信息,所以需要对这些数组进行初始化
//因为进程会常驻在内存中,所以在一次请求结束后相关的信息不会被销毁,因此需要在赋值手动清空
$http->on('request', function($request, $response) use($http){ $_SERVER = [];
if(isset($request->server)) {
foreach($request->server as $k => $v) {
$_SERVER[strtoupper($k)] = $v;
}
}
if(isset($request->header)) {
foreach($request->header as $k => $v) {
$_SERVER[strtoupper($k)] = $v;
}
} $_GET = [];
if(isset($request->get)) {
foreach($request->get as $k => $v) {
$_GET[$k] = $v;
}
} $_POST = [];
if(isset($request->post)) {
foreach($request->post as $k => $v) {
$_POST[$k] = $v;
}
} $_COOKIE = [];
if(isset($request->cookie)) {
foreach($request->cookie as $k => $v) {
$_COOKIE[$k] = $v;
}
}
//开启ob
ob_start();
// 执行应用并响应
try {
think\Container::get('app', [APP_PATH])
->run()
->send();
}catch (\Exception $e) {
// todo
}
//从ob中读取数据返回给客户端
$res = ob_get_contents();
ob_end_clean();
$response->end($res);
}); $http->start();
因为进程会常驻在内存中,所以在一次请求结束后相关的信息不会被销毁,导致请求路径发生变化时程序仍定位到前一次请求的方法,
原因:是因为TP框架在Request类中对pathinfo进行判断,如果已存在则不再从$_SERVER中读取
解决方案:在/thinkphp/library/think/Request.php pathinfo方法和path方法中修改判断条件,使得每次请求都重新加载pathinfo 在请求时使用 域名:端口/模块/控制器/方法?参数 的方法访问时无法定位模块
域名:端口/?s=模块/控制器/方法?参数 使用这种方法可以解决
Swoole 结合TP5创建http服务的更多相关文章
- swoole中websoket创建在线聊天室(php)
swoole中websoket创建在线聊天室(php) swoole现仅支持Linix,macos 创建websocket服务器 首先现在服务器创建一个websocket服务器 <?php // ...
- 用C#创建Windows服务(Windows Services)
用C#创建Windows服务(Windows Services) 学习: 第一步:创建服务框架 创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(W ...
- 玩转Windows服务系列——创建Windows服务
创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...
- WCF入门教程(二)如何创建WCF服务
WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...
- .Net创建windows服务入门
本文主要记录学习.net 如何创建windows服务. 1.创建一个Windows服务程序 2.新建安装程序 3.修改service文件 代码如下 protected override void On ...
- C# 创建Windows服务
创建windows服务项目 2 右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3 代码中OnStart用于执行服务事件,一般采用线程方式执行方法,便于隔一段事件执行一回 END ...
- 使用Topshelf创建Windows服务
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
- Dubbo_创建Dubbo服务并在ZooKeeper注册,然后通过Jar包执行
一.安装ZooKeeper(略) 二.创建Dubbo服务 1.DemoService 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- 使用BPEL创建Web服务组合
http://www.cnblogs.com/ahhuiyang/archive/2012/12/18/2824131.html 为简单起见,本例的Web服务组合只调用一个Web Service AP ...
随机推荐
- ALGO-27_蓝桥杯_算法训练_FBI树(树,递归)
问题描述 我们可以把由“”和“”组成的字符串分为三类:全“”串称为B串,全“”串称为I串,既含“”又含“”的串则称为F串. FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种.由一个长 ...
- S型顺序遍历二叉树(c++实现)
//1.s型顺序访问二叉树,默认先左后右:利用两个栈来实现:如果先右后左的话,改变一下入栈的顺序就行 //2.注意s1 s2插入栈的顺序是不同的 void S_LevelOrderPrint(Tree ...
- Unity单例
引自:http://www.unitymanual.com/thread-16916-1-1.html
- Ubuntu 14.10 下Eclipse操作HBase
环境介绍 64位Ubuntu14.10,Hadoop 2.5.0 ,HBase 0.99.0 准备环境 1 安装Hadoop 2.5.0,可参考http://www.cnblogs.com/liuch ...
- java高并发编程(三)
java高并发主要有三块知识点: synchronizer:同步器,在多个线程之间互相之间怎么进行通讯,同步等: 同步容器:jdk提供了同步性的容器,比如concurrentMap,concurren ...
- PAT 乙级 1069 微博转发抽奖(20) C++版
1069. 微博转发抽奖(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 小明PAT考了满分,高兴之余决定 ...
- PAT 乙级 1008 数组元素循环右移问题 (20) C++版
1008. 数组元素循环右移问题 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 一个数组A中存有N(N>0)个整数,在不允 ...
- python 指定文件编码的方法
import sys reload(sys) sys.setdefaultencoding('utf-8')
- SFINAE简单实例
SFINAE(Substitution failure is not an error),是C++11以来推出的一个重要概念,这里,只是简单举一个例子,可能会有人需要. // 添加 scalar nu ...
- ORM的单表操作
ORM的单表操作 MTV框架包含一个重要的部分就是ORM----对象关系映射(Object Relational Mapping),它实现了数据模型与数据库的解耦,即数据模型的设计.利用它我们不需要依 ...