PHP运行模式有4钟:
1)cgi 通用网关接口(Common Gateway Interface)) 2) fast-cgi 常驻 (long-live) 型的 CGI 3) cli 命令行运行 (Command Line Interface) 4)web模块模式 (apache等web服务器运行的模块模式) 5)ISAPI(Internet Server Application Program Interface)
备注:在PHP5.3以后,PHP不再有ISAPI模式,安装后也不再有PHP5isapi.dll这个文件。要在IIS6上使用高版本PHP,必须安装FastCGI 扩展,然后使IIS6支持FastCGI。
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服务器就调用PHP.exe(win下是PHP.exe,linux是PHP)去解释这个文件,然后再把解释的结果以网页的形式返回给客户机。 这种安装方式通常会把 PHP 的可执行文件安装到 web 服务器的 cgi-bin 目录。CERT 建议书 CA-96.11 建议不要把任何的解释器放到 cgi-bin 目录。
这种方式的好处是把web server和具体的程序处理独立开来,结构清晰,可控性强,同时缺点就是如果在高访问需求的情况下,cgi的进程fork就会成为很大的服务器负担,想 象一下数百个并发请求导致服务器fork出数百个进程就明白了。这也是为什么cgi一直背负性能低下,高资源消耗的恶名的原因。
CGI模式安装:
CGI已经是比较老的模式了,这几年都很少用了,所以我们只是为了测试。
安装CGI模式需要注释掉 LoadModule PHP5_module modules/libPHP5.so 这行。如果不注释这行会一直走到handler模式。也就是模块模式。 然后在httpd.conf增加action: Action application/x-httpd-PHP /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程序的属性,按Linux contexts文件 里定义的,/usr/local/httpd/cgi-bin/里必须是httpd_sys_script_exec_t 属性。 通过ls -Z查看,如果不是则通过如下命令更改: chcon -t httpd_sys_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解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
(3)、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
(4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。在正常的CGI模式中,php-cgi.exe在此便退出了。
在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/
安装完后, /usr/local/httpd/modules/多出一个文件:
PHP
这样编译后,在PHP的bin目录下的php-cgi就是fastcgi模式的PHP解释器了
安装成功后,执行
这里输出带了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程序
我们使用虚拟机的方式实现: ScriptAlias /fcgi-bin/ /usr/local/PHP/bin/ #定义目录映射 /fcgi-bin/ 代替 /usr/local/PHP/bin/ PHPinfo,如果服务器信息是:
Apache/2.2.11 (Unix) mod_fastcgi/2.4.6之类的就说明安装成功了。
如果出现403的错误,查看下/usr/local/httpd/fcgi-bin/是否有足够的权限。
或者mod_fcgid.so
vi httpd.conf
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