这里不是说php语言从5.x版本到7.x版本达到的速度的巨大提升。而是想说下从web请求的构架上,有哪些改变。
随着传统的静态页面开发,到动态交互网站,web服务器需要扩展php或者python的服务,来处理业务逻辑和连接数据库。这个时候CGI应运而生。
1.CGI和FastCGI
CGI在通讯中起到了一个翻译的作用,把nginx获取的网络请求翻译给php,再把php的执行结果翻译给nginx。举个所有phper都熟悉的东西,$_SERVER全局变量,就是从CGI读取来的。
每当客户请求CGI的时候,web服务器就请求操作系统生成一个新的CGI解释器进程,CGI的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。当然,这样在访问量很少没有并发的情况也行。可是当访问量增大,并发存在,这种方式就不适合了。于是就有了FastCGI。除了要不断的创建和销毁,每次创建都要重新读取php.ini和一些
FastCGI是CGI的管理器,在启动nginx的时候,FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web服务器的连接;当客户端请求到达web服务器时,FastCGI进程管理器选择并连接到一个CGI解释器。web服务器将CGI环境变量和标准输入发送到FastCGI子进程中。FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web服务器。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器的下一个连接。因为减少了创建和销毁,所以速度有了进一步提升。
2.PHP-FPM
PHP-FPM就是给php用的优化版本的FastCGI,nginx接收到请求以后,会把消息推给FastCGI所在的端口,因为nginx本身就是做反向代理的。PHP-FPM用master进程监听端口,用work进程来接收请求。
3.opcode和opcache
php是解释型语言,所以每次执行都要编译。一般情况线上代码是不会改变的,所以,有了opcache,通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。这也大大提升了php的速度。
4.swoole
随着业务的增大,即使是编译过代码也是庞大的,每次都要载入也很慢,swoole解决了这个问题。让 PHP 的代码加载到内存后,拥有更长的生命周期,这样建立的数据库连接和其他大的对象,不被释放。每次请求只需要处理很少的代码,而这些代码只在第一次运行时,被 PHP 解析器编译,驻留内存。另外,之前 PHP 不能实现的,对象持久化、数据库连接池,缓存连接池都可以实现。系统的运行效率会大大提高。他做微服务是把好手。