当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

我已经根据本手册从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 returns message that libevent`已安装时)。

但是它仅针对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仍会给我list已经安装的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应该是空的!

如何解决问题?

UPD

对于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>

与使用pecl config-set预先设置配置值相比,-d php_suffix=<version>允许您在运行时设置配置值。 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 throws错误已经安装并且与发布的版本相同时

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

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

sudo pecl install -f <package-name>

第三种回答

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

我研究了pecl源代码,发现有一个metadata_dir配置选项。这是安装包当前状态所在目录的路径。不幸的是,尚未为每个PHP版本命名空间。如果尝试使用pecl config-set进行设置,则会出现不透明的’failed’错误。事实证明,该设置未在\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’意味着只能在安装时设置,而不能在安装后设置。

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

最终的建议是手动为其他PHP版本构建扩展。我最终将pecl用于PHP 7扩展,并为5.6进行了手动构建。在构建之前,请确保为php-config和phpize运行update-alternatives和phpize,而不仅是phpize:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/8877.html,未经允许,请勿转载。