Java 1.6 被后台 Symfony 任务调用时损坏

Posted

技术标签:

【中文标题】Java 1.6 被后台 Symfony 任务调用时损坏【英文标题】:Java 1.6 Broken when called by background Symfony task 【发布时间】:2011-11-30 18:57:54 【问题描述】:

我有一个 Symfony 任务,它生成一些文件,调用 exec 到一个 jar,然后解析输出。 jar 从命令行运行良好,任务从命令行运行良好。

问题:

我在基于表单提交的操作中调用任务。我让动作在后台启动一个新的 php 进程来运行任务,而不管它现在生成的页面是什么。

当它到达 java 调用时,说 exec(java -version);它输出这个:

Error occurred during initialization of VM
Unable to load native library: libjava.jnilib

我觉得这与我在开始任务时调用 php 的方式有关,但我不知道为什么它没有与我使用命令行时相同的库。

如何让 java 从“后台”Symfony 任务中运行?

注意事项

在我将 mamp 从 1.9.6 升级到 2.0.3 之前,它一直可以正常工作。

我看过: Broken Java Mac 10.6 但因为我可以从命令行很好地运行它,所以这似乎是一个不同的问题。

我也查看了Execute symfony task command from the shell_exec() permission denied,但我不认为权限是这里的问题。

更新:

我已将问题范围缩小到 MAMP 并从浏览器访问 php。

<?php
echo exec("java -version")
...

从命令行调用时有效,但通过浏览器打开 php 文件时无效。所以 MAMP 的配置方式导致了这个问题。

这是环境信息:

变量值 SHELL /bin/bash TMPDIR /var/folders/YH/YH+uW3hDHZyxQ5AiUtr0T++++TI/-Tmp-/ Apple_PubSub_Socket_Render /tmp/launch-3rr9ZI/Render 用户我的用户 COMMAND_MODE unix2003 SSH_AUTH_SOCK /tmp/launch-zinaMI/Listeners __CF_USER_TEXT_ENCODING 0x1F5:0:0 路径 /usr/bin:/bin:/usr/sbin:/sbin 残疾人/ 首页/用户/我的用户 SHLVL 2 DYLD_LIBRARY_PATH /Applications/MAMP/Library/lib: LOGNAME myuser 显示 /tmp/launch-FYrw70/org.x:0 _ /Applications/MAMP/Library/bin/httpd

Dyld 似乎在这里。我需要找到一种方法从 mamp 的环境中取消它。

已解决

我想出了一个解决办法。这似乎是一个 hack,但它确实有效。我会在这里发布,以防其他人遇到同样的问题。

正如Broken Java Mac 10.6 提到的,必须取消设置 DYLD_LIBRARY_PATH。不知道为什么,在 Unix 系统上似乎需要它,但在 MacOSX 上不需要。

如果 MAMP 设置为 /Applications/MAMP/Library/lib,以下是禁用它的方法: 编辑 /Applications/MAMP/Library/bin/envvars 并注释掉以下几行

DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
export DYLD_LIBRARY_PATH

所以它看起来像这样:

#DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
#export DYLD_LIBRARY_PATH

这应该可以解决问题,java 1.6 可以正常运行。

这是黑客行为吗?还是这是 MAMP 中的错误?如果您知道解决此问题的更好方法,请回答。

【问题讨论】:

Re: "我看过:Broken Java Mac 10.6 ..." --> 检查你的phpinfo(INFO_ENVIRONMENT) 来检查你的 PHP 进程的环境。它可能与您用于手动检查是否可以启动 Java 的命令 shell 的 env 不同。 我具体查看环境信息的哪一部分?Java 在命令行中从 php 调用运行良好:php -r 'exec("java -version", $o); echo $o;' echoes:java version "1.6.0_26"... 当我从 php 生成 php 进程时,它无法运行java。我会尝试看看这条路径是否不同。 我注意到一些奇怪的事情,环境将 PWD 返回为 symfonyroot/web,但 getcwd 仅返回 symfonyroot。不确定这是否重要。 您应该添加“已解决”部分作为答案,等待 24 小时,然后接受您的答案。您不会得到任何代表,但问题会显示为已回答。 请在下方发布解决方案,以便我们将其从未答复列表中删除。谢谢。 【参考方案1】:

这是@paaat 添加的解决方案。我只是发布这个问题,以便将这个问题排除在未回答的列表之外。

我想出了一个解决办法。这似乎是一个 hack,但它确实有效。生病 把它贴在这里,以防其他人遇到同样的问题。

Broken Java Mac 10.6 提到必须取消设置 DYLD_LIBRARY_PATH。 不知道为什么,在 Unix 系统上似乎需要它,但在 MacOSX 上不需要。

如果 MAMP 设置为 /Applications/MAMP/Library/lib,这里是如何禁用 它:编辑 /Applications/MAMP/Library/bin/envvars 并注释掉 以下几行

DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
export DYLD_LIBRARY_PATH

所以它看起来像这样:

#DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
#export DYLD_LIBRARY_PATH

这应该可以解决问题,java 1.6 可以正常运行。

请务必重新安装 MAMP 以使更改生效。

【讨论】:

【参考方案2】:

这行得通!我正在运行的 MAMP 版本 2.1.3,但是文件中的内容不同:

#if test "x$DYLD_LIBRARY_PATH" != "x" ; then
#  DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
#else
#  DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib"
#fi
#export DYLD_LIBRARY_PATH

【讨论】:

【参考方案3】:

这对我有用:

<?php
  exec('export DYLD_LIBRARY_PATH=""; java -version');
?>

参考: - https://drupal.org/node/1257654 - Calling java from PHP exec

【讨论】:

请不要去posting the same Answer around。这意味着问题是重复的,请选择最好的一个来发布您的答案,并将其他问题标记为该问题的重复。

以上是关于Java 1.6 被后台 Symfony 任务调用时损坏的主要内容,如果未能解决你的问题,请参考以下文章

现在通过前台一个按钮用ajax 调用后台的java timer 类 执行一个 定时任务,每10秒执

如何在 Symfony2 中创建 cron 任务

程序被送入后台后,向 iOS 借时间,完成长期任务-备

Symfony2,检查一个动作是不是被ajax调用

Symfony2,检查一个动作是不是被ajax调用

Symfony 3.1 和 OneUploaderBundle + Blueimp = UploadListener 未被调用