如何在安装了多个PHP版本的系统中,使用PECL为特定的PHP版本安装PHP扩展?

58
我已按照此手册在Ubuntu上从PPA安装了php5.6和php7.0。

http://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu

但我不知道如何使用pecl为php5.6或php7.0安装扩展。
例如,我已经在php5.6中安装了libeventamqp版本。
现在,当我键入pecl install libevent并且我的活动php版本是php7.0(使用update-alternatives --set php /usr/bin/php7.0)时,pecl返回消息,指出libevent已经安装。
但它只在php5.6中安装了(当此版本处于活动状态时),现在我想在php7.0中进行安装。
哪些命令可以帮助我?
更新
我已经找到了这些命令,可以将pecl切换到php7.0并将它们打包成可执行的bash脚本:
#!/bin/bash

sudo update-alternatives --set php /usr/bin/php7.0

sudo pecl config-set php_ini /etc/php/7.0/cli/php.ini
sudo pecl config-set ext_dir /usr/lib/php/20151012/
sudo pecl config-set bin_dir /usr/bin/
sudo pecl config-set php_bin /usr/bin/php7.0
sudo pecl config-set php_suffix 7.0

并且适用于PHP5.6

#!/bin/bash

sudo update-alternatives --set php /usr/bin/php5.6

sudo pecl config-set php_ini /etc/php/5.6/cli/php.ini
sudo pecl config-set ext_dir /usr/lib/php/20131226/
sudo pecl config-set bin_dir /usr/bin/
sudo pecl config-set php_bin /usr/bin/php5.6
sudo pecl config-set php_suffix 5.6

但是它们并没有帮助我,即使我切换到php7,pecl仍然给我列出了已经安装在php5.6上的扩展列表。

pecl list
Installed packages, channel pecl.php.net:
=========================================
Package  Version State
amqp     1.7.1   stable
libevent 0.1.0   beta
stats    1.0.3   stable

对于php7.0来说,它应该是空的!

如何解决这个问题?

更新:

对于amqp,我只需安装php-amqp包而不使用pecl即可。

apt-get install php-amqp

目前尚无php7版本的libevent,但是我还没有找到在5.6和7版本之间切换pecl安装的方法,所以问题仍然存在。


为什么你有两个版本的PHP? - Archish
2
我需要两者都满足我的特定需求。例如,我有两个项目,一个应该使用5.6运行,第二个应该使用7运行。而且我没有时间将第一个迁移到php7。 - Oleg Abrazhaev
你找到任何解决方案了吗? - ChickenFeet
1
鸡爪,我认为这里的第一个答案是可行的方法。 - Oleg Abrazhaev
@OlegAbrazhaev 应该接受Matt的答案。 - Ejaz
4个回答

96

这是我尝试编写脚本时最有效的方法(如果有其他人与我一样遇到这个问题):

$ pecl -d php_suffix=5.6 install <package>
$ pecl uninstall -r <package>

$ pecl -d php_suffix=7.0 install <package>
$ pecl uninstall -r <package>

$ pecl -d php_suffix=7.1 install <package>
$ pecl uninstall -r <package>

-d php_suffix=<version>这段代码允许您在运行时设置配置值,而不是使用pecl config-set进行预设。从文档中可以看出,uninstall -r并没有实际卸载它。

vagrant@homestead:~$ pecl help uninstall
pecl uninstall [options] [channel/]<package> ...
Uninstalls one or more PEAR packages.  More than one package may be
specified at once.  Prefix with channel name to uninstall from a
channel not in your default channel (pecl.php.net)

Options:
  ...
  -r, --register-only
        do not remove files, only register the packages as not installed
  ...

卸载命令行是必要的,否则安装它将会删除之前安装的任何版本,即使它是为不同的PHP版本(例如:安装一个针对PHP 7.0的扩展会删除5.6版本,如果该软件包仍然被注册为已安装)。


谢谢!这对于 Debian 10 非常有用,因为大多数 PHP 扩展都不适用于使用 deb.sury.org 包的任何小于 7.3 版本。当升级旧的 EOL Debian 8 服务器时,运行 PHP 5.6 并不是很好用。使用这种方法,我可以构建适用于 5.6、7.0、7.1 或 7.2 版本的扩展!++ - Professor Falken
这对我很有帮助。pecl install 一直在为错误的 PHP 版本安装 mcrypt - Ejaz
非常感谢!这对我正在使用Ansible进行配置的工作非常有用,我需要使用7.2版本。 - Alfchee
当通过Laravel Forge控制面板降级php版本后,当pecl出现问题时,此方法非常有效。 - Lasse
嘿,我不太擅长在核心Linux文件系统中胡乱操作,如果将来我想要实际删除和清除我正在使用的版本的php-xdebug扩展,该怎么办? - Scott Anderson

18

当PECL报错“ is already installed and is the same as the released version”时

在从PECL安装之前,请切换到所需的php、php-config和phpize版本

只需使用强制标志运行安装程序

sudo pecl install -f <package-name>

4
在我看来,这是最好的答案。然而,它似乎会删除先前的扩展对象,这很烦人。 - msbit

8
我在更新我的Vagrant box with XHGui时遇到了同样的问题,因为XHGui需要mongodb。我希望能够支持PHP 5.6和7.0上的性能分析。
我查看了pecl源代码,并发现有一个metadata_dir配置选项。这是一个指向已安装软件包当前状态的目录路径。不幸的是,该路径并没有根据PHP版本进行命名空间划分。如果您尝试使用pecl config-set设置它,则会收到一个不透明的“失败”错误。事实证明,该设置未被列入\PEAR_Config类中可配置的白名单中:
/**
 * Configuration values that can be set for a channel
 *
 * All other configuration values can only have a global value
 * @var array
 * @access private
 */
var $_channelConfigInfo = array(
    'php_dir', 'ext_dir', 'doc_dir', 'bin_dir', 'data_dir', 'cfg_dir',
    'test_dir', 'www_dir', 'php_bin', 'php_prefix', 'php_suffix', 'username',
    'password', 'verbose', 'preferred_state', 'umask', 'preferred_mirror', 'php_ini'
    );

在PECL的世界中,“全局”意味着它只能在安装时设置,不能在之后设置。在Github上的PPA跟踪器中存在一个问题: https://github.com/oerdnj/deb.sury.org/issues/407。那里的最终建议是为备用PHP版本手动构建扩展程序。我最终使用pecl来为PHP 7扩展构建,并为5.6手动构建。确保在构建之前运行update-alternatives以获取php-config和phpize,而不仅仅是php。
update-alternatives --set php /usr/bin/php5.6
update-alternatives --set php-config /usr/bin/php-config5.6
update-alternatives --set phpize /usr/bin/phpize5.6

然后,提取扩展并构建它。对于mongodb扩展,我使用上述步骤成功:

phpize5.6 && ./configure --with-php-config=php-config5.6 && make && sudo make install


然而,可以做的是指示PECL“注销”扩展,以便可以重新安装它而不必删除现有的扩展。请参见下面@Matt Zuba的答案。 - Mahn

0

首先,在Linux环境中获取管理员权限- **Sudo su ** <> 然后按照以下语法操作 sudo apt-get install php7.3-bcmath

这里的php7.3(输入您的php版本并通过php -v进行检查) bcmath(输入您的扩展名)

如果您想要检查活动扩展列表,请在终端中输入(php -m)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接