3.swoole支持thinkPHP5的配置

swoole适配PHP框架

让PHP执行时默认入口文件:public/index

onWorkerStart

<?php
$http = new swoole_http_server('0.0.0.0',8811);
$http->set(
	[
		//让服务指向某一目录
		"enable_static_handler"=>true,
		"document_root" =>"/swoole/project/live/thinkphp5.1/public/static",
		//设置启动进程数
		"worker_num"=>5,
	]
);

//查看thinkphp的入口文件发现 每次执行index都是再引用start文件 再跟进发下了 base.php
//结合onWorkerStart文档 https://wiki.swoole.com/wiki/page/p-event/onWorkerStart.html
$http->on("WorkerStart",function(swoole_server $server, $worker_id){
	//把index.php入口文件内容拿过来
	// 定义应用目录
	define('APP_PATH', __DIR__ . '/../application/');
	//因为把start.php 加入进来会直接执行run 这里直接把base加载过来就好
	require __DIR__.'/../thinkphp/base.php';
});

$http->on("request",function($request,$response){
	//请求服务转换
	$_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
		$_GET = [];//每次请求控制器 这个变量需要置空一下 不然会存储到上一次的变量干扰
	if(isset($request->get)){
		foreach($request->get as $k=>$v){
			$_GET[$k] = $v;
		}
	}	
	//请求POST
	$_POST = [];//每次请求控制器 这个变量需要置空一下 不然会存储到上一次的变量干扰
	if(isset($request->post )){
		foreach($request->post as $k=>$v){
			$_POST[$k] = $v;
		}
	}	
	//请求cookie等
 
  ob_start();
 
	// 执行应用并响应 这样用会报错 因为在命名空间外的一个使用
	try{
			//Container::get('app', [APP_PATH ])
			think\Container::get('app', [APP_PATH ])
		   	->run()
		   	 ->send();
	   	 }catch(\Exception $e){
	   	 
	   	 }
$res = ob_get_contents();
$ob_end_clean();
$response->end($res);
});
$http->start();

//为什么不执行run? run可以理解成控制器运行输出结果,如果这里执行,直接在服务脚本打印了执行结果,这个执行结果应该是给用户界面展示的一个效果,所以这个run,应当在request执行

配置到这里,解决了环境中常应用的$_SERVER $_POST $_GET
发现另外一个问题 访问http://域名?s=index/index/index与http://域名?s=index/index/hello内容一样?
追踪代码run():
App.php 有一处:
// 进行URL路由检测
$dispatch = $this->routeCheck();
追踪:routeCheck()
$path = t h i s &gt; r e q u e s t &gt; p a t h ( ) ; this-&gt;request-&gt;path(); 打印: path 发现这个路由一直不变
分析得出结论:
是由于常住内存导致该问题
找到Request.php类中 追查path() pathinfo()方法。

if (is_null($this->pathinfo)) {}
if (is_null($this->path)) {}

方法中提及 此内存中变量不为空,就继续引用路由,我们把这个判断取消,让每次路由中的地址都是最新的获取即可解决问题。

至此,swoole_http基本就可以满足thinkphp的环境运行。

猜你喜欢

转载自blog.csdn.net/qq_17040587/article/details/83787128