当系统中安装了多个 php 版本时,如何使用 pecl 为特定 php 版本安装 php 扩展?

How to install php extension using pecl for specific php version, when several php versions installed in system?

我已经根据本手册

在 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),peclreturns message thatlibevent` 已经安装。

但它仅为 php5.6(当此版本处于活动状态时)安装,现在我想为 php7.0.

安装

哪些命令可以帮助我?

UPD

我找到了将 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 的已安装扩展 list
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 !

应该为空

如何解决问题?

UPD

对于 amqp,我刚刚安装了 php-amqp 包,没有使用 pecl。

apt-get install php-amqp

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

我 运行 在更新 my Vagrant box with XHGui 时遇到了同样的问题,因为 XHGui 需要 mongodb。我希望能够在 PHP 5.6 和 7.0 上支持分析。

我深入研究了 pecl 源代码,发现有一个 metadata_dir 配置选项。这是安装包当前状态所在目录的路径。不幸的是,每个 PHP 版本还没有命名空间。如果您尝试使用 pecl config-set 设置它,您会得到一个不透明的 'failed' 错误。事实证明,设置未列入白名单,因为在 \PEAR_Config class:

中可配置
/**
 * 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 的世界里,'global' 意味着它只能在安装时设置,不能在安装后设置。

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抛出错误时已经安装并且与发布版本相同

切换到所需的 php、php-config、php在从 pecl 安装之前调整版本

只需运行安装强制标志

sudo pecl install -f <package-name>

以下是我尝试编写脚本时最有效的方法(以防其他人像我一样遇到这种情况):

$ 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版本(如果软件包仍注册为已安装)。

首先,在Linux环境中获得管理员权限- **须藤须** <> 然后按照下面的语法 sudo apt-get 安装 php7.3-bcmath

此处 php7.3(输入您的 php 版本并通过 php -v 检查) bcmath(输入您的分机名称)

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