如何在系统中安装几个php版本时使用pecl安装特定的php版本的php扩展?

Ole*_*aev 27 php ubuntu pecl php-extension php-7

我根据本手册在Ubuntu上安装了PPA的php5.6和php7.0

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

但我没有得到如何使用peclphp5.6或php7.0 安装扩展.

例如,我已经安装的版本,libeventamqp在php5.6.

现在当我输入pecl install libevent和我的活动php版本是php7.0(使用update-alternatives --set php /usr/bin/php7.0),pecl returns 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
Run Code Online (Sandbox Code Playgroud)

并为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
Run Code Online (Sandbox Code Playgroud)

但他们没有帮助,list即使我切换到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
Run Code Online (Sandbox Code Playgroud)

php7.0应该是空的!

如何解决问题?

UPD

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

apt-get install php-amqp
Run Code Online (Sandbox Code Playgroud)

并且对于php7仍然不存在libevent.但是我没有找到一种方法来在5.6和7版本之间切换pecl安装,所以问题仍然存在.

小智 28

在尝试编写脚本时,这对我来说最有效(如果有其他人像我一样遇到过这种情况):

$ 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>
Run Code Online (Sandbox Code Playgroud)

-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
  ...
Run Code Online (Sandbox Code Playgroud)

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


Pan*_*tik 8

当pecl throws错误已经安装并且与发布的版本相同时

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

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

sudo pecl install -f <package-name>
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是最好的答案。但是,它似乎确实删除了以前的扩展对象,这很烦人。 (2认同)

小智 6

我在使用XHGui更新我的Vagrant框时遇到了同样的问题,因为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'
    );
Run Code Online (Sandbox Code Playgroud)

在PECL的世界中,"全球"意味着它只能在安装时设置,而不能在安装时设置.

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

最后的建议是为备用PHP版本手动构建扩展.我最终使用pecl进行PHP 7扩展,并使用5.6进行手动构建.确保你运行update-alternativesphp-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
Run Code Online (Sandbox Code Playgroud)

然后,提取扩展并构建它.上述问题的这些步骤对我来说对mongodb扩展有用:

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