您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關thinkphp5支不支swoole攜程的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
首先,了解一下ThinkPHP的運行機制。
TP5運行機制:
任何請求都會經過tp5的入口文件,載入框架的配置文件,啟動進程,然后處理請求。
在這個index.php的入口文件中,可以看到,它先定義的APP_PATH這個常量,然后引入的框架的啟動文件start.php,那我們就去看下start.php這個文件做了些什么。
在這里,它先加載了基礎文件base.php,然后啟動框架run,這個時候就開始處理請求了。
常規的nginx,Apache服務器,每次請求來到thinkphp,會清除靜態變量,重新加載配置文件。但是,swoole做的服務器,是常駐進程,在啟動服務后,會產生多個進程,來處理請求。我們要讓它選擇性的加載配置。
Swoole來做http服務器
<?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,//產生進程的個數 ] ); $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; } } // 執行應用并響應 //開啟緩存 ob_start(); try{ think\Container::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:啟動進程的時候,加載thinkphp的框架文件,base.php,但是這個時候,不能run,等待請求來了再去run。
(2)$http->onrequest:當收到客戶端的請求時,把swoole的header頭信息,server信息,get數據,post數據等消息轉化為常規的$_SERVER,$_GET等信息,可以適配tp5。
(3)最后開始run,這個時候需要把run得到的信息加載到緩存,然后再通過send()返回給客戶端。
Swoole適配thinkphp5
因為swoole是常駐進程,前一個請求的$_POST,$_GET請求不會銷毀,原因這個進程并沒有kill,這個時候,需要在接收請求的時候,將$_GET,$_POST置空。
swoole路由機制,總會從緩存中獲取有沒有這個請求,如果有,就不加載新的,所以,swoole常駐內存,會發現一直請求第一個url。除非重啟swoole服務器。
在thinkphp框架里面,修改Request文件,將兩個方法(pathinfo,path)里面的$this->path這個為空的判斷去掉,讓每次請求都去解析這個url。
驗證結果:
感謝各位的閱讀!關于“thinkphp5支不支swoole攜程”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。