基于php在各种web服务器的运行模式详解
2023-06-13 09:15:00 时间
php在apache中一共有三种工作方式:
以下分别比较:
ScriptAlias/php/"c:/php/"
AddTypeapplication/x-httpd-php.php
#对PHP4用这行
Actionapplication/x-httpd-php"/php/php.exe"
#对PHP5用这行
Actionapplication/x-httpd-php"/php/php-cgi.exe"
PHP在Apache2.0中的模块方式
#对PHP4用这两行:
LoadModulephp4_module"c:/php/php4apache2.dll"
#别忘了从sapi目录中把php4apache2.dll拷贝出来!
AddTypeapplication/x-httpd-php.php
#对PHP5用这两行:
LoadModulephp5_module"c:/php/php5apache2.dll"
AddTypeapplication/x-httpd-php.php
#配置php.ini的路径
PHPIniDir"C:/php"
而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。
所以从某种角度上来说,以apache模块方式安装的PHP4有着比CGI模式更好的安全性以及更好的执行效率和速度。
(1)、WebServer启动时载入FastCGI进程管理器【PHP的FastCGI进程管理器是PHP-FPM(php-FastCGIProcessManager)】(IISISAPI或ApacheModule);
(2)、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(在任务管理器中可见多个php-cgi.exe)并等待来自WebServer的连接。
(3)、当客户端请求到达WebServer时,FastCGI进程管理器选择并连接到一个CGI解释器。Webserver将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。
(4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回WebServer。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在WebServer中)的下一个连接。在正常的CGI模式中,php-cgi.exe在此便退出了。
在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistentdatabaseconnection)可以工作。
(1)、你无论如何也不能在windows平台上稳定的使用多线程CGI解释器,无论是IISISAPI方式还是APACHEModule方式,它们总是运行一段时间就崩溃了。奇怪么?但是确实存在这样的情况!
当然,也有很多时候你能够稳定的使用多线程CGI解释器,但是,你有可能发现网页有时候会出现错误,无论如何也找不到原因,而换用FastCGI方式时这种错误的概率会大大的降低。我也不清楚这是为什么,我想独立地址空间的CGI解释器可能终究比共享地址空间的形式来得稳定一点点。
(2)、性能!性能?可能么,难道FastCGI比多线程CGI解释器更快?但有时候确实是这样,只有测试一下你的网站,才能最后下结论。原因嘛,我觉得很难讲,但有资料说在ZendWinEnabler的时代,Zend原来也是建议在Windows平台下使用FastCGI而不是IISISAPI或ApacheModule,不过现在Zend已经不做这个产品了。
最后,就是可以同时运行PHP5和PHP4。参考下面的配置文件,分别建立了两个虚拟主机,其中一个使用PHP5,另一个使用PHP4。
LoadModulefastcgi_modulemodules/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"-processes3
ScriptAlias/fcgi-php4/"d:/usr/local/php-4.3.11/"
FastCgiServer"d:/usr/local/php-4.3.11/php.exe"
Listen80
NameVirtualHost*:80
DocumentRootd:/www
OptionsIndexesFollowSymlinksMultiViews
ServerNamephp5.localhost
AddTypeapplication/x-httpd-fastphp5.php
Actionapplication/x-httpd-fastphp5"/fcgi-php5/php-cgi.exe"
IndexOptionsFancyIndexingFoldersFirst
OptionsIndexesFollowSymLinksMultiViews
AllowOverrideNone
Orderallow,deny
Allowfromall
Listen8080
NameVirtualHost*:8080
DocumentRootd:/www
OptionsIndexesFollowSymlinksMultiViews
ServerNamephp4.localhost
AddTypeapplication/x-httpd-fastphp4.php
Actionapplication/x-httpd-fastphp4"/fcgi-php4/php.exe"
OptionsIndexesFollowSymLinksMultiViews
AllowOverrideNone
Orderallow,deny
Allowfromall
使用上面的配置,访问http://localhost/就使用PHP5,而访问http://localhost:8080/就使用PHP4。所以只要合理配置,就可以让不同的虚拟主机使用不同版本的PHP。
FastCGI模式的一些缺点:
说完了好处,也来说说缺点。从我的实际使用来看,用FastCGI模式更适合生产环境的服务器。但对于开发用机器来说就不太合适。因为当使用ZendStudio调试程序时,由于FastCGI会认为PHP进程超时,从而在页面返回500错误。这一点让人非常恼火,所以我在开发机器上还是换回了ISAPI模式。
最后,在Windows中以FastCGI模式存在潜在的安
使用FastCGI方式现在常见的有两种stack:ligthttpd+spawn-fcgi;另外一种是nginx+PHP-FPM(也可以用spawn-fcgi)。
(1)如上面所说该两种结构都采用FastCGI对PHP支持,因此HTTPServer完全解放出来,可以更好地进行响应和并发处理。因此lighttpd和nginx都有small,butpowerful和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的缺陷,现在出现了新的第三方(目前还是,听说正在努力不久将来加入到PHPcore中)的PHP的FastCGI处理器,叫做PHP-FPM(具体可以google)。它和spawn-fcgi比较起来有如下优点:
由于它是作为PHP的patch补丁来开发的,安装的时候需要和php源码一起编译,也就是说编译到phpcore中了,因此在性能方面要优秀一些;
同时它在处理高并发方面也优于spawn-fcgi,至少不会自动重启fastcgi处理器。具体采用的算法和设计可以google了解。
因此,如上所说由于nginx的轻量和灵活性,因此目前性能优越,越来越多人逐渐使用这个组合:nginx+PHP/PHP-FPM
三、IIS+ISAPI模式这种模式适合开发环境中,生产环境中用的较少。
(2)lighttp+spawn-fcgi
(3)nginx+PHP-FPM
三者后两者性能可能稍优,但是Apache由于有丰富的模块和功能,目前来说仍旧是老大。有人测试nginx+PHP-FPM在高并发情况下可能会达到Apache+mod_php5的5~10倍,现在nginx+PHP-FPM使用的人越来越多。
相关文章
- PHP常见面试题_php算法面试题及答案
- Linux快速部署配置PHP服务器环境(linux部署php环境)
- PHP Fatal error: Uncaught Error: Call to undefined function pcntl_fork().. 开启php pcntl扩展实现多进程详解编程语言
- PHP编译MySQL:一步一步指南(php编译mysql)
- 数据库远程连接MySQL数据库:利用PHP实现简易方法(php远程mysql)
- 使用PHP连接虚拟机MySQL服务器(连接虚拟机mysql)
- Linux为Web服务器带来的福音(linux做web服务器)
- 极速搭建:Linux下PHP网站快速创建(linux搭建php网站)
- 实现PHP与MySQL的无缝连接,增强web开发效率(让php支持mysql)
- 如何解决PHP连接MySQL时找不到该数据库的问题(php找不到mysql)
- 使用PHP连接远程MSSQL服务器(php连接远程mssql)
- 技术使用PHP与MSSQL高效连接:实现无缝关联(php连接mssql的)
- 简便快捷:在PHP服务器上使用MSSQL(php服务器 mssql)
- PHP如何连接MS SQL服务器(php怎么连接mssql)
- PHP与MSSQL的良好配合,助力数据应用升级(php_mssql)
- PHP连接MSSQL数据库快速开启(php mssql 打开)
- PHP与MySQL的更新:让Web应用更稳定!(php mysql 更新)
- WINDOWS服务器安装多套PHP的另类解决方案
- 用定制的PHP应用程序来获取Web服务器的状态信息
- CentOS5.4服务器配置yum安装Apache+php+Mysql
- Nginx+PHP(FastCGI)搭建高并发WEB服务器(自动安装脚本)第二版
- PHP和Mysqlweb应用开发核心技术第1部分Php基础-1开始了解php
- windows服务器下IIS6/7下PHP无法加载php_curl.dll等动态链接库
- php中的PHP_EOL换行符详细解析
- php另类上传图片的方法(PHP用Socket上传图片)