CGI 和命令行设置

默认为将 PHP 编译为 CGI 程序。这将建立一个命令行解释器,可用于 CGI 处理或非 web 相关的 PHP 脚本。如果用户运行着一个 PHP 模块支持的 web 服务器,那通常为性能考虑应该使用模块方式。不过,CGI 版可以使 Apache 用户用不同的用户 ID 运行不同的 PHP 页面。

警告

如果使用 CGI 方式安装,则服务器对于某些可能的攻击是开放的。请阅读 CGI 安全一章以学习如何防御这些攻击。

自 PHP 4.3.0 起,PHP 有了一些重要的新增功能。又有了一个新的 SAPI 称为 CLI,和 CGI 程序同名。根据配置选项它安装在 {PREFIX}/bin/php,并在手册中 PHP 的命令行模式一章中有详细说明。更多细节请阅读该章节。

测试

如果将 PHP 编译为 CGI 程序,可以通过键入 make test 来测试你的编译。测试一下编译永远是个好主意。这样就可以在你的平台上及早捕捉到 PHP 的问题而不是以后再费力的解决。

基准测试

如果将 PHP 3 编译为 CGI 程序,可以通过键入 make bench 来进行一下性能的基准测试。注意如果默认打开了安全模式,则超过 30 秒的允许范围测试可能不能完成。这是因为 set_time_limit() 不能用于安全模式。用 max_execution_time 配置选项来为你自己的脚本控制此时间限制。make bench 会忽略配置文件

注: make bench 仅能用于 PHP 3。

使用变量

某些服务器提供的环境变量没有定义在当前的 CGI/1.1 标准中。只有下列变量定义在其中:AUTH_TYPECONTENT_LENGTHCONTENT_TYPEGATEWAY_INTERFACEPATH_INFOPATH_TRANSLATEDQUERY_STRINGREMOTE_ADDRREMOTE_HOSTREMOTE_IDENTREMOTE_USERREQUEST_METHODSCRIPT_NAMESERVER_NAMESERVER_PORTSERVER_PROTOCOLSERVER_SOFTWARE。其它的变量均作为“供应商扩展(vendor extensions)”来对待。


add a note add a note User Contributed Notes
info at ch2o dot info
17-Jun-2005 10:59
additionnal information to fastcgi...

the compilation of fastcgi library is not nessesary, php include a modified version of this library,
and fastcgi module have this own implementation of the protocole fastcgi...

on the first server (where apache are!) the uid and gid of apache instance of the fastcgi module
must be the same on the php file to execute...
without that they dont work...
the module refuse to send the request to the fastcgi php server...
info at ch2o dot info
14-Jun-2005 01:59
for using fastcgi external server in place of cgi or mod php with php:

to compile fastcgi librairie:

  wget http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
  tar xzvf fcgi-2.4.0.tar.gz
  cd fcgi-2.4.0
  ./configure
  make
  gmake install

to compile the fastcgi apache module:

  wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.2.tar.gz
  tar xvzf mod_fastcgi-2.4.2.tar.gz
  cd mod_fastcgi-2.4.2
  path/to/apache/bin/apxs -i -A -n fastcgi -o mod_fastcgi.la -c *.c

after you must modify the http.conf to add that:

  # load fcgi module
  LoadModule fastcgi_module      modules/mod_fastcgi.so

  # authorization to execute fcgi  on tree "/fcgi-bin/"
  <Location /fcgi-bin/>
     Options ExecCGI
     SetHandler fastcgi-script
  </Location>

  # define fastcgi external serveur for virtual path "/fcgi-bin/phpfcgi" to execute on targetmachinehost with targetport
  FastCgiExternalServer /fcgi-bin/phpfcgi -host targetmachinehostname:targetport
 

  # mime type definietion for some extention
  AddType application/x-httpd-fastphp .php .cphp .php4

  #define apache cgi regirection with the virtual action script /fcgi-bin/phpfcgi associated with the defined mime type.
  Action application/x-httpd-fastphp /fcgi-bin/phpfcgi

start apache.

compile php with --enable-cgi  and --enable-fastcgi=/to/lib/fastcgi

start on target machine php with "php -b ip:port" for ear request from mod_fastcgi.

some aditional thing are in sapi/cgi/README.FastCGI of php src tree.

the document root of the apache machine must be synchronous with the php target machine... with the same tree...

and with that solution you can mixe php5 and php4 with different extention of apache directory limitation to one or another version...

with performance like mod_php!
kptrs at yahoo dot com
07-Jun-2004 07:37
Dug out from the discussion at the site below is a good tip: if you are working with an existing PHP installation which did not build either the commandline or CGI servers, you can use the lynx non-graphical web browser to get the web server to execute php scripts from the command line (or cron jobs, etc):

lynx -dump http://whatever

>If you wish to use PHP as a scripting language, a good article to read is >http://www.phpbuilder.com/columns/darrell20000319.php3

>note that the article is aimed at *nix not win32, but most of it still applies
phil at philkern dot de
04-Jan-2003 02:40
Thanks nordkyn, this one was very helpful.
Please note that the kernel has to be compiled with misc binary support, which is activated on most distributions like Debian.
You would have to please these two lines in a script to run it after every reboot, on debian I propose /etc/init.d/bootmisc.sh
You could place this lines at the end but before : exit 0
---
# Install PHP as binary handler

mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
echo ":PHP:E::php::/usr/bin/php4:" > /proc/sys/fs/binfmt_misc/register
---
And please remember that the package management would override the file on the next distribution upgrade :)
cv at corbach dot de
21-Feb-2002 12:18
Up to and including 4.1.1 you have to set doc_root to an non empty value if you configure PHP for CGI usage with --enable-discard-path.