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


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

我已经根据本手册在Ubuntu上安装了php5.6和php7.0http://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 returns message that libevent '已经安装。

但是它只安装在php5.6(当这个版本是活跃的),现在我想为php7.0做它。

哪些命令可以帮助我?

乌利希期刊指南

我已经找到了这个命令切换到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应该为空!

如何解决这个问题?

乌利希期刊指南

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

apt-get install php-amqp

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

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

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

pecl抛出错误时已经安装并且与发布版本相同

在从pecl

安装之前切换到所需的php, php-config, phpize版本

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

sudo pecl install -f <package-name>

我在用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的世界中,'global'意味着它只能在安装时设置,而不能在安装后设置。

PPA跟踪器在github: https://github.com/oerdnj/deb.sury.org/issues/407有一个问题

最后的建议是手动构建替代PHP版本的扩展。最后,我在PHP 7扩展中使用perl,在PHP 5.6中使用手动构建。在构建之前,请确保在php-config和phpize中运行update-alternatives,而不仅仅是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

首先,在Linux环境中获得admin权限**Sudo su **, & lt的在然后遵循下面的语法

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

如果你想检查活动扩展列表,在终端输入(php -m)