首先,了解一下thinkphp的運(yùn)行機(jī)制。
TP5運(yùn)行機(jī)制:
任何請求都會經(jīng)過tp5的入口文件,載入框架的配置文件,啟動(dòng)進(jìn)程,然后處理請求。
在這個(gè)index.php的入口文件中,可以看到,它先定義的APP_PATH這個(gè)常量,然后引入的框架的啟動(dòng)文件start.php,那我們就去看下start.php這個(gè)文件做了些什么。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
在這里,它先加載了基礎(chǔ)文件base.php,然后啟動(dòng)框架run,這個(gè)時(shí)候就開始處理請求了。
常規(guī)的nginx,apache服務(wù)器,每次請求來到thinkphp,會清除靜態(tài)變量,重新加載配置文件。但是,swoole做的服務(wù)器,是常駐進(jìn)程,在啟動(dòng)服務(wù)后,會產(chǎn)生多個(gè)進(jìn)程,來處理請求。我們要讓它選擇性的加載配置。
<?php $http = new swoole_http_server("0.0.0.0", 8888); $http->set( ????[ ????????'enable_static_handler'?=>?true, ????????'document_root'?=>?"/data/wwwroot/zhibo/public/static", ????????'worker_num'?=>?5,//產(chǎn)生進(jìn)程的個(gè)數(shù) ????] ); $http->on('WorkerStart',function?($ser,$worker_id){ ????define('APP_PATH',?__DIR__?.?'/../application/'); ????require?__DIR__?.?'/../thinkphp/base.php'; }); $http->on('request',?function($request,?$response)?use($http)?{ ????if(isset($request->header)){ ????????foreach?($request->header?as?$k=>$v){ ????????????$_SERVER[strtoupper($k)]?=?$v; ????????} ????} ????if(isset($request->server)){ ????????foreach?($request->server?as?$k=>$v){ ????????????$_HEADER[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; ????????} ????} ????//?執(zhí)行應(yīng)用并響應(yīng) ????//開啟緩存 ????ob_start(); ????try{ ????????thinkContainer::get('app',?[APP_PATH])->run()->send(); ????}catch?(Exception?$e){ ????} ????$res?=?ob_get_contents(); ????ob_end_clean(); ????$response->end($res); ????//$http->close(); }); $http->start();
代碼說明:
(1)$http->onWorkerStart:啟動(dòng)進(jìn)程的時(shí)候,加載thinkphp的框架文件,base.php,但是這個(gè)時(shí)候,不能run,等待請求來了再去run。
(2)$http->onrequest:當(dāng)收到客戶端的請求時(shí),把swoole的header頭信息,server信息,get數(shù)據(jù),post數(shù)據(jù)等消息轉(zhuǎn)化為常規(guī)的$_SERVER,$_GET等信息,可以適配tp5。
(3)最后開始run,這個(gè)時(shí)候需要把run得到的信息加載到緩存,然后再通過send()返回給客戶端。
Swoole適配thinkphp5
因?yàn)閟woole是常駐進(jìn)程,前一個(gè)請求的$_POST,$_GET請求不會銷毀,原因這個(gè)進(jìn)程并沒有kill,這個(gè)時(shí)候,需要在接收請求的時(shí)候,將$_GET,$_POST置空。
swoole路由機(jī)制,總會從緩存中獲取有沒有這個(gè)請求,如果有,就不加載新的,所以,swoole常駐內(nèi)存,會發(fā)現(xiàn)一直請求第一個(gè)url。除非重啟swoole服務(wù)器。
在thinkphp框架里面,修改Request文件,將兩個(gè)方法(pathinfo,path)里面的$this->path這個(gè)為空的判斷去掉,讓每次請求都去解析這個(gè)url。
驗(yàn)證結(jié)果:
以上內(nèi)容僅供參考!
想了解更多相關(guān)內(nèi)容請?jiān)L問php中文網(wǎng):thinkphp教程