欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

linux - 安装mod_php5模块, 实现apache对php的支持, 这个东西怎么理解??

程序员文章站 2024-02-05 08:00:58
...
php 不是有自己的解析器吗?
apache 只是将url请求对应到本地服务器的磁盘文件,发现该文件是.php的,就会交给php解析器来做(这个过程之后就和apache暂时没有关系了)
apache所在用户(www-data)需要对该文件有读取的权限 然后php解析器去执行这个脚本
将执行完毕的结果(dom文档)一并交给apache,
apche再将dom文档原样(可能加一些响应头之类的)返回给客户端浏览器
客户端浏览器接收到dom文档,加载js引擎 逐行解析, 碰到img这些特殊标签才会再次向服务器发送请求 ...

我理解的是apache只是负责传递一下分配一下? 请前辈指出我理解不对的地方

回复内容:

php 不是有自己的解析器吗?
apache 只是将url请求对应到本地服务器的磁盘文件,发现该文件是.php的,就会交给php解析器来做(这个过程之后就和apache暂时没有关系了)
apache所在用户(www-data)需要对该文件有读取的权限 然后php解析器去执行这个脚本
将执行完毕的结果(dom文档)一并交给apache,
apche再将dom文档原样(可能加一些响应头之类的)返回给客户端浏览器
客户端浏览器接收到dom文档,加载js引擎 逐行解析, 碰到img这些特殊标签才会再次向服务器发送请求 ...

我理解的是apache只是负责传递一下分配一下? 请前辈指出我理解不对的地方

从宏观上来看,PHP内核的实现与世界上绝大多数的程序一样,接收输入数据, 做相应处理然后输出(返回)结果。 我们编写的代码就是PHP接收的输入数据,PHP内核对我们编写的代码进行解释和运算, 最后返回相应的运算结果。

这个问题要从『PHP内部的生命周期』和『SAPI接口』来理解:
先来看张图:

linux - 安装mod_php5模块, 实现apache对php的支持,  这个东西怎么理解??

从图上可以看出,PHP从下到上是一个4层体系:

Zend引擎:Zend整体用纯C实现,是PHP的内核部分,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。

Extensions:围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的PHP中间层、富文本解析就是extension的典型应用)。

Sapi:Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,Sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的一个设计,通过sapi成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

上层应用:这就是我们平时编写的PHP程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。

Sapi通过通过一系列的接口,使得外部应用可以和PHP交换数据并可以根据不同应用特点实现特定的处理方法,我们常见的一些sapi有:

  • apache2handler:这是以apache作为webserver,采用mod_PHP模式运行时候的处理方式,也是现在应用最广泛的一种。

  • cgi:这是webserver和PHP直接的另一种交互方式,也就是大名鼎鼎的fastcgi协议,在最近今年fastcgi+PHP得到越来越多的应用,也是异步webserver所唯一支持的方式。

  • cli:命令行调用的应用模式

Apache是Apache软件基金会的一个开放源代码的Web服务器, 可以在大多数电脑操作系统中运行,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。 Apache支持许多特性,大部分通过模块扩展实现。常见的模块包括mod_auth(权限验证)、mod_ssl(SSL和TLS支持) mod_rewrite(URL重写)等。一些通用的语言也支持以Apache模块的方式与Apache集成。 如Perl,Python,Tcl,和PHP等。

当PHP需要在Apache服务器下运行时,一般来说,它可以mod_php5模块的形式集成, 此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求, 然后将处理后的结果返回给Apache。如果我们在Apache启动前在其配置文件中配置好了PHP模块(mod_php5), PHP模块通过注册apache2的ap_hook_post_config挂钩,在Apache启动的时候启动此模块以接受PHP文件的请求。

先看一些Apache里的PHP配置httpd.conf:

LoadModule php5_module modules/libphp5.so
AddHandler application/x-httpd-php .php

libphp5.so/libphp7.so作为Apache的一个模块module,PHP解释器是工作在Apache进程内(运行用户是相同的),Apache会把.php后缀的文件交给进程内的PHP模块处理,并把结果返回给浏览器.也就是说,载入了PHP模块的Apache就是一个PHP运行容器,它们是一个整体,是耦合的,所以必须先编译Apache,才能在编译PHP时用参数--with-apxs2=/png/httpd/2.4/bin/apxs指定Apache模块构建脚本,告诉Apache我要构建PHP模块.

对于Nginx和PHP-FPM这种模式,楼主才需要考虑到运行用户不同权限不同的问题,因为Nginx和PHP-FPM是分离的,两者是不同的进程,通过TCP或者Unix Domain Socket通信,不过一般Nginx和PHP-FPM都设为同样的运行用户,方便Nginx和PHP-FPM都能有权限操作同样的文件.另外PHP-FPM也可以看做一个PHP容器,因为PHP-FPM进程也是内置了PHP解释器的,因为其不依赖命令行的php,也不依赖php-cgi,跟Apache的区别就是PHP-FPM是一个FastCGI服务,而Apache是一个HTTP服务,Apache能够直接跟浏览器通信,而PHP-FPM则需要通过Nginx跟浏览器交互.

题外话:
PHP从5.4开始内置了一个HTTP服务器,官方定位是用于开发和测试,因为这个HTTP服务器并不是一个通用的标准的HTTP服务器,比如其不支持HTTPS,也不支持目录列表,还有单进程架构也不能利用多核.除了用来开发,我还找到了一个有意思的应用场景,既然PHP内置了HTTP服务器和SQLite数据库,那就可以把它当做一个家用的物联网服务器,于是我在Ubuntu上交叉编译了适用于Android和树莓派(Raspbian)的PHP,然后用Java写了个App,调用命令行启动PHP的HTTP服务器,然后打开WebView访问本地PHP服务器,本地PHP负责操作文件系统和网络,WebView用于人机交互,虽然不能调用Android上的Java API,但也能做蛮多事了.这个App已经跑在我的小米4上了.

linux - 安装mod_php5模块, 实现apache对php的支持,  这个东西怎么理解??

相关标签: php apache linux