PEAR无法识别正确的PHP目录



我刚刚安装了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然后重新安装吃豆人吗?

(作为参考,我使用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二进制文件的位置?这样做的方法是遵循文档。对于我们来说,它位于这里。

它首先声明:

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

基本上:

  1. 如果声明了PHP_PEAR_PHP_BIN环境变量。使用它。
  2. 否则,如果设置了php_bin变量(pear config),并且等于/usr/bin/php,则使用php作为可执行文件。
  3. 如果(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

这次我有同样的错误,就像你发布的。意思是我可以打破梨,重现你的问题。


现在解决你的问题后,了解发生了什么:

  1. 您可以在运行pear之前手动运行export PHP_PEAR_PHP_BIN=/usr/bin/php74。此解决方案是临时的,适用于所有用户。

  2. 您可以将export PHP_PEAR_PHP_BIN=/usr/bin/php74行放入~/.bashrc文件中。这个解决方案是持久的,并且是用户范围的。

  3. 您可以将PHP_PEAR_PHP_BIN=/usr/bin/php74行放入/etc/environment文件中。这个解决方案是持久的,并且是系统范围的。

  4. 可以将export PHP_PEAR_PHP_BIN=/usr/bin/php74行放到/etc/profile.d/my_php_pear_solution.sh文件中。这个解决方案是持久的,并且是系统范围的。

  5. 你可以创建一个/usr/local/bin/my-pear(假设/usr/local/bin在你的$PATH)来处理这个;给它3个可执行位中的一个或全部,最后使用my-pear命令行而不是官方的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 ${@}
    

所有这些都可能有效。这只是一个范围、可用性和许可的问题。

我希望这对你有帮助。如果有不清楚的地方,不要害怕问。

注::欢迎光临:-)

最新更新