基于php在各种web服务器的运行模式详解
程序员文章站
2022-11-27 10:52:53
一、php在apache中运行模式 php在apache中一共有三种工作方式:cgi模式、fastcgi模式、apache 模块dll以下分别比较:1. cgi模...
一、php在apache中运行模式
php在apache中一共有三种工作方式:cgi模式、fastcgi模式、apache 模块dll
以下分别比较:
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。
loadmodule fastcgi_module modules/mod_fastcgi-2.4.2-ap13.dll
scriptalias /fcgi-php5/ "d:/usr/local/php-5.0.4/"
fastcgiserver "d:/usr/local/php-5.0.4/php-cgi.exe" -processes 3
scriptalias /fcgi-php4/ "d:/usr/local/php-4.3.11/"
fastcgiserver "d:/usr/local/php-4.3.11/php.exe"
listen 80
namevirtualhost *:80
documentroot d:/www
options indexes followsymlinks multiviews
servername php5.localhost
addtype application/x-httpd-fastphp5 .php
action application/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"
indexoptions fancyindexing foldersfirst
options indexes followsymlinks multiviews
allowoverride none
order allow,deny
allow from all
listen 8080
namevirtualhost *:8080
documentroot d:/www
options indexes followsymlinks multiviews
servername php4.localhost
addtype application/x-httpd-fastphp4 .php
action application/x-httpd-fastphp4 "/fcgi-php4/php.exe"
options indexes followsymlinks multiviews
allowoverride none
order allow,deny
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模式这种模式适合开发环境中, 生产环境中用的较少。
四、总结
目前在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使用的人越来越多。
php在apache中一共有三种工作方式:cgi模式、fastcgi模式、apache 模块dll
以下分别比较:
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。
复制代码 代码如下:
loadmodule fastcgi_module modules/mod_fastcgi-2.4.2-ap13.dll
scriptalias /fcgi-php5/ "d:/usr/local/php-5.0.4/"
fastcgiserver "d:/usr/local/php-5.0.4/php-cgi.exe" -processes 3
scriptalias /fcgi-php4/ "d:/usr/local/php-4.3.11/"
fastcgiserver "d:/usr/local/php-4.3.11/php.exe"
listen 80
namevirtualhost *:80
documentroot d:/www
options indexes followsymlinks multiviews
servername php5.localhost
addtype application/x-httpd-fastphp5 .php
action application/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"
indexoptions fancyindexing foldersfirst
options indexes followsymlinks multiviews
allowoverride none
order allow,deny
allow from all
listen 8080
namevirtualhost *:8080
documentroot d:/www
options indexes followsymlinks multiviews
servername php4.localhost
addtype application/x-httpd-fastphp4 .php
action application/x-httpd-fastphp4 "/fcgi-php4/php.exe"
options indexes followsymlinks multiviews
allowoverride none
order allow,deny
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模式这种模式适合开发环境中, 生产环境中用的较少。
四、总结
目前在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使用的人越来越多。