亲测:编译php可配合apache运行cgi脚本

1.操作系统环境: centos5.6 32bit  ,php版本 :php-5.2.17

2.打算把php安装在/opt/phpcgi/目录中,所以mkdir /opt/phpcgi/


3.参考网站:
http://hi.baidu.com/lostdays/item/78fb00c079058fba0d0a7b5a  ###经过我测试这个网站都不靠谱,是错误的

http://www.zen-cart.cn/faq_info/faqs_id/79
http://www.phppan.com/2011/05/php-cgi/
郑重申明上面的3个链接压根就不能实现php agi,误导性极大,我在这里耗了3个小时的时间。强烈鄙视和谴责那些写文档前没有经过严格测试的人,这是一种极不负责的行为,害人害己!最后我是在《Apache HTTP Server 版本2.2》文档中按照官方教程一步一步测试成功的!
教程链接如下:
http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/cgi.html
另外参考了一本书籍——《php4 程序设计(PDF)》china-pub.com出版  第12章:什么是agi,这章节也讲得很清晰明了。


4.扫盲
什么apxs ,看了下面的不用我多说了吧?
[root@elastix22-best php-5.2.17]# ./configure --help |grep apxs
  --with-apxs[=FILE]      Build shared Apache 1.x module. FILE is the optional
                          pathname to the Apache apxs tool [apxs]
  --with-apxs2filter[=FILE]   
                          pathname to the Apache apxs tool [apxs]
  --with-apxs2[=FILE]     Build shared Apache 2.0 Handler module. FILE is the optional
                          pathname to the Apache apxs tool [apxs]
                          pathname to the Apache apxs tool [apxs]
[root@elastix22-best php-5.2.17]#
总之,如果加上 --with-apxs[2]选项,我们会把php编译成apache的动态模块,这个模块式和apache启动就载入内存的。而我们现在是要把php编译成可以执行cgi的程序,总所周知,phpcgi(非FastCGI类型)是不会常驻内存的,只要在web服务器需要的时候才会将phpcgi解释器载入内存。
注意这里我们要编译的选项中,必须去掉 --with-apxs2 这个选项,而且要加上 --enable-force-cgi-redirect 选项
[root@elastix22-best php-5.2.17]# ./configure --help |grep force-cgi
  --enable-force-cgi-redirect
[root@elastix22-best php-5.2.17]#

5.编译前先yum安装如下软件:
yum -y install pcre-devel libxml2-devel libxml2-devel libpng-devel libjpg libc-client libc-client-deve libmcrypt libmcrypt-devel curl curl-devel bzip2 bzip2-devel libjpeg libjpeg-devel libc-client-devel mysql-devel libmhash libmhash-devel

6.编译php选项如下:
./configure \
--prefix=/opt/phpcgi \
--with-mysql \
--with-jpeg-dir \
--with-png-dir \
--with-config-file-path=/opt/phpcgi \
--with-curl \
--with-zlib \
--with-gd \
--with-gettext \
--with-mhash \
--with-mcrypt \
--with-openssl \
--with-pdo-mysql \
--enable-sockets \
--enable-mbstring \
--enable-sqlite-utf8 \
--enable-bcmath \
--with-libxml-dir \
--with-zlib-dir \
--with-mysqli=/usr/bin/mysql_config \
--enable-soap \
--with-imap \
--with-imap-ssl \
--with-kerberos \
--with-pcre-dir \
--with-pcre-regex=/usr \
--with-pear \
--with-mysql-sock \
--with-bz2 \
--enable-zip \
--enable-force-cgi-redirect

上面红色的是与通常编译php不一样的地方。

7.编译后make ,make install 成功!如下:
......
......

Build complete.
Don't forget to run 'make test'.
You have new mail in /var/spool/mail/root
[root@elastix22-best php-5.2.17]#
[root@elastix22-best php-5.2.17]# make install
Installing PHP SAPI module:       cgi
Installing PHP CGI binary: /opt/phpcgi/bin/
Installing PHP CLI binary:        /opt/phpcgi/bin/
Installing PHP CLI man page:      /opt/phpcgi/man/man1/
Installing build environment:     /opt/phpcgi/lib/php/build/
Installing header files:          /opt/phpcgi/include/php/
Installing helper programs:       /opt/phpcgi/bin/
  program: phpize
  program: php-config
Installing man pages:             /opt/phpcgi/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /opt/phpcgi/lib/php/
[PEAR] Archive_Tar    - installed: 1.3.7
[PEAR] Console_Getopt - installed: 1.2.3
[PEAR] Structures_Graph- installed: 1.0.3
[PEAR] XML_Util       - installed: 1.2.1
[PEAR] PEAR           - installed: 1.9.1
Wrote PEAR system config file at: /opt/phpcgi/etc/pear.conf
You may want to add: /opt/phpcgi/lib/php to your php.ini include_path
Installing PDO headers:          /opt/phpcgi/include/php/ext/pdo/
[root@elastix22-best php-5.2.17]#
说明:php-cgi和php-cli的区别
一般情况下,PHP是运行于Web环境上的产品,与HTML标签混合开发,将结果显示在浏览器上,作为交互式脚本。PHP位于Web服务器 (Apache、Microsoft IIS等)和用户之间的中间层,称为SAPI(Short for web server API)。在Web服务器上,PHP始终充当引用与用户界面的功能。
PHP CLI版本有些类似于PHP的CGI模式,尽管它们之间有很多共同的行为,但CLI和CGI是分属于不同的SAPI的。
CLI没有用到GET或POST表单处理,无MIME的头信息输出,以及其他隐含的SAPI实现。



8.拷贝php配置文件到指定目录
[root@elastix22-best php-5.2.17]# ls *ini*
php.ini-dist  php.ini-recommended
[root@elastix22-best php-5.2.17]#
[root@elastix22-best php-5.2.17]# cp php.ini-dist /opt/phpcgi/php.ini
[root@elastix22-best php-5.2.17]#

9.mkdir /opt/phpcgi/phpcgi-bin ,并打算把要执行的cgi脚本文件*.cgi全部放到这个目录下面。我们先来看一下目录结构:
[root@elastix22-best bin]# pwd
/opt/phpcgi/bin
[root@elastix22-best bin]# ls -F
pear*  peardev*  pecl*  php*  php-cgi*  php-config*  phpize*
[root@elastix22-best bin]#
从上面的可以发现 bin/中没有目录,全部是可执行文件

10.我的正确配置文件如下
httpd.conf中配置如下:
NameVirtualHost *
<VirtualHost *>
        ServerName php-cgi-test
        ServerAlias php-cgi-test-test
       ScriptAlias /phpcgi-bin /opt/phpcgi/phpcgi-bin  ###phpcgi-bin是我自己建立的目录,如果是perlagi,可能就建立perlcgi-bin目录了
        AddHandler cgi-script .php
        <Directory /opt/phpcgi/phpcgi-bin>
                Options +ExecCGI +FollowSymLinks
                AllowOverride None
        </Directory>
</VirtualHost>

然后我的cgi测试脚本及目录如下:
[root@elastix22-best phpcgi-bin]# pwd
/opt/phpcgi/phpcgi-bin
[root@elastix22-best phpcgi-bin]# more t.php
#!/opt/phpcgi/bin/php
<?php
#header("Content-type: text/plain\n\n");
echo "Content-Type: text/html\n\n";
#echo "Content-Type: text/plain\n\n";
#system('ls /usr/');
echo "<html><body>----</body></html>";

?>
[root@elastix22-best phpcgi-bin]#
[root@elastix22-best phpcgi-bin]# more a.php
<?php
header("Content-Type: text/html\n\n");
#system('ls /usr/');
echo "<html><body>aaaa134aaaaa</body></html>";

?>
[root@elastix22-best phpcgi-bin]#

说明:
1.网上的资料都是些垃圾,误导甚多!
比如:
A . 网上有时候说httpd.conf要写成:AddHandler php-cgi-script .php ,我测了没有成功,而实际上要写成AddHandler cgi-script .php ,不要php- 4个字母。
B . 还有,网上好多资料都说要有 “Action php-cgi-script /cgi-bin/php” 或者 “Action  application/x-httpd-php /phpcgi-bin/php” 或者“Action  application/x-httpd-php "/opt/phpcgi/bin/php-cgi" ” ,总之搞不清楚为什么非要加个Action指令,可能是让cgi脚本被指定的php解释器执行,但是我看后面那个文件,有时候是目录,有时候又像是文件,总之是乱七八糟,让人迷惑不解。
C .在编写phpcgi脚本的时候:有的说第一行不要用 “#!/opt/phpcgi/bin/php” ,直接上“<?...” ;有的又要 “#!/opt/phpcgi/bin/php”  。另外,就是cgi第一行必须输出http头文件,并带两个空行,有的说要用header函数 ,例如:header("Content-Type: text/html\n\n"); ,有的说用echo "Content-Type: text/html\n\n";  ,最后事实证明,后者是正确的。如果用前者header函数,必然出现500服务器错误!

网上的资料真的很多不靠谱!
相信权威文档,严格按照官方文档或者手册办事,会少走很多弯路:
http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/cgi.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值