Gentoo Logo

升级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/phpdev-php/php-cgidev-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标记;除了你不能同时开启apacheapache2两个USE标记。

这些ebuild的所有点是你可以同时拥有PHP4和PHP5:

代码 2.1: 安装PHP

(安装最新的有CLI和Apache2模块的PHP)
USE="cli apache2" emerge 'dev-lang/php'

(只安装PHP4)
USE="cli apache2" emerge '=dev-lang/php-4*'

(安装两种,PHP4和PHP5)
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-php4dev-php5。这些分类主要被用于PECL包像pecl-pdopecl-apcphp-java-bridgexdebug

安装pecl-apc

代码 2.2: 安装PHP扩展像PECL::APC(示例)

(只为PHP4安装APC)
emerge dev-php4/pecl-apc

(只为PHP5安装APC)
emerge dev-php5/pecl-apc

(为PHP4和PHP5安装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-toolkituse the php-select toolphp-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-php4dev-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: 移除旧的包(示例)

(反安装PHP包)
emerge --unmerge php mod_php

(反安装PHP扩展)
emerge --unmerge PECL-apc PECL-imagick xdebug

(反安装PHP库或应用程序)
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标记(示例)

(检查PHP4包)
emerge --pretend --verbose '=dev-lang/php-4*'

(检查PHP5包)
emerge --pretend --verbose '=dev-lang/php-5*'

(为PHP4检查PHP扩展)
emerge --pretend --verbose dev-php4/pecl-apc dev-php4/pecl-imagick dev-php4/xdebug

(为PHP5检查PHP扩展)
emerge --pretend --verbose dev-php5/pecl-apc dev-php5/pecl-imagick

(检查PHP库和应用程序)
emerge --pretend --verbose PEAR-PEAR PEAR-Mail PEAR-MDB smarty

如果一切都好了,请编译安装PHP:

代码 3.6: 编译安装新的包(示例)

(编译PHP4包)
emerge '=dev-lang/php-4*'

(编译PHP5包)
emerge '=dev-lang/php-5*'

(为PHP4编译安装扩展)
emerge dev-php4/pecl-apc dev-php4/pecl-imagick dev-php4/xdebug

(为PHP5编译安装扩展)
emerge dev-php5/pecl-apc dev-php5/pecl-imagick

(编译PHP库或应用程序)
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(为建立使用phpizephp-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版本

(为cli)
php-select php

(为cgi)
php-select php-cgi

(为phpize,php-config)
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: 选择想要得到的版本

(为cli)
php-select php php4

(为cgi)
php-select php-cgi php5

(为phpize,php-config)
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_pathextension_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

(为PHP4设置)
APACHE2_OPTS="-D PHP4"

(或者为PHP5设置)
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树。



打印

更新于2007年 8月 11日

总结: 这个文档描述了最终用户安全升级PHP时所需要做的步骤。

Andreas Korthaus
作者

Zezhou Jiang
译者

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.