摘要:前言最近在研究,原來一直聽別人在說可以加速,一直都是懵逼的。,全稱,中文譯作快速公共網(wǎng)管接口。那么,我們?yōu)槭裁床荒芟裰耙粯樱軌虿恢匦录虞d配置文件的,來一個不用加載這么多的依賴的方式呢當(dāng)然可以啦,這時候就派上用場了。
前言
最近在研究Swoole,原來一直聽別人在說Swoole可以加速,一直都是懵逼的。在研究了Swoole之后,我有了一些自己的理解。
PHP-CGI 的黑歷史對于 PHP 處理網(wǎng)絡(luò)請求,大家基本上也都是再用 CGI 的方式來做的。那么,什么是 CGI 呢。
CGICGI,全稱 Common Gateway Interface,中文稱作“公共網(wǎng)關(guān)接口”。也許有很多人認(rèn)為 CGI 是一個程序,沒錯,曾經(jīng)的我也是這么認(rèn)為的。直到我從《圖解HTTP》開始細(xì)細(xì)地研究HTTP協(xié)議之后,我才知道,原來 CGI 是一種協(xié)議。任何編程語言,都可以實現(xiàn) CGI,所以任何語言都可以作為網(wǎng)站的后臺語言(扯遠(yuǎn)了)。
PHP-CGI上面說了,CGI 是一個協(xié)議,所以,PHP 有自己對 CGI 的實現(xiàn),那就是 PHP-CGI。可是呢,隨著技術(shù)的發(fā)展,人們開始意識到,PHP-CGI 的性能不是那么盡如人意。我們知道,PHP 在運行的時候,是依賴配置文件 php.ini的。所以,每當(dāng) PHP-CGI 開始工作的時候,它是完完全全的一個新進(jìn)程,它需要重新加載配置文件并初始化,這就造成了很大的資源和時間的浪費。
FastCGI那么,怎么才能避免這種浪費呢,聰明的程序員們想出了另外一種方法:我們?yōu)槭裁床活A(yù)先加載好配置,然后,每一個執(zhí)行的任務(wù)只需要復(fù)制當(dāng)前的進(jìn)程,不就能避免上面的浪費了么。于是, FastCGI 便橫空出世。
FastCGI,全稱 Fast Common Gateway Interface,中文譯作“快速公共網(wǎng)管接口”。沒錯,這又是個協(xié)議。當(dāng)然,這個協(xié)議并不是因為 PHP 才有的。
Apache (httpd)幾乎所有的 Web 容器都實現(xiàn)了 FastCGI 的功能。首先是 httpd。對于 PHP 來說,httpd 是通過自身來實現(xiàn)一個 FastCGI 的模塊的。它會預(yù)先加載好 php.ini 文件中的配置。待到有請求進(jìn)入需要 PHP 處理時,PHP 就不需要再對 php.ini 重新加載了。這也就是每改動過 php.ini 后都要重啟 httpd 服務(wù)的原因。
Nginx 與 php-fpmphp-fpm 也是 FastCGI 的一種實現(xiàn)。通常我們是將 Nginx 的 PHP 處理部分代理到 php-fpm 的端口上,交給 php-fpm 來處理。而 php-fpm 同樣是通過預(yù)先加載配置,然后給到子進(jìn)程的方式的,它會對進(jìn)程做一些管理。
Swoole辣么問題來了,php-fpm 雖然實現(xiàn)了 FastCGI,但是,它在處理請求的時候,依然要重新運行一個腳本,像 Laravel 一樣的框架,一開始就要加載辣么多依賴和文件,依然是一個不小的開銷。我們看一下 Laravel 的 public/index.php 的源碼。
require __DIR__."/../bootstrap/autoload.php"; $app = require_once __DIR__."/../bootstrap/app.php"; $kernel = $app->make(IlluminateContractsHttpKernel::class); $response = $kernel->handle( $request = IlluminateHttpRequest::capture() ); $response->send(); $kernel->terminate($request, $response);
看看前面兩條語句,這需要加載多少個依賴啊,這都是大把大把的時間和資源啊,每一次請求都需要加載一邊,真是心疼啊。
那么,我們?yōu)槭裁床荒芟裰耙粯樱軌虿恢匦录虞d配置文件的 FastCGI ,來一個不用加載這么多的依賴的方式呢?
當(dāng)然可以啦,這時候 Swoole 就派上用場了。既然是通過 $app->make 的方式來生成一個新的 Kernel 對象,那么 Application 的對象 $app 自然是不會有什么改變的了。所以,我們可以在收到請求之前,就把 $app 給生成好,這樣就會快了,不是么?我們可以對它進(jìn)行一個簡單的改造。
require __DIR__."/../bootstrap/autoload.php"; $app = require_once __DIR__."/../bootstrap/app.php"; $serv = new SwooleServerHttp("127.0.0.1", 9501); $serv->on("request", function ($req, $res) use ($app) { $kernel = $app->make(IlluminateContractsHttpKernel::class); $response = $kernel->handle( $request = IlluminateHttpRequest::capture() ); $res->end($response); $kernel->terminate($request, $response); }); $serv->start();
好了,我們現(xiàn)在就可以通過執(zhí)行這個腳本來監(jiān)聽9501端口了。然后就像 Nginx 配置 php-fpm 一樣來配置它就可以了。這樣我們可以看到,在收到請求之前,就已經(jīng)把依賴加載干凈了,剩下的就是處理請求了。
當(dāng)然我的這個改動很簡陋,根本無法用于生產(chǎn)環(huán)境的,只是提供一個例子。
后記以上只是我自己的理解和對我自己的理解進(jìn)行的總結(jié)。對于 Swoole 我還在探索當(dāng)中,因為它需要的只是實在是太多了,需要一點一點積累。本文可能有不對的地方,歡迎各位大神來拍磚!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22994.html
摘要:負(fù)責(zé)解釋執(zhí)行文件生成響應(yīng),最終返回給,展現(xiàn)至前端。相比于傳統(tǒng)架構(gòu),進(jìn)程模型最大的特點在于其多線程模式處理網(wǎng)絡(luò)請求,使得其能輕松應(yīng)對大量連接。這要求開發(fā)人員對于多進(jìn)程的運行模式有更清晰的認(rèn)識更容易內(nèi)存泄露。 一、SwooleSwoole號稱重新定義了PHP,它是一個PHP擴展,使得PHP可以使用異步的方式執(zhí)行,就像node一樣,而且還能使用socket,為PHP提供了一系列異步IO、事件...
摘要:是為開發(fā)的生產(chǎn)級異步編程框架。因為單個請求創(chuàng)建的環(huán)境在請求執(zhí)行結(jié)束后會立即銷毀。可以提供強大性能而則可以提供優(yōu)雅代碼結(jié)構(gòu)使用。在使用這個包之前,請確保你的機器安裝了正確的。建立并運行起來現(xiàn)在,你可以執(zhí)行以下的命令來啟動服務(wù)。 showImg(https://segmentfault.com/img/bVbaF89?w=1240&h=634); Swoole?是為 PHP 開發(fā)的生產(chǎn)級異...
摘要:因為為單個請求創(chuàng)建的環(huán)境將在請求過程完成后立即銷毀。可以成為強大的性能增強器,提供了優(yōu)雅的結(jié)構(gòu)和代碼使用方式。你可以使用此命令快速安裝它,并訪問官方網(wǎng)站獲取更多信息。注意目前僅支持和。服務(wù)器不能使用。基準(zhǔn)測試使用進(jìn)行干凈的測試。 Swoole 是針對PHP的生產(chǎn)級異步編程框架。它是一種用純C語言編寫的PHP擴展,它使PHP開發(fā)人員能夠在PHP中編寫高性能,可擴展的并發(fā)TCP,UDP,U...
摘要:前言最近在研究,原來一直聽別人在說可以加速,一直都是懵逼的。,全稱,中文譯作快速公共網(wǎng)管接口。那么,我們?yōu)槭裁床荒芟裰耙粯樱軌虿恢匦录虞d配置文件的,來一個不用加載這么多的依賴的方式呢當(dāng)然可以啦,這時候就派上用場了。 前言 最近在研究Swoole,原來一直聽別人在說Swoole可以加速,一直都是懵逼的。在研究了Swoole之后,我有了一些自己的理解。 PHP-CGI 的黑歷史 對于 ...
摘要:如需要支持熱啟動,請自行谷歌,大概原理就是用監(jiān)控文件變更,如果更新了重啟如果正式環(huán)境中還可以自己寫個部署腳本,后重啟服務(wù)等,方法很多不一一列舉。 1 Laravel的速度瓶頸在哪? 1.1 已有的一些優(yōu)化方法 1.1.1 laravel官方提供了一些優(yōu)化laravel的優(yōu)化方法 php artisan optimize php artisan config:cache php arti...
閱讀 2226·2021-09-30 09:47
閱讀 989·2021-08-27 13:01
閱讀 2973·2019-08-30 15:54
閱讀 3696·2019-08-30 15:53
閱讀 837·2019-08-29 14:07
閱讀 726·2019-08-28 18:16
閱讀 813·2019-08-26 18:37
閱讀 1420·2019-08-26 13:27