apache php 的几种运行方式

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: apache php 的几种运行方式

PHP 的所有应用程序都是通过 WEB 服务器 (如 IIS 或 Apache) 和 PHP 引擎程序解释执行完成的,

工作过程

(1) 当用户在浏览器地址中输入要访问的 PHP 页面文件名,然后回车就会触发这个 PHP 请求,并将请求传送化支持 PHP 的 WEB 服务器。

(2) WEB 服务器接受这个请求,并根据其后缀进行判断如果是一个 PHP 请求,WEB 服务器从硬盘或内存中取出用户要访问的 PHP 应用程序,并将其发送给 PHP 引擎程序。

(3) PHP 引擎程序将会对 WEB 服务器传送过来的文件从头到尾进行扫描并根据命令从后台读取,处理数据,并动态地生成相应的 HTML 页面。

(4) PHP 引擎将生成 HTML 页面返回给 WEB 服务器。WEB 服务器再将 HTML 页面返回给客户端浏览器。

php 本身是一个 php 代码的脚本执行程序,运行方式是指其运行的方法。整理归纳为一下五种方法:

  • 模块加载运行方式 (Apache)
  • CGI 运行方式 (Apache)
  • FastCGI 运行方式 (几乎通用 Apache nginx lighttp)
  • ISAPI 运行方式 (window 下 Apache)
  • cli 运行方式 (就是命令行)

前四种是提供给 web 服务器来处理 php 代码文件,其中模块加载的方式其实是最快的的,但 FastCGI 配合 nginx WEB 服务是目前的主流,下面主要配合 Apache 做说明。

1 模块加载运行方式

以模块加载的方式运行,其实就是将 PHP 集成到 web 服务器,以同一个进程运行。

此运行模式在使用 apache 服务器经常使用,通过加载模块 (linux SO,window DLL) 中,PHP 是与 Web 服务器 (Apache) 一起启动并运行的,是 apache 在 CGI 的基础上进行的一种扩展,加快 PHP 的运行效率。

以 linux 为例编译 PHP, 在./configure 步骤需要指定 --with-apxs2=/path/to/apache/bin/apxs 表示告诉编译器通过 Apache 的 mod_php5/apxs 来提供对 PHP5 的解析。

在 make install 的时候我们会看到将动态链接库 libphp5.so (Apache 模块) 拷贝到 apache2 的安装目录的 modules 目录下(编译 Apache 时要带 --enable-modules=so,不实际编译模块但允许加载模块),然后在 httpd.conf 配置文件中添加 LoadModule 语句来动态将 libphp5.so 模块加载进来,从而实现 Apache 对 php 的支持。

LoadModule php5_module /path/to/module/modules/libphp5.so//windows 下载 PHP 一般为 php5apache2_2.dll PHPinidir "/path/to/php.ini"

DirectoryIndex index.html index.php

AddType application/x-httpd-php .php

PHP 作为 Apache 模块,Apache 服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次 HTTP 请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。

2CGI 运行方式

CGI 即通用网关接口 (Common Gateway Interface),它是一段程序,通俗的讲 CGI 就象是一座桥,把网页和 WEB 服务器中的执行程序连接起来,它把 HTML 接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给 HTML 页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。

CGI 方式在遇到连接请求(用户 请求)先要创建 cgi 的子进程,激活一个 CGI 进程,然后处理请求,处理完后结束这个子进程。这就是 fork-and-execute 模式。所以用 cgi 方式的服务器有多少连接请求就会有多少 cgi 子进程,子进程反复加载是 cgi 性能低下的主要原因。都会当用户请求数量非常多时,会大量挤占系统的资源如内 存,CPU 时间等,造成效能低下。

修改 PHP 配置 php.ini

cgi.force_redirect = 0 // 本来是 1 并且去掉注释符号;

修改 apache 的配置,去掉原来的模块配置

AddType application/x-httpd-php .php

LoadModule php5_module "C:/php5/php5apache2_2.dll"

PHPinidir "C:/php5/php.ini"

加入以下配置

AddHandler cgi-script

然后在网站 cgi-bin 目录下新建一个 cgi 文件 test.cgi 编写如下代码:

#!/path/to/php/php-cgi(.exe)

<?

php php phpinfo();

?>

在上述情况中,你可以想象 CGI 通常有多慢。每一个 Web 请求 PHP 都必须重新解析 php.ini、重新载入全部扩展并重初始化全部数据结构。

3FastCGI 运行方式

fast-cgi 是 cgi 的升级版本,FastCGI 像是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一 次。PHP 使用 PHP-FPM (FastCGI Process Manager),全称 PHP FastCGI 进程管理器进行管理。

php 5.3.29 之后自带 FPM,编译时带 --enable-fpm,之前需另外加载模块。

PHP 的 fastcig 方式运行,如果是 Apache 服务器首先需要去下载 fastcgi 模块,默认是没有带这个模块的,而 cgi 是自带的;下载地址 http://httpd.apache.org/mod_fcgid/;解压复制其中的 mod_fcgid.so 和 mod_fcgid.pdb,接下来做如下的配置:

LoadModule fcgid_module modules/mod_fcgid.so//line 128 追加

FcgidInitialEnv PHPRC "c:/php5" //php 配置文件 line 129 追加 AddHandler

fcgid-script .php// 添加句柄 即后缀 什么样的文件需要 fastcgi 解释 line 407 追加 FcgidWrapper

"c:/php5/php-cgi.exe" .php// 解释器路径 line 408 Options Indexes

FollowSymLinks ExecCGI //line 221 追加 ExecCGI 意思是目录允许执行 CGI 脚本

使用 FastCGI,所有这些都只在进程启动时发生一次。一个额外的 好处是,持续数据库连接 (Persistent database connection) 可以工作。

4ISAPI 运行方式

ISAPI 即 Internet Server Application Program Interface,是微软提供的一套面向 Internet 服务的 API 接口,一个 ISAPI 的 DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个 DLL 里设置多个用户请求处理函数,此外,ISAPI 的 DLL 应用程序和 WWW 服务器处于同一个进程中,效率要显著高于 CGI。(由于微软的排他性,只能运行于 windows 环境)

5cli 运行方式

cli 是 php 的命令行运行模式,大家经常会使用它,但是可能并没有注意到(例如:我们在 linux 下经常使用 “php -m” 查找 PHP 安装了那些扩展就是 PHP 命令行运行模式;有兴趣的同学可以输入 php -h 去深入研究该运行模式)

一。可以配置 Apache 将 PHP 解释器作为 CGI 脚本,或者作为 Apache 本身的一个模块 (mod_php),还有就是 FastCGI 模式来运行。

CGI 是比较原始的方式,Apache 默认是以第二种方式运行 PHP 的,而配置 FastCGI 模式需要下载安装相关的包。

性能上,CGI 模式每一次接到请求会调用 php.exe,解析 php.ini,加载 DLL 等,速度自然慢。

后两种方式会在 Web 程序启动时就作为启动,等待请求;其中 FastCGI 下,实现了类似连接池的技术特性,保持了对后台的连接,请求到来即可使用,结束即断开准备与下一个请求连接。

实际中,有人认为 FastCGI 比 mod_php 模式慢,有认为前者是后者性能的 80% 的,还有人测试后认为:对于匿名访问,前者约为后者性能的 63%,认证访问时也低了 18%。一般认为,FastCGI 是适用于高并发使用场景下的,同时使用 FastCGI 可以使得程序在 Web Server 产品与代码两端都具有更好的选择自由度。

二.Nginx 默认不支持 CGI 模式,它是以 FastCGI 方式运行的。所以使用 Nginx+PHP 就是直接配置为 FastCGI 模式。

For the most part, lack of CGI support in Nginx is not an issue and actually has an important side-benefit: because Nginx cannot directly execute external programs (CGI), a malicious person can't trick your system into uploading and executing an arbitrary script.

php 在 apache 中一共有三种工作方式:CGI 模式、Apache 模块 DLL、FastCGI 模式)

以下分别比较:

1. CGI 模式与模块模式比较:

php 在 apache 中两种工作方式的区别 (CGI 模式、Apache 模块 DLL)

这两种工作方式的安装:

PHP 在 Apache 2.0 中的 CGI 方式

ScriptAlias /php/ "c:/php/"

AddType application/x-httpd-php .php

# 对 PHP 4 用这行

Action application/x-httpd-php "/php/php.exe"

# 对 PHP 5 用这行

Action application/x-httpd-php "/php/php-cgi.exe"

PHP 在 Apache 2.0 中的模块方式

# 对 PHP 4 用这两行:

LoadModule php4_module "c:/php/php4apache2.dll"

# 别忘了从 sapi 目录中把 php4apache2.dll 拷贝出来!

AddType application/x-httpd-php .php

# 对 PHP 5 用这两行:

LoadModule php5_module "c:/php/php5apache2.dll"

AddType application/x-httpd-php .php

# 配置 php.ini 的路径

PHPIniDir "C:/php"

这两种工作方式的区别:

在 CGI 模式下,如果客户机请求一个 php 文件,Web 服务器就调用 php.exe 去解释这个文件,然后再把解释的结果以网页的形式返回给客户机;

而在模块化 (DLL) 中,PHP 是与 Web 服务器一起启动并运行的。

所以从某种角度上来说,以 apache 模块方式安装的 PHP4 有着比 CGI 模式更好的安全性以及更好的执行效率和速度。

2. FastCGI 运行模式分析:

FastCGI 的工作原理是:

(1)、Web Server 启动时载入 FastCGI 进程管理器【PHP 的 FastCGI 进程管理器是 PHP-FPM (php-FastCGI Process Manager)】(IIS ISAPI 或 Apache Module);

(2)、FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程 (在任务管理器中可见多个 php-cgi.exe) 并等待来自 Web Server 的连接。

(3)、当客户端请求到达 Web Server 时,FastCGI 进程管理器选择并连接到一个 CGI 解释器。Web server 将 CGI 环境变量和标准输入发送到 FastCGI 子进程 php-cgi.exe。

(4)、FastCGI 子进程完成处理后将标准输出和错误信息从同一连接返回 Web Server。当 FastCGI 子进程关闭连接时,请求便告处理完成。FastCGI 子进程接着等待并处理来自 FastCGI 进程管理器(运行在 WebServer 中)的下一个连接。 在正常的 CGI 模式中,php-cgi.exe 在此便退出了。

在上述情况中,你可以想象 CGI 通常有多慢。每一个 Web 请求 PHP 都必须重新解析 php.ini、重新载入全部 dll 扩展并重初始化全部数据结构。使用 FastCGI,所有这些 都只在进程启动时发生一次。一个额外的好处是,持续数据库连接 (Persistent database connection) 可以工作。

3. 为什么要使用 FastCGI,而不是多线程 CGI 解释器?

这可能出于多方面的考虑,例如:

(1)、你无论如何也不能在 windows 平台上稳定的使用多线程 CGI 解释器,无论是 IIS ISAPI 方式还是 APACHE Module 方式,它们总是运行一段时间就崩溃了。奇怪么?但是确实存在这样的情况!

当然,也有很多时候你能够稳定的使用多线程 CGI 解释器,但是,你有可能发现网页有时候会出现错误,无论如何也找不到原因,而换用 FastCGI 方式 时这种错误的概率会大大的降低。我也不清楚这是为什么,我想独立地址空间的 CGI 解释器可能终究比共享地址空间的形式来得稳定一点点。

(2)、性能!性能?可能么,难道 FastCGI 比多线程 CGI 解释器更快?但有时候确实是这样,只有测试一下你的网站,才能最后下结论。原因嘛,我觉得 很难讲,但有资料说在 Zend WinEnabler 的时代,Zend 原来也是建议在 Windows 平台下使用 FastCGI 而不是 IIS ISAPI 或 Apache Module,不过现在 Zend 已经不做这个产品了。

4. FastCGI 模式运行 PHP 的优点

以 FastCGI 模式运行 PHP 有几个主要的好处。首先就是 PHP 出错的时候不会搞垮 Apache,只是 PHP 自己的进程当掉(但 FastCGI 会立即重新启动一个新 PHP 进程来代替当掉的进程)。其次 FastCGI 模式运行 PHP 比 ISAPI 模式性能更好(我本来用 ApacheBench 进行了测试,但忘了保存结果,大家有兴趣可以自己测试)。

最后,就是可以同时运行 PHP5 和 PHP4。参考下面的配置文件,分别建立了两个虚拟主机,其中一个使用 PHP5,另一个使用 PHP4。

 

  1. LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP13.dll
  2. ScriptAlias /fcgi-php5/ "d:/usr/local/php-5.0.4/"
  3. FastCgiServer "d:/usr/local/php-5.0.4/php-cgi.exe" -processes 3
  4. ScriptAlias /fcgi-php4/ "d:/usr/local/php-4.3.11/"
  5. FastCgiServer "d:/usr/local/php-4.3.11/php.exe"
  6. Listen 80
  7. NameVirtualHost *:80
  8. DocumentRoot d:/www
  9. Options Indexes FollowSymlinks MultiViews
  10. ServerName php5.localhost
  11. AddType application/x-httpd-fastphp5 .php
  12. Action application/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"
  13.  
  14. IndexOptions FancyIndexing FoldersFirst
  15. Options Indexes FollowSymLinks MultiViews
  16. AllowOverride None
  17. Order allow,deny
  18. Allow from all
  19.  
  20. Listen 8080
  21. NameVirtualHost *:8080
  22.  
  23. DocumentRoot d:/www
  24. Options Indexes FollowSymlinks MultiViews
  25. ServerName php4.localhost
  26. AddType application/x-httpd-fastphp4 .php
  27. Action application/x-httpd-fastphp4 "/fcgi-php4/php.exe"
  28.  
  29. Options Indexes FollowSymLinks MultiViews
  30. AllowOverride None
  31. Order allow,deny
  32. Allow from all

 

使用上面的配置,访问 http://localhost/ 就使用 PHP5,而访问 http://localhost:8080/ 就使用 PHP4。所以只要合理配置,就可以让不同的虚拟主机使用不同版本的 PHP。

FastCGI 模式的一些缺点:

说完了好处,也来说说缺点。从我的实际使用来看,用 FastCGI 模式更适合生产环境的服务器。但对于开发用机器来说就不太合适。因为当使用 Zend Studio 调试程序时,由于 FastCGI 会认为 PHP 进程超时,从而在页面返回 500 错误。这一点让人非常恼火,所以我在开发机器上还是换回了 ISAPI 模式。

最后,在 Windows 中以 FastCGI 模式存在潜在的安  

二、php 在 nginx 中运行模式 (nginx+PHP-FPM) 目前理想选择

使用 FastCGI 方式现在常见的有两种 stack:ligthttpd+spawn-fcgi; 另外一种是 nginx+PHP-FPM (也可以用 spawn-fcgi) 。

(1) 如上面所说该两种结构都采用 FastCGI 对 PHP 支持,因此 HTTPServer 完全解放出来,可以更好地进行响应和并发处理。因此 lighttpd 和 nginx 都有 small, but powerful 和 efficient 的美誉。

(2) 该两者还可以分出一个好坏来,spawn-fcgi 由于是 lighttpd 的一部分,因此安装了 lighttpd 一般就会使用 spawn-fcgi 对 php 支持,但是目前有用户说 ligttpd 的 spwan-fcgi 在高并发访问的时候,会出现上面说的内存泄漏甚至自动重启 fastcgi。即:PHP 脚本处理器当机,这个时候如果用户访问的话,可能就会出现白页 (即 PHP 不能被解析或者出错)。

另一个:首先 nginx 不像 lighttpd 本身含带了 fastcgi (spawn-fcgi),因此它完全是轻量级的,必须借助第三方的 FastCGI 处理器才可以对 PHP 进行解析,因此其实这样看来 nginx 是非常灵活的,它可以和任何第三方提供解析的处理器实现连接从而实现对 PHP 的解析 (在 nginx.conf 中很容易设置)。

nginx 可以使用 spwan-fcgi (需要一同安装 lighttpd,但是需要为 nginx 避开端口,一些较早的 blog 有这方面安装的教程),但是由于 spawn-fcgi 具有上面所述的用户逐渐发现的缺陷,现在慢慢减少使用 nginx+spawn-fcgi 组合了。

c. 由于 spawn-fcgi 的缺陷,现在出现了新的第三方 (目前还是,听说正在努力不久将来加入到 PHP core 中) 的 PHP 的 FastCGI 处理器,叫做 PHP-FPM (具体可以 google)。它和 spawn-fcgi 比较起来有如下优点:

由于它是作为 PHP 的 patch 补丁来开发的,安装的时候需要和 php 源码一起编译,也就是说编译到 php core 中了,因此在性能方面要优秀一些;

同时它在处理高并发方面也优于 spawn-fcgi,至少不会自动重启 fastcgi 处理器。具体采用的算法和设计可以 google 了解。

因此,如上所说由于 nginx 的轻量和灵活性,因此目前性能优越,越来越多人逐渐使用这个组合:nginx+PHP/PHP-FPM

IIS+ ISAPI 模式

这种模式适合开发环境中, 生产环境中用的较少。  

6 总结

目前在 HTTPServer 这块基本可以看到有三种 stack 比较流行:

(1)Apache+mod_php5

(2)lighttp+spawn-fcgi

(3)nginx+PHP-FPM

三者后两者性能可能稍优,但是 Apache 由于有丰富的模块和功能,目前来说仍旧是老大。有人测试 nginx+PHP-FPM 在高并发情况下可能会达到 Apache+mod_php5 的 5~10 倍,现在 nginx+PHP-FPM 使用的人越来越多。

相关文章
|
4月前
|
Ubuntu Apache PHP
解决Ubuntu下Apache不解析PHP问题
解决Ubuntu下Apache不解析PHP问题
|
11月前
|
PHP Apache
PHP环境搭建(配置php模块到apache服务器)
PHP环境搭建(配置php模块到apache服务器)
91 0
|
27天前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
37 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
1月前
|
关系型数据库 Linux 网络安全
"Linux系统实战:从零开始部署Apache+PHP Web项目,轻松搭建您的在线应用"
【8月更文挑战第9天】Linux作为服务器操作系统,凭借其稳定性和安全性成为部署Web项目的优选平台。本文以Apache Web服务器和PHP项目为例,介绍部署流程。首先,通过包管理器安装Apache与PHP;接着创建项目目录,并上传项目文件至该目录;根据需要配置Apache虚拟主机;最后重启Apache服务并测试项目。确保防火墙允许HTTP流量,正确配置数据库连接,并定期更新系统以维持安全。随着项目复杂度提升,进一步学习高级配置将变得必要。
73 0
|
4月前
|
关系型数据库 MySQL PHP
unbuntu搭建LAMP(Apache2+PHP+MySQL+phpmyadmin)
unbuntu搭建LAMP(Apache2+PHP+MySQL+phpmyadmin)
|
4月前
|
运维 Linux Apache
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
268 2
|
12月前
|
域名解析 Apache PHP
PHP Apache - 多站点虚拟主机配置
PHP Apache - 多站点虚拟主机配置
378 0
|
4月前
|
Apache
apache2.4集成php7或8均失败
apache2.4集成php7或8均失败
44 0
|
4月前
|
安全 网络安全 Apache
Windows下Apache部署多个php项目
在 Windows 系统下,使用 Apache 服务器发布多个 PHP 项目是一项常见的任务。本文将介绍如何在 Windows 操作系统下使用 Apache 发布多个 PHP 项目。在 Windows 操作系统下使用 Apache 发布多个 PHP 项目可能有一些挑战,但是只要您按照本文的步骤进行操作,您就可以成功地完成这项任务。希望本文能够对您有所帮助。
102 0
|
4月前
|
Apache PHP
百度搜索:蓝易云【Apache环境php安装扩展swoole。】
通过以上步骤,你就可以在Apache环境中成功安装和配置Swoole扩展了。请确保你按照正确的步骤进行操作,并根据你的系统和环境进行相应的调整。如果遇到问题,你可以参考Swoole官方文档或社区的支持资源来获取更多帮助。
47 1

推荐镜像

更多