嘟嘟社区

[经验] 正在写一个手册,顺便发一下php执行的基础原理


本帖最后由 kaleok 于 2021-11-2 14:26 编辑

php运行模式
PHP在服务器工作中分命令行模式和网页解析器模式两种
1、PHP命令行模式
PHP命令行模式又叫CLI模式,PHP-CLI是PHP Command Line Interface的简称,如同它名字的意思,就是PHP在命令行运行的接口,区别于在Web服务器上运行的PHP环境(PHP-CGI,ISAPI等)。 也就是说,PHP不单可以写前台网页,它还可以用来写后台的程序。 PHP的CLI Shell脚本适用于所有的PHP优势,使创建要么支持脚本或系统甚至与GUI应用程序的服务端,在Windows和Linux下都是支持PHP-CLI模式的。
在linux系统中,PHP的CLI可执行文件入口一般存放在PHP安装目录/bin下的php无后缀.file二进制文件,PHP属于解析性脚本语言。所以PHP可以指定解释脚本独立运行,比如/usr/local/php/bin/php  /home/1.php
同时如果系统环境变量中已经配置好PHP的执行路径,可以直接:php /home/1.php你需要运行的PHP脚本。
在windows系统中,PHP同样存在php.exe CLI执行文件。你可以双击执行,但双击执行没有加载需要执行的脚本代码,所以可以理解为可视化编程控制台。但同样可以 /路径/php.exe 1.php的方式加载已经编写好的脚本文件执行。
由于cli模式的PHP没有其他软件的管理,可以理解为独立运行的php进程,因此没有超时一说,只要你的脚本逻辑未执行完成,php进程会一直存在。所以在CLI模式下的独立脚本中,可以充分利用php易编写,多内置函数,以及创建子进程等特性开发出优秀的数据处理功能。当然也可以利用流行的swoole等多协程扩展,可以开发出高性能的并发业务功能等。
但需要注意的是,PHP单独运行,只能理解为是本机应用,没有server服务器端的理解。所以PHP的超全局变量$_SERVER,$_POST,$_GET等是不存在的。
同时需要注意:cli模式下运行的php没有站点目录的限制,站点目录的划分实际上是服务器引擎软件nginx等软件的功能,其通过配置限制了php-fpm读取其他目录的权限,但cli模式下的php却可以读取任意目录文件。
2、网关运行模式即CGI模式-Common Gateway Interface
实际上一个PHP动态网页服务器,至少存在:WEB服务器引擎(NGINX,APACHE,IIS,KANGLE),PHP,MYSQL 三种软件互相配合运行,才能算是一个完整的动态网页服务器。但如果只安装一个web服务器引擎(NGINX,APACHE,IIS,KANGLE)之一,也能算是一个网页服务器,但只能算静态网页服务器,也就是只能访问打开.html,.htm后缀的静态网页文件,以及图片,视频等静态资源。
而在PHP动态服务器当中,PHP的工作原理与CLI模式区别很大。
根据不同的web服务器引擎,可以细分为FastCGI模式,mod_php5模块模式,ISAPI模式等。
其中FastCGL模式是比较流行通用的模式。在NGINX服务器引擎中,以php-fpm可执行文件为入口。其工作原理为php-fpm作为NGINX与php之间的桥梁,起到PHP进程管理的作用。
当nginx等web服务器引擎接收到用户浏览器请求后,根据请求路径资源,如果发现是静态资源,比如.html,jpg等,将直接发送资源二进制数据给客户端浏览器,PHP不会参与其中。
但当nginx发现请求路径是.php后缀的文件时,会首先加载硬盘文件资源到内存推送php-fpm进程,由php-fpm进程激活php-cgi进程解析PHP脚本内容,其执行结果将会包括html混编与php代码解析后的静态html内容返回给nginx(如果php脚本中有请求数据库的需要,php才会连接数据库请求数据),然后nginx才会发送已经被php解释过的包括html标签的二进制存静态网页发送给客户端浏览器。
mod_php5模式一般会用在apache引擎下
ISAPI模式一般会用在 IIS引擎下。
目前主流的php动态网页服务器配置为:
1)Apache+mod_php5
2)IIS+ISAPI
3)nginx+PHP-FPM
其中采用php-fpm方式运行php更通用,更高效。
在PHP  CGI运行模式下,即网页运行模式下,实际上与客户端浏览器对接请求的是nginx等web服务器引擎软件。在高并发状态下,nginx的执行效率是非常高的,同时php-fpm常驻进程以及动态扩充子进程的工作原理,也可以充分保证php的执行效率。所以一般网页高并发执行效率的瓶颈,来自于mysql数据库的响应速度。
同时网页模式下的一些特点,http协议请求的业务属于tcp短连接业务,nginx为了维护多个客户端请求的业务,会有超时时间,而php-fpm进程管理器也有维护php响应时间的超时限制。
所以一般当php脚本中出现死循环,以及执行消耗时间过长的代码逻辑,都会有超时风险。所以不建议在网页模式下php代码中编写过于消耗时间的业务逻辑。其中包括curl远程请求资源,大量多维循环,不规范的sql语句查询等等,都会被计算到一次请求的总时长当中。

好复杂啊,这么多字就有点眼花
挺好  顶一下   
我顶
顶一下 不错