问题描述
我刚刚安装了 PEAR,但它使用了错误的 PHP 路径 /usr/bin/PHP
,而不是正确的路径 /usr/bin/PHP74
。
这意味着它根本不会运行,所以我什至不能运行 pear uninstall pear
,因为它(像任何其他 pear 命令一样)只是出错了 /usr/bin/pear line 28: /usr/bin/PHP: No such file or directory
我该如何解决这个问题?我可以只rm -rf /usr/bin/pear
然后用 pacman 重新安装吗?
(仅供参考,我使用的是 Arch Linux)
解决方法
我对这个很好奇,所以我花了一些时间来玩梨。
所以,首先我通过我最喜欢的 - 尚未弃用 - 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,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 config)并且等于/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
这次我遇到了与您发布的相同的错误。这意味着我可以打破梨并重现您的问题。
在了解正在发生的事情后,现在解决您的问题:
-
您可以在运行
export PHP_PEAR_PHP_BIN=/usr/bin/php74
之前手动运行pear
。此解决方案是临时的,适用于用户范围。 -
您可以将
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
CLI。此解决方案是持久的且适用于整个系统。#!/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.:欢迎光临:-)