php程序是如何被解析的?

薄洪涛6年前PHP1204

我们每天都在写php代码,然后往服务器上一丢,你就发现php文件就运行了,嘿,是不是很神奇,但是有没有想过,php是如何被解释执行的呢?要知道apache,nginx都是不能解析.php文件的;所以想和大家探讨下原理;

首先,安装过lnmp的同学都知道,在安装nginx部署站点的时候,nginx总会带着以下代码

location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    }

估计菜鸟也能看出来,这句话的意思就是,如果我nginx遇到了.php文件,我就不处理,我就交给php的解释器去处理,所以这就引出了fast-cgi这个东西,你看代码中配置了吧

CGI

再说fast-cgi之前,需要先说cgi,其实cgi就是一个协议,就是语言(php)和服务器(nginx)之间的一个桥梁,就是说,只要nginx处理不了的.php我都通过cgi交给php处理,php处理后把结果给nginx,然后nginx返回给浏览器;

但是cgi有个弊端,就是每次请求都会创建一个cgi进程,然后php解释器会加载php.ini,初始化环境,处理.php,然后请求结束后杀死这个cgi进程,这样效率就极低,所以产生了fast-cgi

Fast-CGI

fast-cgi其实就是cgi的改进,就是常驻进程,每次请求不杀死进程也不创建进程,这样性能上就高了很多(这里需要批评下很多文章博客人云亦云,fastcgi是协议协议协议!!!)

下面图片可以点击放大

百度百科:

image.png

wiki:

image.png

wiki大致意思,说fast-cgi是一个通用网关的变体,改善cgi的性能问题(高负载下频繁的进程创建销毁),重用了资源,提升了服务器和cgi下程序关联的效率

php-FPM

是一个实现了fast-cgi协议的程序,并且可以实现进程管理 , 每个子进程都会嵌入php的解释器,去解释php代码,一般会有两种进程master和worker,master进程只有一个,负责监听端口,接收来自nginx的请求(一直监听9000端口),work进程则一般有多个,每个进程内部都嵌入一个php解释器,负责解释php代码;看下图

[root@web ~]# ps -ef|grep php-fpm
www       2009 13180  0 Aug06 ?        00:00:10 php-fpm: pool www //子进程,负责解释php
www       2010 13180  0 Aug06 ?        00:00:10 php-fpm: pool www
root      4110  4079  0 12:52 pts/0    00:00:00 grep --color=auto php-fpm
root     13180     1  0 Jul25 ?        00:00:24 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)   //主进程,负责管理子进程,监听9000端口
www      28694 13180  0 Aug02 ?        00:00:22 php-fpm: pool www

说到这里应该明白了,cgi和fast-cgi是协议和语言无关,php-fpm是实现了fast-cgi的程序,并且监听9000端口

当浏览器请求时,nginx通过location指令(这里有人说是nginx的fast-cgi模块),将所有以php为后缀的文件都交给 127.0.0.1:9000 来处理,也就是php-fpm 的master进程 ,master进程选择并连接到一个子进程去处理php文件,然后返回给nginx,nginx返回给浏览器;这样才算完成了一次请求,注意,这里的子进程数量是由woker_process配置的,一般是auto;

这样我们就把浏览器-nginx-php的流程缕了一遍



标签: nginxphp-fpm

相关文章

YII2独立开发遇到的坑

    之前开发的时候,遇到图片上传什么的都是直接用前辈们配好的插件等等,换了家公司以后,要自己独立开发项目,顿时遇到了问题,开始是项目的配置,然后在添加的时候遇到了图片上传的问题...

Elasticsearch为什么搜索那么快?

Elasticsearch为什么搜索那么快?

介绍Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lu...

Elasticsearch第二篇之数据操作

    上一篇向大家讲解了Elasticsearch的部署安装和基本设置,这篇文章就和大家一起熟悉下Elastic的数据库操作,和普通数据库不同,es库需要公告...

PHP程序猿食用RabbitMQ方法

消息队列是什么?“消息队列”是在消息的传输过程中保存消息的容器。“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中。“消...

php使用curl获取elasticsearch中数据

我最近在做一个电动车的项目,其中,有一个功能是这样的,我需要获取指定车辆的最新的五条位置信息,位置信息是保存到es库中的,我使用的是Yii2.0框架,本来想使用Yii封装的组件去获取数据的,然后觉得麻...

Yii2.0整合ueditor并上传图片到七牛云

Yii2.0整合ueditor并上传图片到七牛云

某个项目要做一个文章模块,用到Ueditor,并且ue中的图片要上传到七牛,所以总结下步骤;1、Yii2.0下载ueditor for Yii2.0和七牛composer require&n...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。