(本文将通俗易懂地讲解一下一个PHP文件是怎么被解析并输出到浏览器的。详情可以参考http协议和nginx,或者在以后得博文中给大家讲解)
一次简单的网络请求就是客户端向服务器发送HTTP(现在都要求是https)请求,服务器会在HTTP响应中回送所有的请求数据。如下图所示:
咱们下面要讲的内容就是基于这张图,但肯定要详细一些。
由本地向服务器发起请求。
比如我们要请求的PHP脚本的url是 http://xxx.xxx.xxx/hello.php
首先浏览器根据http协议解析这个url,xxx.xxx.xxx就是服务器的地址,hello.php这个脚本文件就是要请求的资源。
这就是我们通常说的request请求。Nginx解析PHP文件
我们的浏览器是解析不出PHP文件,它必须通过http协议跟服务器通信,服务器把解析好的PHP文件(解析好后应该是一个静态页面,就像一个HTML文件一样)返回给浏览器,而这里的服务器就是我们通常说的服务器代理nginx、apache等,这里我们只讨论Nginx对PHP文件的解析。Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。
PHP的FastCGI就是PHP-FMP。
FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。(也就是我们会看到nginx配置文件中,fastcgi_pass可以为127.0.0.1:9000(9000这是php-fpm的默认监听端口),或者是/tmp/php-cgi.sock文件)。
说的简单点就是nginx通过一个socket跟fastcgi(php-fpm)通信。2.1 wrapper
为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后Fork(派生)出一个新的线程,这个线程调用解释器(安装的PHP程序)或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;3.服务器返回请求:
当Nignx后接收到解析后的PHP脚本后,再将其通过http协议返回给浏览器,这就是我们常说的response。
下面就以一张的流程图,来清晰的展示这个过程。