У меня есть задача 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 , но поскольку я могу нормально запустить его из командной строки, похоже, это другая проблема.
Я также посмотрел на Выполнение команды задачи symfony из shell_exec() permission denied, но я не думаю, что здесь дело в разрешениях.
Обновление:
Я сузил проблему до MAMP и доступа к php из браузера.
<?php
echo exec("java -version")
...
Работает при вызове из командной строки, но не работает, когда php файл открывается через браузер. Значит, проблема связана с тем, как настроен MAMP.
Вот информация о среде:
Dyld, похоже, присутствует здесь. Мне нужно найти способ удалить его из окружения mamp.
Решено
Я нашел решение. Это похоже на хак, но это сработало. Я опубликую его здесь на случай, если кто-нибудь еще столкнется с той же проблемой.
Как 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? Пожалуйста, ответьте, если вы знаете лучший способ решить эту проблему.
Это работало для меня:
<?php
exec('export DYLD_LIBRARY_PATH=""; java -version');
?>
Ссылки:
- https://drupal.org/node/1257654
- Вызов Java из PHP exec