Вызов java из PHP exec

Я делаю следующее в PHP:

exec('java -jar "/opt/flex3/lib/mxmlc.jar" +flexlib "/opt/flex3/frameworks" MyAS3App.as -default-size 360 280 -output MyAS3App.swf'); 

Когда я запускаю это из командной строки, он работает нормально и заканчивается через секунду или два.

Когда я запускаю эту команду из PHP exec, процесс java занимает 100% процессор и никогда не возвращается.

Есть идеи?

Я также попытался выполнить указанную выше команду с помощью '/ usr / bin / java -Djava.awt.headless = true'.

Я запускаю Mac OS X 10.5.5, MAMP 1.7, PHP 5.2.5

Оказывается, это была ошибка, характерная для PHP-пакета MAMP ( http://www.mamp.info/ ).

Вызывает любое обращение JVM после сбоя под MAMP, например:

 exec('java -version'); 

Исправление состоит в том, чтобы префикс команды

 export DYLD_LIBRARY_PATH=""; 

Также я понял, что нет смысла использовать этот метод вызова mxmlc.

Итак, вот заключительная, рабочая команда:

 exec('export DYLD_LIBRARY_PATH=""; mxmlc MyAS3App.as -default-size 360 280 -output MyAS3App.swf'); 

Мне удается заставить это работать с MAMP. Решение заключалось в том, чтобы включить:

 export DYLD_LIBRARY_PATH=""; in the exec call: $argss = "export DYLD_LIBRARY_PATH=\"\"; /usr/bin/java -jar /Applications/yourjarfile.jar"; $resultXML = exec($argss, $output); 

Есть ли причина, почему вы используете файл mxmlc jar для компиляции вашего приложения flex? вместо этого вы пытались использовать исполняемый файл или муравьиную задачу?

Может быть, компиляция занимает слишком много времени, чтобы ваш PHP-скрипт не работал?

Exec всегда сложный, на любом языке 🙂

Попробуй:

  • использовать фоновое исполнение (добавить и символ в конце)
  • вместо этого используйте shell_exec
  • укажите полный путь к исполняемому файлу java (может быть, тот, который доступен для PHP, не тот, который вам нужен?)
  • запустите приложение HelloWorld java, чтобы узнать, есть ли проблема на Java или в mxmlc специально

Странно, что java занимает 100% процессор. Я не могу объяснить это с какой-либо распространенной ошибкой при использовании exec () … попробуйте отправить его SIGQUIT, чтобы сбрасывать потоки, а затем читать дамп – может быть, вы что-то придумаете.