【问题标题】:How do I set $PATH using PHP?如何使用 PHP 设置 $PATH?
【发布时间】:2014-04-27 15:14:21
【问题描述】:

我的网站托管在共享服务器上,因此我没有 su 访问权限。我需要用 java 运行一段代码,但它在服务器上不可用。所以我得到了一个自解压版本的java,并把它放在我家目录下的服务器上。然后我将可执行权限授予 java 并尝试运行代码。由于服务器的限制,我在运行文件时必须使用相对路径。

尝试运行 java 文件 ../java/bin/java -jar 'javafile.jar' 会得到以下结果:

error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

我查看了libjli.so 位于../java/lib/i386/jli/libjli.so。所以我在想,因为我使用相对路径运行 java,它并不完全知道如何查找其他文件。我希望如果我可以将absolute/path/to/java/bin 添加到$PATH,那么这个问题将会得到解决。

所以一旦我运行我的 PHP,我可以使用dirname(__FILE__) 来获取我的 java bin 目录的完整路径。我试过以下代码:

exec('export PATH='.$bin_path.':$PATH', $output, $return);
print_r(array(getenv('PATH'), $output, $return));

Prints:
Array(
  [0] => /usr/local/admin/bin:/usr/local/admin/bin/servers:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/bin:/usr/bin,
  [1] => Array(),
  [2] => 0
)

所以没有向$PATH 添加任何内容,没有给出任何输出,并且该命令返回了一个成功的退出值。只是服务器的限制阻止我正常工作吗?

【问题讨论】:

  • 试试dirname(realpath(__FILE__))
  • @CianGallagher - dirname(__FILE__) 给出与dirname(realpath(__FILE__)) 相同的结果 =(
  • 这很可能是因为您可能无权访问exec()shell_exec()。出于安全原因,99% 的共享主机提供商不会让您访问其中任何一个功能。如果你想访问我会考虑获得一个 VPS。我使用的最好的服务是亚马逊 AWS,他们有一个免费套餐,你可以在这里使用:aws.amazon.com/free
  • 除此之外,我永远不会相信共享托管服务提供商可以让您访问这些功能......
  • @CianGallagher - 我同意。我计划在网站投入生产后搬到亚马逊。不过在这里开发对我来说更便宜。 =)

标签: java php linux path


【解决方案1】:

首先,这是行不通的。

exec('export PATH='.$bin_path.':$PATH', $output, $return);

它将启动一个带有shell的子进程,在shell中运行export命令,然后shell将退出。但是export 命令只会更改该shell 的$PATH

我不确定,但我怀疑你需要使用putenv

我希望如果我可以将 absolute/path/to/java/bin 添加到 $PATH 那么这个问题将会得到解决。

嗯,只有使用简单的命令名来调用java 命令时才会有所帮助。

使用完整的绝对路径名运行java 会更简单;例如"/absolute/path/to/java/bin/java"

【讨论】:

  • 我没有意识到 exec 产生了一个子进程。 $PATH 在那里设置得很好。我可以在同一个 exec 调用期间重新编写代码以运行 java 命令。另外,putenv 也不起作用。
猜你喜欢
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
相关资源
最近更新 更多