站長資訊網
        最全最豐富的資訊網站

        thinkphp5支持swoole攜程嗎

        thinkphp5支持swoole攜程嗎

        首先,了解一下ThinkPHP的運行機制。

        TP5運行機制

        任何請求都會經過tp5的入口文件,載入框架的配置文件,啟動進程,然后處理請求。

        thinkphp5支持swoole攜程嗎

        在這個index.php的入口文件中,可以看到,它先定義的APP_PATH這個常量,然后引入的框架的啟動文件start.php,那我們就去看下start.php這個文件做了些什么。

        thinkphp5支持swoole攜程嗎

        在這里,它先加載了基礎文件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{         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:啟動進程的時候,加載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服務器。

        thinkphp5支持swoole攜程嗎

        在thinkphp框架里面,修改Request文件,將兩個方法(pathinfo,path)里面的$this->path這個為空的判斷去掉,讓每次請求都去解析這個url。

        驗證結果

        thinkphp5支持swoole攜程嗎

        thinkphp5支持swoole攜程嗎

        以上內容僅供參考!

        想了解

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 日产精品99久久久久久| 国产精品99精品无码视亚| 精品无码人妻一区二区三区品| 国产网红主播无码精品| 99re6在线视频精品免费| 中文字幕无码久久精品青草| 国产精品VIDEOSSEX久久发布| 国产乱码精品一品二品| 亚洲а∨天堂久久精品9966| 国产精品黄页免费高清在线观看| 成人精品视频一区二区三区 | 精品久久香蕉国产线看观看亚洲| 中文精品无码中文字幕无码专区| 久久精品国产第一区二区| 午夜精品美女自拍福到在线| 国产精品99精品无码视亚| 久久婷婷国产综合精品| 亚洲精品欧美二区三区中文字幕| 久久精品无码免费不卡| 国产精品最新国产精品第十页 | 国产精品无码成人午夜电影| 亚洲精品无码高潮喷水在线| 亚洲国产精品毛片av不卡在线| 精品久久久久国产免费 | 91精品全国免费观看青青| 久久久久女人精品毛片| 欧美精品VIDEOSSEX少妇| 中文国产成人精品久久不卡| 日韩精品无码永久免费网站| 亚洲精品久久久www| 香蕉国产精品麻豆亚洲欧美日韩精品自拍欧美v国 | 亚洲欧美日韩精品久久| 欧洲精品视频在线观看| 最新国产の精品合集| 精品一区二区久久久久久久网站| 青青草国产精品久久久久| 911亚洲精品国内自产| 亚洲精品无码久久久久久| 久久国产精品偷99| 久久国产精品国语对白| 精品精品国产理论在线观看|