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然后用 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

基本上:

  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. 您可以在运行 export PHP_PEAR_PHP_BIN=/usr/bin/php74 之前手动运行 pear。此解决方案是临时的,适用于用户范围。

  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 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.:欢迎光临:-)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...