PHP运⾏模式cgi、fast-cgi、cli命令⾏、web模块模式
PHP运⾏模式有4钟:
1)cgi 通⽤⽹关接⼝(Common Gateway Interface))
2) fast-cgi 常驻 (long-live) 型的 CGI
3) cli 命令⾏运⾏ (Command Line Interface)
4)web模块模式 (apache等web服务器运⾏的模块模式)
1. CGI(Common Gateway Interface)
CGI即通⽤⽹关接⼝(Common Gateway Interface),它是⼀段程序, 通俗的讲CGI就象是⼀座桥,把⽹页和WEB服务器中的执⾏程序连接起来,它把HTML接收的指令传递给服务器的执⾏程序,再把服务器执⾏程序的结果返还给HTML页。CGI 的跨平台性能极佳,⼏乎可以在任何操作系统上实现。 CGI已经是⽐较⽼的模式了,这⼏年都很少⽤了。
每有⼀个⽤户请求,都会先要创建cgi的⼦进程,然后处理请求,处理完后结束这个⼦进程,这就是 fork-
and-execute模式 。 当⽤户请求数量⾮常多时,会⼤量挤占系统的资源如内存,CPU时间等,造成效能低下。所以⽤cgi⽅式的服务器有多少连接请求就会有多少cgi ⼦进程, ⼦进程反复加载是cgi性能低下的主要原因 。
如果不想把 PHP 嵌⼊到服务器端软件(如 Apache)作为⼀个模块安装的话,可以选择以 CGI 的 模式 安装。或者把 PHP ⽤于不同的 CGI 封装以便为代码创建安全的 chroot 和 setuid 环境。这样每个客户机请求⼀个php⽂件,Web服务器就调⽤(win下是,linux是php)去解释这个⽂件,然后再把解释的结果以⽹页的形式返回给客户机。 这种安装⽅式通常会把 PHP 的可执⾏⽂件安装到 web 服务器的 cgi-bin ⽬录。CERT 建议书 建议不要把任何的解释器放到 cgi-bin ⽬录。
这种⽅式的好处是把web server和具体的程序处理独⽴开来,结构清晰,可控性强,同时缺点就是如果在⾼访问需求的情况下,cgi的进程fork就会成为很⼤的服务器负担,想 象⼀下数百个并发请求导致服务器fork出数百个进程就明⽩了。这也是为什么cgi⼀直背负性能低下,⾼资源消耗的恶名的原因。
CGI模式安装:
CGI已经是⽐较⽼的模式了,这⼏年都很少⽤了,所以我们只是为了。
CGI模式需要注释掉
安装CGI模式
LoadModule php5_module modules/libphp5.so 这⾏。如果不注释这⾏会⼀直⾛到handler模式。也就是模块模式。
然后在f增加action:
Action application/x-httpd- /cgi-bin/
如果在/cgi-bin/⽬录不到php-cgi.可⾃⾏从php的bin⾥⾯cp⼀个。
然后重启apache,再打开测试页⾯发现Server API变成:CGI/FastCGI。说明成功切换为cgi模式。
问题:
1) 如果cgi程序放在/usr/local/httpd/cgi-bin/⾥⽆法执⾏,遇到403或500错误的话
打开apache错误⽇志 有如下提⽰: Permission denied: exec of
可以检查cgi程序的属性,按 contexts⽂件 ⾥定义的,/usr/local/httpd/cgi-bin/⾥必须是httpd_sys_script_exec_t 属性。 通过ls -Z查看,如果不是则通过如下命令更改: chcon -t httpd_sy
s_script_exec_t /var/www/cgi-bin/*.cgi 如果是虚拟主机⾥的cgi,则参考问题2使之能正常使⽤普通的功能后,再通过chcon设置cgi⽂件的context 为
httpd_sys_script_exec_t即可。chcon -R -t httpd_sys_script_exec_t cgi-bin/
2) apache错误提⽰:.... malformed header from script. Bad header=
根据提⽰说明有header有问题,查看⽂件输出的第⼀句话是什么,应该类似于如下
Content-type: text/plain; charset=iso-8859-1\n\n
或者Content-type:text/html\n\n
注意:声明好Content-type后要输出两个空⾏。
3)apache错误提⽰: Exec format error
脚本解释器设置错误。脚本第⼀⾏应该以'#!解释器路径'的形式, 填写脚本解释器的路径,如果是PERL程序,常见的路径为: #!/usr/bin/perl 或 #!/usr/local/bin/perl 如果是PHP程序,不需要填写解释器路径,系统会⾃动到PHP。
2. Fastcgi模式
fast-cgi 是cgi的升级版本,FastCGI 像是⼀个 常驻 (long-live) 型的 CGI ,它可以⼀直执⾏着,只要激活后,不会每次都要花费时间去 fork ⼀次 (这是 CGI 最为⼈诟病的 fork-and-execute 模式)。
FastCGI的⼯作原理是 :
(1)、Web Server启动时载⼊FastCGI进程管理器【PHP的FastCGI进程管理器是PHP-FPM(php-FastCGI Process Manager)】(IIS ISAPI或Apache Module);
(2)、FastCGI进程管理器⾃⾝初始化,启动多个CGI解释器进程 (在任务管理器中可见多个)并等待来⾃Web Server的连接。
(3)、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到⼀个CGI解释器。Web server将CGI环境变量和标准输⼊发送到FastCGI⼦进程php-cgi。
(4)、FastCGI⼦进程完成处理后将标准输出和错误信息从同⼀连接返回Web Server。当FastCGI⼦进程关闭连接时,请求便告处理完成。FastCGI⼦进程接着等待并处理来⾃
FastCGI进程管理器(运⾏在 WebServer中)的下⼀个连接。在正常的CGI模式中,在此便退出了。
在CGI模式中,你可以想象 CGI通常有多慢。每⼀个Web请求PHP都必须重新解析php.ini、重新载⼊全部dll扩展并重初始化全部。使⽤FastCGI,所有这些都只在进程启动时发⽣⼀次。⼀个额外的好处是,持续连接(Persistent database connection)可以⼯作。
Fastcgi的优点:
1)从稳定性上看, fastcgi是以独⽴的进程池运⾏来cgi,单独⼀个进程死掉,系统可以很轻易的丢弃,然后重新分 配新的进程来运⾏逻辑.
2)从安全性上看,Fastcgi⽀持分布式运算. fastcgi和宿主的server完全独⽴, fastcgi怎么down也不会把server搞垮.
3)从性能上看, fastcgi把动态逻辑的处理从server中分离出来, ⼤负荷的IO处理还是留给宿主server, 这样宿主server可以⼀⼼⼀意作IO,对于⼀个普通的动态⽹页来说, 逻辑处理可能只有⼀⼩部分, ⼤量的图⽚等静态
FastCGI缺点:说完了好处,也来说说缺点。从我的实际使⽤来看,⽤FastCGI模式更适合⽣产环境的服务器。但对于开发⽤机器来说就不太合适。因为当使⽤ Zend Studio调试程序时,由于 FastCGI会认为 PHP进程超时,从⽽在页⾯返回 500错误。这⼀点让⼈⾮常恼⽕,所以我在开发机器上还是换回了 ISAPI模式。
安装fastcgi模式:
安装apache路径是/usr/local/httpd/
安装php路径是/usr/local/php/
1)安装mod_fastcgi
wget www.fastcgi/dist/mod_fastcgi-2.4.
tar zxvf mod_fastcgi-2.4.
cd mod_fastcgi-2.4.6
cp Makefile.AP2 Makefile
vi Makefile,编辑top_dir = /usr/local/httpd
make
make install
安装完后,
/usr/local/httpd/modules/多出⼀个⽂件:mod_fcgid.so
2)重新编译php
./configure --prefix=/usr/local/php --enable-fastcgi --enable-force-cgi-redirect --disable-cli
make
make install
这样编译后,在PHP的bin⽬录下的php-cgi就是fastcgi模式的php解释器了
安装成功后,执⾏php如何运行代码
php -v 输出
PHP 5.3.2 (cgi-fcgi).
这⾥输出带了cgi-fcgi
注意:
1. 编译参数不能加 –with-apxs=/usr/local/httpd/bin/apxs 否则安装出来的php执⾏⽂件是cli模式的
2 如果编译时不加--disable-cli则输出PHP 5.3.2(cli)
3)配置apache
需要配置apache来以fastcgi模式运⾏php程序
f
我们使⽤虚拟机的⽅式实现:
#加载fastcgi模块
LoadModule fastcgi_module modules/mod_fastcgi.so
#//以静态⽅式执⾏fastcgi 启动了10进程
FastCgiServer /usr/local/php/bin/php-cgi -processes 10 -idle-timeout 150 -pass-header HTTP_AUTHORIZATION
<VirtualHost *:80>
#
DocumentRoot /usr/local/httpd/fcgi-bin
ServerName www.fastcgitest
ScriptAlias /fcgi-bin/ /usr/local/php/bin/ #定义⽬录映射 /fcgi-bin/ 代替 /usr/local/php/bin/
Options +ExecCGI
AddHandler fastcgi-script .php .fcgi #.php结尾的请求都要⽤php-fastcgi来处理
AddType application/x-httpd-php .php #增加MIME类型
Action application/x-httpd-php /fcgi-bin/php-cgi #设置php-fastcgi的处理器: /usr/local/php/bin/php-cgi
<Directory /usr/local/httpd/fcgi-bin/>
Options Indexes ExecCGI
Order allow,deny
allow from all
</Directory>
</VirtualHost>
或者
<IfModule mod_fastcgi>ScriptAlias /fcgi-bin/ "/usr/local/php/bin" #定义⽬录映射FastCgiServer /usr/local/php/bin/php-cgi -processes 10 #配置fastcgi server,<Directory "/usr/local/httpd/fcgi-bin/">SetHandler fastcgi-script Options FollowSymLinks Order allow,deny Allow from all</Directory>AddType application/x-httpd-php .php #增加MIME类型AddHandler php-fastcgi .php #.php结尾的请求都要⽤php-fastcgi来处理Action php-fastcgi /fcgi-bin/php-cgi #设置php-fastcgi的处理器
</IfModule>
4).restart 下apache,查看phpinfo,如果服务器信息是:
Apache/2.2.11 (Unix) mod_fastcgi/2.4.6之类的就说明安装成功了。
如果出现403的错误,查看下/usr/local/httpd/fcgi-bin/是否有⾜够的权限。
或者
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
改为:
<Directory />
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
就可以了。
ps -ef|grep php-cgi可以看见10个fastcgi进程在跑。
3. CLI模式
cli是php的命令⾏运⾏模式,⼤家经常会使⽤它,但是可能并没有注意到(例如:我们在linux下经常使⽤ "php -m"查PHP安装了那些扩展就是PHP命令⾏运⾏模式;有兴趣的同学可以输⼊php -h去深⼊研究该运⾏模式)
1.让 PHP 运⾏指定⽂件。
php script.php
php -f script.php
以上两种⽅法(使⽤或不使⽤ -f 参数)都能够运⾏脚本的script.php。您可以选择任何⽂件来运⾏,您指定的 PHP 脚本并⾮必须要以.php 为扩展名,它们可以有任意的⽂件名和扩展名。
2.在命令⾏直接运⾏ PHP 代码。
php -r "print_r(get_defined_constants());"
在使⽤这种⽅法时,请您注意外壳变量的替代及引号的使⽤。
注: 请仔细阅读以上范例,在运⾏代码时没有开始和结束的标记符!加上 -r 参数后,这些标记符是不需要的,加上它们会导致语法错误。
3.通过标准输⼊(stdin)提供需要运⾏的 PHP 代码。
以上⽤法给我们提供了⾮常强⼤的功能,使得我们可以如下范例所⽰,动态地⽣成 PHP 代码并通过命令⾏运⾏这些代码:$ some_application | some_filter | php | sort -u >
4. 模块模式
6. php在Nginx中运⾏模式(Nginx+ PHP-FPM)
使⽤FastCGI⽅式现在常见的有两种stack:ligthttpd+spawn-fcgi;另外⼀种是nginx+PHP-FPM(也可以⽤spawn-fcgi)。
A、如上⾯所说该两种结构都采⽤FastCGI对PHP⽀持,因此HTTPServer完全解放出来,可以更好地进⾏响应和并发处理。因此
lighttpd和nginx都有small, but powerful和efficient的美誉。
B、该两者还可以分出⼀个好坏来,spawn-fcgi由于是lighttpd的⼀部分,因此安装了lighttpd⼀般就会使⽤spawn-fcgi对php⽀
持,但是⽬前有⽤户说ligttpd的spwan-fcgi在⾼并发访问的时候,会出现上⾯说的内存泄漏甚⾄⾃动重启fastcgi。即:PHP脚本处理器当机,这个时候如果⽤户访问的话,可能就会出现⽩页(即PHP不能被解析或者出错)。
另⼀个:⾸先nginx不像lighttpd本⾝含带了fastcgi(spawn-fcgi),因此它完全是轻量级的,必须借助第三⽅的FastCGI处理器才可以对PHP进⾏解析,因此其实这样看来nginx是⾮常灵活的,它可以和任何第三⽅提供解析的处理器实现连接从⽽实现对PHP的解析(在f中很容易设置)。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
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使⽤的⼈越来越多。
参考链接:
www.jb51/article/38329.htm
blog.csdn/hguisu/article/details/7386882
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论