【问题标题】:PEAR not recognising correct PHP directoryPEAR 无法识别正确的 PHP 目录
【发布时间】:2021-05-06 21:13:44
【问题描述】:

我刚刚安装了 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)

【问题讨论】:

  • set PHP_PEAR_PHP_BIN=/usr/bin/php74/php.exe
  • @RiggsFolly 这是 Linux,而不是 Windows。无论如何都尝试使用/usr/bin/php74 的路径(php74 本身是二进制文件,而不是目录),但恐怕它什么也没做!

标签: php pear archlinux


【解决方案1】:

我对此很好奇,所以我花了一点时间玩梨。

所以,首先我通过我最喜欢的 - 尚未弃用 - 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

基本上:

  1. 如果声明了PHP_PEAR_PHP_BIN 环境变量。使用它。
  2. 否则,如果设置了php_bin 变量(pear 配置),并且等于/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 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.:欢迎来到这里 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2019-09-09
    • 2018-07-18
    相关资源
    最近更新 更多