升级PHP
1.
介绍
在过去有许多要求为什么在Portage里PHP5还没有被标记成稳定。问题不是PHP5包自身,PHP5没有被标记成稳定的主要原因是在Portage里的许多应用程序、PHP扩展和包还无法在PHP5下工作,但是我们毫无办法。PHP5不是100%地向后兼容PHP4,而且不是所有的PHP4程序可以被移植到PHP5上运行。在未来的很长一段时间内许多用户仍需要PHP4的支持。
这个问题的解决方案是提供一个在同一个主机同时混合PHP4和PHP5环境。但是对于现在的PHP包和eclass的界面来说是不可能的,所以必须有一个新的界面,新的eclass和新的ebuild。
这个文档详细描述了如何在不中断你的系统的情况下升级。
注意:
新的PHP包需要新的Apache界面,所以如果你还没升级,请看看升级Apache。
|
2.
变化
统一的基本PHP包
所有的PHP的ebuild dev-php/php,dev-php/php-cgi和dev-php/mod_php已经整合成一个ebuild了:dev-lang/php。
选择你需要的SAPI,使用这些USE标记:
-
cgi——编译和安装/usr/bin/php-cgi
-
cli——编译和安装/usr/bin/php
-
apache——编译和安装Apache 1.3的mod_php(新布局)
-
apache2——编译和安装Apache 2.0的mod_php(新布局)
你可以混合并且组合这些USE标记;除了你不能同时开启apache和apache2两个USE标记。
这些ebuild的所有点是你可以同时拥有PHP4和PHP5:
代码 2.1: 安装PHP |
USE="cli apache2" emerge 'dev-lang/php'
USE="cli apache2" emerge '=dev-lang/php-4*'
USE="cli apache2" emerge '=dev-lang/php-4*' '=dev-lang/php-5*'
|
注意:
USE标记不能像这样设,请使用/etc/portage/package.use,这个稍后会说。
|
新的Portage分类
新的PHP的ebuild已经从dev-php被移到dev-lang/php下了。为了独立地安装PHP4和PHP5,两个新的Portage分类已经被创建了:dev-php4和dev-php5。这些分类主要被用于PECL包像pecl-pdo,pecl-apc,php-java-bridge或xdebug。
安装pecl-apc:
代码 2.2: 安装PHP扩展像PECL::APC(示例) |
emerge dev-php4/pecl-apc
emerge dev-php5/pecl-apc
emerge dev-php4/pecl-apc dev-php5/pecl-apc
|
新目录
- 这些ebuild会将他们的内容安装到/usr/lib/php4和/usr/lib/php5下(Apache的模块被安装到相应的Apache目录里)
- PEAR包和其他的PHP库文件将会被安装到/usr/share/php(之前是/usr/lib/php)
- PECL包已经不再往php.ini配置文件下添加配置知道了,但添加一个[PACKAGE].ini文件到/etc/php/[SAPI]/ext目录下。
PHP库的符号链接
如果你安装不止一个版本的PHP,如:
代码 2.3: 编译安装PHP4和PHP5 |
USE="cgi cli apache2" emerge '=dev-lang/php-4*' '=dev-lang/php-5*'
|
ebuild将会在/usr/bin里为你安装的最后一个PHP版本建立链接,在这个例子中PHP5在PHP4后面装好。如果你想要/usr/bin/php或者/usr/bin/php-cgi指向PHP4,或者其中一个指向PHP4另一个指向PHP5,你可以使用来自app-admin/php-toolkit的use the php-select tool。php-select将会使链接正确的二进制库变得十分简单。
3.
升级说明
找到要升级的包
首先你要想好你要升级哪些包。你可以使用equery工具来达到目的,它是app-portage/gentoolkit包的一部分:
代码 3.1: 列出在dev-php中已安装的包 |
$ equery list 'dev-php/'
[ Searching for all packages in 'dev-php' among: ]
* installed packages
[I--] [ ] dev-php/php-4.4.0 (0)
[I--] [ ] dev-php/mod_php-4.4.0 (1)
[I--] [ ] dev-php/smarty-2.6.10 (0)
[I--] [ ] dev-php/PEAR-PEAR-1.3.5-r1 (0)
[I--] [ ] dev-php/PEAR-Mail-1.1.6 (0)
[I--] [ ] dev-php/PEAR-MDB-1.3.0 (0)
[I--] [ ] dev-php/PECL-apc-3.0.6 (0)
[I--] [ ] dev-php/PECL-imagick-0.9.11 (0)
[I--] [ ] dev-php/xdebug-2.0.0_beta3 (0)
|
重要:
你安装好的包可能有巨大的不同,请确定你自己运行了这个命令。你应该保存上面建立好了的你的列表,来确保你将会升级所有的包。
|
注意:
许多web应用程序因为它们不使用web应用程序eclass,所以不会受到影响,它们需要小心地正确安装。你可能想要检查一下是否那里有新的修订。
|
PHP扩展,像
- PECL-apc
- PECL-imagick
- xdebug
已经被分为两个Portage分类:dev-php4和dev-php5,来使它能够为两个PHP版本独立地使用它们。还有,这些包的大部分已经被重命名过了:
新目录和重命名的示例:
| PHP扩展 |
旧的 |
新PHP4 |
新PHP5 |
| APC |
dev-php/PECL-apc |
dev-php4/pecl-apc |
dev-php5/pecl-apc |
| Imagick |
dev-php/PECL-imagick |
dev-php4/pecl-imagick |
dev-php5/pecl-imagick |
| Xdebug |
dev-php/xdebug |
dev-php4/xdebug |
dev-php5/xdebug |
注意:
在重新编译安装这些扩展前,你必须到/usr/portage下找出那些包是如何被重命名的。
|
移除旧的包
我们对Gentoo下的PHP做了很多改变。你必须在安装新的包前完全移除你的旧的PHP包:
代码 3.2: 移除旧的包(示例) |
emerge --unmerge php mod_php
emerge --unmerge PECL-apc PECL-imagick xdebug
emerge --unmerge PEAR-PEAR PEAR-Mail PEAR-MDB smarty
|
设置USE标记
因为我们已经添加了一些新的USE标记,你可能想要重新看看它们,并且添加适当的USE标记到/etc/portage/package.use里(如果不存在的话需要创建)
注意:
/etc/portage/package.use将会为你的PHP安装设置USE标记,并且不通过修改make.conf来记录他们。
|
请根据你要安装的PHP支持来设置USE标记(推荐至少要设置cli这个USE标记):
代码 3.3: dev-lang/php的USE标记(示例) |
dev-lang/php -* cli apache2 ctype expat fastbuild ftp gd hash iconv memlimit mysql nls pcre pic pdo reflection session simplexml sockets spl ssl tokenizer truetype unicode xml xsl zlib
|
注意:
-*将会禁用所有的USE标记(它甚至会禁用一些PHP基本的特性像Session-,PCRE-,gd-和MySQL支持),所以你必须特别地为一些你想要的扩展或特性指定USE标记。请参看管理扩展来获取更多细节。你必须为以上默认的设置USE标记像这些:如果你想用pcre参看preg_*函数,或者你想用会话参看会话处理函数。
|
如果你想安装同时PHP4和PHP5,你可以为每个不同版本加入不同的USE标记:
代码 3.4: PHP4和PHP5 USE标记的不同(示例) |
=dev-lang/php-4* -* cli cgi apache2 ctype expat fastbuild force-cgi-redirect ftp gd iconv ipv6 memlimit mysql nls pcre pic posix session sockets ssl tokenizer truetype unicode xml xsl zlib
=dev-lang/php-5* -* cli cgi apache2 ctype fastbuild force-cgi-redirect ftp gd hash iconv ipv6 memlimit mysql nls pcre pic posix pdo reflection session simplexml soap sockets spl sqlite ssl tokenizer truetype unicode xml xmlreader xmlwriter xsl zlib
|
注意:
你可以在推荐的USE标记里找到推荐的USE标记列表。在overlay的维基百科USE标记列表里你能找到PHP能用的USE标记的列表。 |
编译安装PHP
现在选择单独安装PHP4或单独安装PHP5,还可以同时安装。如果你要单独安装PHP4你必须emerge =dev-lang/php-4*,单独安装PHP5(最新)你可以用dev-lang/php,如果要同时安装的话,你必须emerge =dev-lang/php-4*和=dev-lang/php-5*。
检查USE标记设置:
代码 3.5: 检查USE标记(示例) |
emerge --pretend --verbose '=dev-lang/php-4*'
emerge --pretend --verbose '=dev-lang/php-5*'
emerge --pretend --verbose dev-php4/pecl-apc dev-php4/pecl-imagick dev-php4/xdebug
emerge --pretend --verbose dev-php5/pecl-apc dev-php5/pecl-imagick
emerge --pretend --verbose PEAR-PEAR PEAR-Mail PEAR-MDB smarty
|
如果一切都好了,请编译安装PHP:
代码 3.6: 编译安装新的包(示例) |
emerge '=dev-lang/php-4*'
emerge '=dev-lang/php-5*'
emerge dev-php4/pecl-apc dev-php4/pecl-imagick dev-php4/xdebug
emerge dev-php5/pecl-apc dev-php5/pecl-imagick
emerge PEAR-PEAR PEAR-Mail PEAR-MDB smarty
|
PHP4和PHP5的相似之处:选择使用哪个cli/cgi二进制包
在你编译安装后你将会有在/usr/lib/php4/bin和/或/usr/lib/php5/bin里的cli和/或cgi的二进制包。如果你把PHP4和PHP5都装了,那么Portage不能为你决定哪一个应该被作为默认的版本,所以它总是把你安装在/usr/bin的最后一个版本作为默认的。所以如果你最后装了PHP5,你将会看到/usr/bin/php被链接到了/usr/lib/php5/bin/php。所以一个cli和/或cgi的二进制包和php-devel(为建立使用phpize和php-config的PHP扩展)必须被链接(在/usr/bin里),这可以很简单地用app-admin/php-toolkit的一部分php-select来完成。
注意:
dev-lang/php包依赖于app-admin/php-toolkit所以app-admin/php-toolkit应该能够在编译安装担心的PHP包以后自动启用。
|
假如你已经编译安装了=dev-lang/php-4*或=dev-lang/php-5*,输入如下命令php-select来看看最近选择的PHP版本:
代码 3.7: 列出最近选择的PHP版本 |
php-select php
php-select php-cgi
php-select php-devel
|
你应该会看到像这样的东西:
代码 3.8: php-select的示例输出 |
# php-select php
/usr/bin/php is set to /usr/lib/php5/bin/php
|
这意味着默认的PHP的cli二进制包路径/usr/bin/php被链接到PHP5的二进制包路径/usr/lib/php5/bin/php下了。所以PHP脚本使用的/usr/bin/php会被PHP5运行。
用php-select来改变默认的PHP版本
如果你不喜欢你在最后一章找出的默认版本设置,你可以再次使用php-select来选择一个想要的版本:
代码 3.9: 选择想要得到的版本 |
php-select php php4
php-select php-cgi php5
php-select php-devel php5
|
注意:
请输入php-select -h来详细了解更多php-select功能的细节。
|
检查符号链接:
代码 3.10: 检查符号链接 |
# stat /usr/bin/php /usr/bin/php-cgi /usr/bin/phpize /usr/bin/php-config | grep File
File: `/usr/bin/php' -> `/usr/lib/php4/bin/php'
File: `/usr/bin/php-cgi' -> `/usr/lib/php5/bin/php-cgi'
File: `/usr/bin/phpize' -> `/usr/lib/php5/bin/phpize'
File: `/usr/bin/php-config' -> `/usr/lib/php5/bin/php-config'
|
注意:
请记住php-select只改变默认的版本。如果你PHP4和PHP5的cgi/cli都装了,你可以用直接路径像/usr/lib/php4/bin/php和/usr/lib/php5/bin/php来运行你个特定版本的PHP脚本。你可以在相同的Apache实例中使用PHP4和PHP5的cgi,但是你不能在相同的Apache实例中使用两个不同的PHP的Apache模块,参见PHP4和PHP5配置指南来得到更多细节。
|
4.
配置文件的移动
Gentoo的PHP包在/etc/php下存储配置文件,它包括每个不同PHP版本的每个SAPI的一个子目录:
代码 4.1: 列出PHP配置目录 |
$ ls -1 /etc/php
apache2-php4
apache2-php5
cli-php4
cli-php5
|
每个子目录包含一个自己的php.ini,像旧的包一样。
php.ini的改变
你应该使用etc-update或者dispatch-conf,然后看看在php.ini里的新旧配置的不同。两个规则你必须明确的是include_path和extension_dir。但是在这里请小心,因为extension_dir在两个不同的PHP版本间是不同的(在5.0和5.1间也一样!)。
PHP5.1在/etc/php/apache2-php5/php.ini和/etc/php/cli-php5/php.ini的示例:
代码 4.2: php.ini的旧配置 |
include_path = ".:/usr/lib/php"
extension_dir = "/usr/lib/php/extensions/no-debug-non-zts-20050617/"
|
代码 4.3: php.ini的新设置 |
include_path = ".:/usr/share/php"
extension_dir = "/usr/lib/php5/lib/php/extensions/no-debug-non-zts-20050617/"
|
警告:
确保你使用了etc-update或者dispatch-conf来查看所有文件的正确设置。
|
改变了的PHP扩展的配置
新的PHP包不会在php.ini里存储共享的PHP扩展的配置指令。这些指令会被存储在每一个扩展的在/etc/php/*/ext目录里的自己的配置文件里。如果要启用/禁用共享的扩展,/etc/php/*/ext-active的链接被使用了。如果你想要启动一个扩展,创建/etc/php/*/ext-active的链接到/etc/php/*/ext/目录里的适当的[EXTENSION].ini文件上。如果你想要禁用扩展,只要移除链接就好。
如果你之前已经装了dev-php/PECL-apc,APC配置文件已经储存在你的php.ini里了。如果你重新编译安装了型的dev-php5/pecl-apc包,默认的APC配置文件将会被写到/etc/php/*5/ext/apc.ini里。
所以你必须从/etc/php/*5/php.ini移动你的APC配置规则到/etc/php/*5/ext/apc.ini,然后创建一个符号链接从/etc/php/*5/ext-active/apc.ini到/etc/php/*5/ext/apc.ini。
注意:
如果你把PHP安装作一个Apache的模块,请确定你在安装和配置后重启了Apache。
|
5.
配置Apache来与PhP4和/或PHP5一起工作
为了配置Apache来加载PHP4或PHP5模块(mod_php),你应该分别添加-D PHP4和-D PHP5到在/etc/conf.d/apache2文件里的APACHE2_OPTS变量里。
代码 5.1: 配置Apache来加载mod_php |
APACHE2_OPTS="-D PHP4"
APACHE2_OPTS="-D PHP5"
|
有许多方法可以使Apache同时运行两个PHP版本。最简单的方法是把PHP4和PHP5作为一个cgi二进制库来使用,或者一个PHP4的cgi和一个PHP5的模块(或者是其他的办法)。在同一Apache实例中无法同时使用PHP4模块和PHP5模块。
我们创建了PHP4和PHP5配置指南来提供一些可能的解决方案。
6.
支持和得到帮助
如果你在使用新的Gentoo的PHP包时遇到麻烦,你可以在这里找到帮助:
-
关于Gentoo上的PHP的常见问题
-
PHP Overlay的开发页面
-
在irc.freenode.net上的#gentoo-php;这是一个overlay的正式作者经常逛的聊天室。我们很希望在那见到你!
-
Gentoo论坛这里是寻求帮助的好地方。这里有很多每时每刻都阅读论坛的其他Gentoo用户,如果你急需得到帮助,这里是个好地方。
对于新的包的细节,你可以看看gentoo-dev上Stuart的邮件。你也许觉得Stuart的PHP博客也很有趣。
在开发页面上,你将会发现很多文档和最近的ebuild,这些将会迟一些才被移到官方的Portage树。
本文档的内容遵循知识共享-署名-相同方式共享许可协议
|