php exec()for java on website不起作用,但适用于服务器终端

时间:2016-01-05 20:03:06

标签: java php linux server-side

我有一个VPS(Linux服务器),我下载了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.5GB

导致此错误的原因是什么?如何让java程序无误地运行?

2 个答案:

答案 0 :(得分:1)

您的回答在错误消息中:

 Could not allocate metaspace: 1073741824 bytes

您超出了允许Apache和PHP使用的内存量。 php.ini中有限制设置,Apache用户可能设置了ulimit

库存PHP安装默认值通常设置为2MB的限制。 Java正在寻找1G的内存。将PHP中的内存限制更改为至少1G。

答案 1 :(得分:1)

我能够使用bluehost的网站空间重现此错误并修复它。

我通过PHP方法运行了一个繁重的java程序: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"

重现问题:

在public_html下创建一个test.php脚本,如下所示:

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

名为HungryJavaProgram的java程序会分配一个千兆字节的内存。

在浏览器中,访问yoursite.com/test.php以运行该php文件。 java程序报告:

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

为什么会这样?

java程序请求的内存比PHP授权的内存多。

解决方案#1,增加可用内存:

通过制作这个PHP脚本并在浏览器中访问它,了解PHP在shell_exec中运行的授权程序可以消耗多少内存:

<?php
   phpinfo();
?>

查看:memory_limit以查看默认值为:128M

在public_html下找到你的php.ini并找到memory_limit变量并将其设置为2048M。在bluehost上,更改立即生效。现在了解一个流氓程序现在可能会关闭您的服务器。所以保持尽可能低。

解决方案#2,使用PHP fastcgi。

在public_html目录中查看.htaccess文件,我看到了:

AddHandler application/x-httpd-php54 .php

注释并将其替换为:

AddHandler fcgid54-script .php

现在java程序运行没有错误。即使内存限制仍然是128M,PHP似乎也没有对从shell_exec("java myprogram")内运行的java程序强制实施限制。