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