前言最近在研究Swoole。原来一直听说Swoole可以提速,一直很迷茫。在学习了Swoole之后,对自己有了一些了解。PHP-CGI的黑历史PHP处理网络请求,大家基本上都是用CGI来做一遍。那么,什么是CGI?CGICGI,全称CommonGatewayInterface,中文称为“通用网关接口”。可能很多人认为CGI就是程序,是的,我以前也这么认为。直到从《图解HTTP》仔细研究了HTTP协议,我才明白CGI是一个协议。任何编程语言都可以实现CGI,所以任何语言都可以作为网站的背景语言(扯远了)。上面PHP-CGI中提到,CGI是一种协议,所以PHP有自己的CGI实现,也就是PHP-CGI。然而,随着技术的发展,人们开始意识到PHP-CGI的性能并不是那么令人满意。我们知道PHP在运行时,依赖于配置文件php.ini。因此,每当PHP-CGI开始工作时,都是一个全新的进程,需要重新加载配置文件并进行初始化,造成了大量的资源和时间浪费。FastCGI那么,我们怎样才能避免这种浪费呢?聪明的程序员又想出了一个办法:为什么我们不预加载配置,然后,每次执行的任务只需要复制当前进程,就不能避免上面的浪费吗?于是,FastCGI诞生了。FastCGI,全称FastCommonGatewayInterface,中文翻译为“快速公网管理接口”。是的,这是另一笔交易。当然,这个协议并不是PHP独有的。Apache(httpd)几乎所有的Web容器都实现了FastCGI功能。第一个是httpd。对于PHP,httpd自己实现了一个FastCGI模块。它将预加载php.ini文件中的配置。当请求进来需要PHP处理时,PHP不需要重新加载php.ini。这也是为什么每次修改php.ini都要重启httpd服务的原因。Nginx和php-fpmphp-fpm也是FastCGI的一个实现。通常我们将Nginx的PHP处理部分代理到php-fpm的端口,交给php-fpm处理。而php-fpm也会预加载配置,然后交给子进程,它会做一些进程的管理。Swoole有个热点问题。php-fpm虽然实现了FastCGI,但是在处理请求的时候还是需要重新运行一个脚本。像Laravel这样的框架,一开始就需要加载这么多的依赖和文件。这不是一个小开销。我们来看看Laravel的public/index.php的源码。require__DIR__.'/../bootstrap/autoload.php';$app=require_once__DIR__.'/../bootstrap/app.php';$kernel=$app->make(Illuminate\Contracts\Http\Kernel::class);$response=$kernel->handle($request=Illuminate\Http\Request::capture());$response->send();$kernel->terminate($request,$response);看前面两条语句,需要加载多少依赖,这个是很多时间和资源的,每一个请求都需要加载,真让人心疼。那么,为什么我们不能像以前那样不用重新加载配置文件就可以使用FastCGI,想出一个不用加载那么多依赖的方法呢?当然可以,这时候Swoole就派上用场了。既然通过$app->make生成了一个新的Kernel对象,那么Application对象$app自然不会发生变化。所以,我们可以在收到请求之前生成$app,这样会很快,不是吗?我们可以对其进行简单的修改。require__DIR__.'/../bootstrap/autoload.php';$app=require_once__DIR__.'/../bootstrap/app.php';$serv=new\Swoole\Server\Http('127.0.0.1',9501);$serv->on('request',function($req,$res)use($app){$kernel=$app->make(Illuminate\Contracts\Http\Kernel::class);$response=$kernel->handle($request=Illuminate\Http\Request::capture());$res->end($response);$kernel->terminate($request,$response);});$服务->开始();好了,我们现在可以通过执行这个脚本来监听9501端口了。然后像Nginx配置php-fpm一样配置它。这样我们可以看到在接收到请求之前,依赖已经加载干净了,剩下的就是处理请求了。当然,我这个修改很简单,根本不能用在生产环境中。我只是举个例子。后记以上只是我自己的理解,是我自己理解的总结。我还在摸索Swoole,因为它需要的东西太多了,需要一点一点的积累。本文可能有问题,欢迎各位大神拍砖!
