php exec () для Java на веб-сайте не работает, но работает в терминале сервера

1

У меня есть VPS (Linux Server), где я загрузил 64-разрядную версию Java. На моем терминале я могу запускать такие команды, как:

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/jre/bin/java -version

И получите следующий результат:

openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed 

Поэтому, чтобы проверить это для моего веб-сайта, я использовал следующий php:

<?php 
  $output = array();
  exec('/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/jre/bin/java -version', $output); 
  foreach($output as $line) {
    echo $line;
    echo '<br/>';
  } 
?>

Но получите следующую ошибку:

Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 bytes

До сих пор я пробовал следующее:

1) Я обновил разрешения на java, чтобы:

stat -c "%a %n" /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/jre/bin/java

Возвращает:

755 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/jre/bin/java

2) Я отключил безопасный режим php

3) Я изменил максимальную память в файле php.ini до 1,5 ГБ

Что вызывает эту ошибку и как я могу запустить java-программу без ошибок?

  • 1
    когда все работает в командной строке, но не в exec (), часто возникают проблемы с привилегиями пользователя.
  • 0
    или переменные окружения. Вы запустили «whoami» из PHP и командной строки, чтобы увидеть, работает ли его правильный пользователь?
Показать ещё 8 комментариев
Теги:
server-side

2 ответа

1

Я смог воспроизвести эту ошибку с использованием веб-пространства bluehost и исправить ее.

Я запускал тяжелую программу java, хотя метод PHP: shell_exec и java вызвали ошибку:

Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 byte

Версия для Linux:

uname -a
Linux box1.bluehost.com 1.2.50-39.ELK6.x86_64 #1 SMP Mon Nov 2 03:10:26 CST 2015 x86_64 x86_64 x86_64 GNU/Linux

Версия PHP:

php --version
PHP 5.4.43 (cgi-fcgi) (built: Jul 13 2015 15:00:01)
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
with Zend Guard Loader v3.3, Copyright (c) 1998-2013, by Zend Technologies

Версия Java:

java -version
java version "1.8.0_71"

Воспроизводите проблему:

Создайте сценарий test.php в public_html, например:

<?php
    shell_exec('java HungryJavaProgram > /home/user/mylog.log');
?>

Java-программа под названием HungryJavaProgram выделяет гигабайт памяти.

В браузере зайдите на сайт yoursite.com/test.php чтобы запустить этот файл php. В программе java:

Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 byte

Почему это происходит?

Программа java запросила больше памяти, чем разрешала PHP.

Решение №1, увеличьте доступную память:

Узнайте, сколько памяти PHP разрешено программам, запущенным внутри shell_exec, может потреблять, создав этот PHP-скрипт и посетив его в браузере:

<?php
   phpinfo();
?>

Посмотрите: memory_limit чтобы увидеть значение по умолчанию: 128M

Найдите свой php.ini в public_html и найдите переменную memory_limit и установите значение 2048M. В bluehost изменения вступают в силу немедленно. Поймите теперь, что одна программа-изгои может теперь сбить ваш сервер. Поэтому держите это как можно ниже.

Обходное решение # 2, используйте PHP fastcgi.

В каталоге public_html просмотрите файл .htaccess, я увидел следующее:

AddHandler application/x-httpd-php54 .php

Прокомментируйте это и замените его на это:

AddHandler fcgid54-script .php

И теперь программа java работает без ошибок. Несмотря на то, что ограничение памяти остается на уровне 128 М, PHP, похоже, не shell_exec("java myprogram") этот предел для java-программ, запущенных из shell_exec("java myprogram").

1

Ваш ответ находится в сообщении об ошибке:

 Could not allocate metaspace: 1073741824 bytes

Вы превысили объем памяти, который вы используете Apache и PHP. В php.ini установлены ограничения, и пользователь Apache может иметь набор ulimit.

Фондовая установка PHP для установки по умолчанию обычно устанавливается в пределах 2 МБ. Java ищет 1G памяти. Измените ограничение памяти в PHP на минимум 1G.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню