Symfony JAVA_HOME 未设置

Symfony JAVA_HOME not set

当尝试通过 Symfony 运行 signal-cli 时出现错误:

JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation.

工作目录中echo $JAVA_HOME的输出:

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-0.fc31.x86_64/jre

工作目录中java -version的输出:

openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-bit Server VM (build 25.252-b09, mixed mode)

我正在想办法解决这个错误。这是我的代码:

public function list()
{
  $list = new Process(['.././signal-cli-0.6.8/bin/signal-cli']);
  $list->run();

   if (!$list->isSuccessful()) {
       throw new ProcessFailedException($list);
    }
    echo $list->getOutput();
 }
}

来自文档(强调我的):

In addition to the env vars passed explicitly, processes inherit all the env vars defined in your system. You can prevent this by setting to false the env vars you want to remove [...]

source: https://symfony.com/doc/current/components/process.html#setting-environment-variables-for-processes

我认为这意味着您的用户s/shell的环境变量在那一刻并不重要,您可能必须明确设置它们:

 $process = new Process(['...'], null, ['ENV_VAR_NAME' => 'value']);

无论如何,您可以编写一个小脚本,将 env/printenv 的结果写入文件以供进一步检查。由于您的 shell 运行 宁许多影响环境的额外脚本没有被转发,也没有 运行 用于您的过程,因此很可能存在很大差异。

所以您可能必须明确地将 JAVA_HOME 传递给上述过程(这是一个非常具体的主路径,):

$process = new Process(['...'], null, [
     'JAVA_HOME' => '/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-0.fc31.x86_64/jre', 
]);

似乎执行您的 php 应用程序的进程是以不包含 JAVA_HOME 环境变量的用户身份执行的。

我的意思是当您在 linux CLI 中执行以下命令时:

echo $JAVA_HOME

结果很好,因为为您的 linux 用户设置了环境变量。

但是当您通过 Symfony 调用 signal-cli 时,使用的不是您的 linux 用户,而是执行您的 Web 服务器的进程的用户。

也许您使用 apache 作为网络服务器,那么用户就是“apache”或“www-data”之类的东西。

然后仍然在 apache 的情况下,您必须将环境变量传递给虚拟主机:

<VirtualHost yourhostname:80>
   ...
   SetEnv VARIABLE_NAME variable_value
   ...
</VirtualHost>

或者您可以按照指定的方式进行here

对于其他网络服务器,解决方案会略有不同,但概念是相同的。