我对此很好奇,所以我花了一点时间玩梨。
所以,首先我通过我最喜欢的 - 尚未弃用 - AUR 助手安装它。
$ my-awesome-helper -S php-pear
然后我尝试安装XML_Util(作为例子)
# pear install XML_Util
WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update
downloading XML_Util-1.4.5.tgz ...
Starting to download XML_Util-1.4.5.tgz (19,191 bytes)
......done: 19,191 bytes
install ok: channel://pear.php.net/XML_Util-1.4.5
# echo $?
0
从这里,我确定它可以正常工作,所以我将其卸载。
# pear uninstall XML_Util
uninstall ok: channel://pear.php.net/XML_Util-1.4.5
现在,我们如何破解它或更改 PHP 二进制文件的位置?
方法是遵循文档。对于我们的例子,它位于here。
它首先指出:
PEAR 有许多可以更改的配置选项。对它们进行概述就像发布一个一样简单
$ pear config-show
我做得更精确一点:
# pear config-show | grep bin
PEAR executables directory bin_dir /usr/bin
PHP CLI/CGI binary php_bin /usr/bin/php
Signature Handling Program sig_bin /usr/bin/gpg
还有一个问题:如何更改php_bin的值?
让我们回到文档。它现在声明:
读取单个值是通过使用 config-get 完成的。以下命令将向您显示已安装 pear 包的所有 .php 文件所在的位置。
$ pear config-get php_dir
/usr/share/pear
更改一个值就像检索它一样简单:
$ pear config-set preferred_state beta
config-set succeeded
因此,我将其更改为非 PHP 二进制文件。
# pear config-set php_bin /tmp/my-awesome-bin
config-set succeeded
让我们检查一下变化:
# pear config-get php_bin
/tmp/my-awesome-bin
我们现在确定我们更改了 PHP 二进制文件的位置。
让我们重新运行我们的第一个命令:
# pear install XML_Util
WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update
downloading XML_Util-1.4.5.tgz ...
Starting to download XML_Util-1.4.5.tgz (19,191 bytes)
......done: 19,191 bytes
install ok: channel://pear.php.net/XML_Util-1.4.5
它没有坏。奇怪!?
从这里开始,我想,我做错了什么,所以我重新检查了我所做的一切,我确实按照文档没有成功。
我最后的手段总是查看文件或可执行文件以尝试了解其行为。所以这次我也做了。
原来 pear 是一个简单的 Shell 脚本。在我写这篇文章的时候,它 (/usr/bin/pear) 看起来像这样:
#!/bin/sh
# first find which PHP binary to use
if test "x$PHP_PEAR_PHP_BIN" != "x"; then
PHP="$PHP_PEAR_PHP_BIN"
else
if test "/usr/bin/php" = '@'php_bin'@'; then
PHP=php
else
PHP="/usr/bin/php"
fi
fi
# then look for the right pear include dir
if test "x$PHP_PEAR_INSTALL_DIR" != "x"; then
INCDIR=$PHP_PEAR_INSTALL_DIR
INCARG="-d include_path=$PHP_PEAR_INSTALL_DIR"
else
if test "/usr/share/pear" = '@'php_dir'@'; then
INCDIR=`dirname $0`
INCARG=""
else
INCDIR="/usr/share/pear"
INCARG="-d include_path=/usr/share/pear"
fi
fi
exec $PHP -C -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d open_basedir="" -d safe_mode=0 -d register_argc_argv="On" -d auto_prepend_file="" -d auto_append_file="" $INCDIR/pearcmd.php "$@"
以下是与您的问题相关的部分:
if test "x$PHP_PEAR_PHP_BIN" != "x"; then
PHP="$PHP_PEAR_PHP_BIN"
else
if test "/usr/bin/php" = '@'php_bin'@'; then
PHP=php
else
PHP="/usr/bin/php"
fi
fi
基本上:
- 如果声明了
PHP_PEAR_PHP_BIN 环境变量。使用它。
- 否则,如果设置了
php_bin 变量(pear 配置),并且等于/usr/bin/php,则使用php 作为可执行文件。
- 如果 (1) 和 (2) 均失败;使用
/usr/bin/php 二进制文件作为可执行文件。
这很好地解释了为什么它仍然有效。
所以,我再次尝试打破它,但这次是使用 PHP_PEAR_PHP_BIN 环境变量。
# PHP_PEAR_PHP_BIN=/tmp/my-awesome-bin pear install XML_Util
/usr/bin/pear: Zeile 28: /tmp/my-awesome-bin: Datei oder Verzeichnis nicht gefunden
这次我遇到了与您发布的相同的错误。这意味着我可以打破梨并重现您的问题。
在了解正在发生的事情后,现在解决您的问题:
-
您可以在运行pear 之前手动运行export PHP_PEAR_PHP_BIN=/usr/bin/php74。此解决方案是临时的且适用于用户范围。
-
您可以将export PHP_PEAR_PHP_BIN=/usr/bin/php74 行放入您的~/.bashrc 文件中。这个解决方案是持久的和用户范围的。
-
您可以将PHP_PEAR_PHP_BIN=/usr/bin/php74 行放入您的/etc/environment 文件中。这个解决方案是持久的和系统范围的。
-
您可以将export PHP_PEAR_PHP_BIN=/usr/bin/php74 行放入/etc/profile.d/my_php_pear_solution.sh 文件中。这个解决方案是持久的和系统范围的。
-
您可以创建一个处理此问题的/usr/local/bin/my-pear(假设/usr/local/bin 在您的$PATH 中);给它一个 - 或全部 - 3个可执行位,最后使用my-pear CLI而不是官方的pear 一个。这个解决方案是持久的和系统范围的。
#!/usr/bin/env bash
# Set the location of our PHP binary.
export PHP_PEAR_PHP_BIN=/usr/bin/php74
# Start pear.
/usr/bin/pear ${@}
所有这些都可能有效。这只是范围、可用性和许可的问题 - 不知何故。
我希望这会有所帮助。如果有不清楚的地方,不要害怕问。
P.S.:欢迎来到这里 :-)