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

Posted

技术标签:

【中文标题】当系统中安装了多个 php 版本时,如何使用 pecl 为特定的 php 版本安装 php 扩展?【英文标题】:How to install php extension using pecl for specific php version, when several php versions installed in system? 【发布时间】:2017-03-18 02:42:50 【问题描述】:

我已经根据本手册在 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

但他们无济于事,pecl 仍然给我list 已经安装的 php5.6 扩展,即使我切换到 php7。

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 安装的方法,所以问题仍然存在。

【问题讨论】:

为什么你有两个版本的php? 我需要两者来满足我的特定需求。例如,我有 2 个项目,一个应该运行 5.6,第二个运行 7。我没有时间将第一个迁移到 php7。 你找到解决办法了吗? ChickenFeet,我认为这里的第一个答案是一条路 @OlegAbrazhaev Matt 的回答应该被接受。 【参考方案1】:

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

$ 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=&lt;version&gt; 允许您在运行时设置配置值,而不是使用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 非常有用,在 Debian 10 中,大多数 PHP 扩展不适用于使用 deb.sury.org pacakges 的任何版本 这对我有帮助。 pecl install 不断安装 mcrypt 用于非预期的 PHP 版本。 非常感谢!!!这对于我使用 Ansible 进行的配置非常有用,我需要使用 7.2 版本 通过 Laravel Forge 控制面板降级 php 版本后,当 pecl 起作用时会产生奇迹。 嘿,我不太擅长搞乱核心 Linux 文件系统,如果将来某个时候我想实际删除并清除我所在版本的 php-xdebug ext使用?【参考方案2】:

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

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

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

sudo pecl install -f <package-name>

【讨论】:

这是我认为的最佳答案。但是,它似乎删除了以前的扩展对象,这很烦人。【参考方案3】:

我在更新my 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 手动构建。确保在构建之前为 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 &amp;&amp; ./configure --with-php-config=php-config5.6 &amp;&amp; make &amp;&amp; sudo make install

【讨论】:

然而,可以做的是指示PECL“取消注册”扩展,以便可以在不删除现有扩展的情况下再次安装它。请参阅下面的@Matt Zuba 答案。【参考方案4】:

首先,在 Linux 环境中获得管理员权限- **须藤苏** 然后按照以下语法 sudo apt-get install php7.3-bcmath

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

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

【讨论】:

以上是关于当系统中安装了多个 php 版本时,如何使用 pecl 为特定的 php 版本安装 php 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

尽管我的系统中安装了相同的版本,但出现“org.scala-sbt#sbt;0.13.8: not found”错误。如何解决这个问题?

使用 SwiftUI,我们在 List 中安装了一个 Button。为啥当我点击按钮显示模态然后再次关闭时模态消失?

当设备中安装了 FB Native App 时,无法使用 Facebook ios sdk v3 进行授权

eclipse怎样安装php插件

在没有 XAMPP 的 Windows 中安装 Laravel

我的项目中安装了哪个版本的Entity Framework?