当系统中安装了多个 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.
中安装了 libevent
或 amqp
版本
现在,当我输入 pecl install libevent
并且我的活动 php 版本是 php7.0(使用 update-alternatives --set php /usr/bin/php7.0),
peclreturns 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 仍然给我 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)。
我已经根据本手册
在 Ubuntu 上从 PPA 安装了 php5.6 和 php7.0http://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu
但我不知道如何使用 pecl
为 php5.6 或 php7.0.
例如,我已经在 php5.6.
中安装了libevent
或 amqp
版本
现在,当我输入 pecl install libevent
并且我的活动 php 版本是 php7.0(使用 update-alternatives --set php /usr/bin/php7.0),
peclreturns 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 仍然给我 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)。