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/httpdDyld 似乎在这里。我需要找到一种方法从 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秒执
Symfony 3.1 和 OneUploaderBundle + Blueimp = UploadListener 未被调用