主題:Apache2 PHP4 與 PHP5 共存
作業環境:FreeBSD 6.1-RELEASE
軟體版本: Apache 2.0.59
PHP 4.4.4
PHP 5.2.0
mod_fastcgi 2.4.2
說明:要在 Apache 裡同時跑 PHP4 與 PHP5,原理很簡單就是 PHP4 跑 Apache module PHP5 跑 PHP-CGI
版本更新 2006.11.30 修正 php5 安裝的過程
2006.11.27 修正安裝參數、增加 extension 的安裝、增加討論頁面
2006.11.26 增加執行時的圖片
2006.11.25 版面調整、增加說明文字
2006.11.22 新增此頁面
討論頁面 1.安裝 Apache 2.0.59 [root@sun ~]#cd /usr/ports/www/apache20;make install clean
2.安裝 PHP4[root@sun ~]#cd /usr/ports/www/mod_php4/ make config
[root@sun mod_php4]#make config
取消跟 CGI 有關的選項,如果用不到 Suhosin、ipv6 可以只保留 Apache 的選項
[X] APACHE Build Apache module
[X] SUHOSIN Enable Suhosin protection system
[X] IPV6 Enable ipv6 support
改變安裝路徑將 PHP4 安裝到 /usr/local/php4 下面
[root@sun mod_php4]#make PREFIX=/usr/local/php4 install clean
編輯 Apache 設定檔
[root@sun mod_php4]#joe /usr/local/etc/apache2/httpd.conf
加入 PHP4 的設定,並且將 Log 的等級調成 debug
LoadModule php4_module modules/libphp4.so
AddType application/x-httpd-php .php .phtml .php3
LogLevel debug
3.試跑一下檢查 Log files,有 PHP/4.4.4 with Suhosin-Patch configured 訊息表示 mod_php4 安裝成功
[root@sun ~]#apachectl start
[root@sun ~]#tail /var/log/http-error.log
[Sun Nov 19 00:24:55 2006] [notice] Apache/2.0.59 (FreeBSD) PHP/4.4.4 with Suhosin-Patch configured -- resuming normal operat
[Sun Nov 19 00:24:55 2006] [info] Server built: Nov 18 2006 21:35:46
[Sun Nov 19 00:24:55 2006] [debug] prefork.c(956): AcceptMutex: flock (default: flock)
4.安裝 mod_fastcgi[root@sun ~]#cd /usr/ports/www/mod_fastcgi;make install clean
加入 mod_fastcgi 相關設定
[root@sun mod_fastcgi]#joe /usr/local/etc/apache2/httpd.conf
LoadModule modules/mod_fastcgi.so
FastCgiIpcDir /tmp/fcgi_ipc/
AddHandler fastcgi-script .fcgi
5.試跑一下檢查 Log files,如果出現 mod_fastcgi/2.4.2 configured 訊息表示安裝成功
[root@sun ~]#apachectl start
[root@sun ~]#tail /var/log/http-error.log
[Sun Nov 19 01:12:10 2006] [notice] Apache/2.0.59 (FreeBSD) PHP/4.4.4 with Suhosin-Patch mod_fastcgi/2.4.2 configured -- resu
[Sun Nov 19 01:12:10 2006] [info] Server built: Nov 18 2006 21:35:46
[Sun Nov 19 01:12:10 2006] [debug] prefork.c(956): AcceptMutex: flock (default: flock)
6.安裝 php5因為安裝 php5 要用到 libxml2 所以要先安裝,否則用自訂安裝的方式會將 libxml2 安裝到 /usr/local/php5 下面,如果已經安裝 libxml2 的話可以跳過這一步。
[root@sun ~]#cd /usr/ports/textproc/libxml2 ; make install clean
也可以用 mod_php5 安裝,只不過是在 pkg_info 裡面有不同的紀錄而已
[root@sun ~]#cd /usr/ports/lang/php5 ; make config
選擇所有的 CGI only 選項,並且取消 Apache module,如果在 php4 有把 Suhosin、ipv6 安裝進去的話,php5 就不能勾選,另外如果要用 CLI 的話可以勾選。
[X] CGI Build CGI version
[X] REDIRECT Enable force-cgi-redirect support (CGI only)
[X] DISCARD Enable discard-path support (CGI only)
[X] FASTCGI Enable fastcgi support (CGI only)
[X] PATHINFO Enable path-info-check support (CGI only)
改變安裝路徑將 PHP5 安裝到 /usr/local/php5 下面
[root@sun php5]#make PREFIX=/usr/local/php5 install clean
7.改 Apache 設定檔[root@sun php5]#joe /usr/local/etc/apache2/httpd.conf
加入 php5 相關設定
AddHandler php5-fcgi .php5
Action php5-fcgi /php5.fcgi
讓 /usr/local/www/ 下面的資料夾可以執行 CGI,加入 Options ExecCGI
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
#
http://httpd.apache.org/docs/2.0/mod/core.html#options# for more information.
#
Options Indexes FollowSymLinks ExecCGI
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit Indexes
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
8.新增 php-cgi script放在 /usr/local/www/data-dist/php5.fcgi
#!/bin/sh
PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
exec /usr/local/php5/bin/php-cgi -c /usr/local/php5/etc/php.ini
將權限改成 755
[root@sun data]#chmod 755 php5.fcgi
9.跑起來[root@sun ~]#apachectl start
[root@sun ~]#ps aux | grep www
www 47131 0.0 1.2 53752 6296 ?? I 8:45下午 0:00.02 /usr/local/sbin/httpd -k start
www 47132 0.0 1.3 53936 6472 ?? I 8:45下午 0:00.04 /usr/local/sbin/httpd -k start
www 47133 0.0 1.3 53896 6432 ?? I 8:45下午 0:00.02 /usr/local/sbin/httpd -k start
www 47134 0.0 1.2 53776 6304 ?? I 8:45下午 0:00.01 /usr/local/sbin/httpd -k start
www 47135 0.0 1.2 53776 6304 ?? I 8:45下午 0:00.01 /usr/local/sbin/httpd -k start
www 47136 0.0 1.2 53776 6304 ?? I 8:45下午 0:00.01 /usr/local/sbin/httpd -k start
www 47139 0.0 1.2 53776 6304 ?? I 8:45下午 0:00.01 /usr/local/sbin/httpd -k start
www 47140 0.0 1.0 14112 5176 ?? Is 8:45下午 0:00.11 /usr/local/bin/php-cgi -c /usr/local/etc/php5/php.ini
www 47141 0.0 1.0 14240 5328 ?? I 8:45下午 0:00.02 /usr/local/bin/php-cgi -c /usr/local/etc/php5/php.ini
www 47142 0.0 1.0 14240 5272 ?? I 8:45下午 0:00.01 /usr/local/bin/php-cgi -c /usr/local/etc/php5/php.ini
www 47143 0.0 1.0 14240 5272 ?? I 8:45下午 0:00.01 /usr/local/bin/php-cgi -c /usr/local/etc/php5/php.ini
www 47144 0.0 1.0 14112 5192 ?? I 8:45下午 0:00.00 /usr/local/bin/php-cgi -c /usr/local/etc/php5/php.ini
www 47145 0.0 1.2 53776 6304 ?? I 8:45下午 0:00.01 /usr/local/sbin/httpd -k start
10.放 phpinfo 上去試試看跑 php4 的副檔名就用 php,跑 php5 的副檔名就用 php5
[root@sun data]#cp info.php info.php5
實際執行狀況


11.安裝 PHP4-extension 因為 PHP4 與 PHP5 是用自訂位置的方式,所以在安裝 extension 的時候必須將 PHP 的 build environment、header files、helper programs 的位置 link 到原來 ports 的位置
[root@sun ~]#cd /usr/local/include
[root@sun include]#ln -s /usr/local/php4/include/php php
[root@sun ~]#cd /usr/local/lib
[root@sun lib]#ln -s /usr/local/php4/lib/php php
[root@sun ~]#cd /usr/local/bin/
[root@sun bin]#ln -s /usr/local/php4/bin/php-config php-config
[root@sun bin]#ln -s /usr/local/php4/bin/phpize phpize
安裝 php4-extension,選需要的 extension 安裝
[root@sun ~]#cd /usr/ports/lang/php4-extensions/
[root@sun php4-extensions]#make install clean
安裝完後將 extension.ini 移到自訂的位置下面
[root@sun ~]#cd /usr/local/php4/etc
[root@sun etc]#mkdir php
[root@sun ~]#cd /usr/local/etc/php
[root@sun php]#cp extensions.ini /usr/local/php4/etc/php/
12.安裝 PHP5-extension 安裝方法一樣只要把 link 改成 PHP5 的位置就可以了,PHP5 要多 link 一個 php-cgi
[root@sun ~]#cd /usr/local/include
[root@sun include]#ln -s /usr/local/php5/include/php php
[root@sun ~]#cd /usr/local/lib
[root@sun lib]#ln -s /usr/local/php5/lib/php php
[root@sun ~]#cd /usr/local/bin/
[root@sun bin]#ln -s /usr/local/php5/bin/php-config php-config
[root@sun bin]#ln -s /usr/local/php5/bin/phpize phpize
[root@sun bin]#ln -s /usr/local/php5/bin/php-cgi php-cgi
安裝 php5-extension,選需要的 extension 安裝
[root@sun ~]#cd /usr/ports/lang/php5-extensions/
[root@sun php5-extensions]#make install clean
安裝完後將 extension.ini 移到自訂的位置下面
[root@sun ~]#cd /usr/local/php5/etc
[root@sun etc]#mkdir php
[root@sun ~]#cd /usr/local/etc/php
[root@sun php]#cp extensions.ini /usr/local/php5/etc/php/
13.讓特定資料夾 php5 副檔名改成 php利用 apache 設定讓特定的資料夾副檔名由 php5 改回 php,編輯 apache 設定檔加入以下敘述,使 /usr/local/www/php5 下面的 php 用 php5-fcgi 跑,其他資料夾也可如法炮製。
AddHandler php5-fcgi .php
參考連結http://www.deanspot.org/~alex/php5fcgi/index.htmlhttp://www.gentoo.org/proj/en/php/php4-php5-configuration.xmlhttp://timdorr.com/archives/2006/02/php4_and_php4_s.php