在PHP中运行Java程序时出现问题

在PHP中运行Java程序时出现问题,java,php,Java,Php,我正在编写一个PHP脚本,它基本上用一个字符串调用Java程序,让Java创建一个名为该字符串的文件,然后返回该文件。而且,都是midi $output_file = mt_rand(10000000,99999999) . ".mid"; system("java MCS " . $_FILES["file"]["tmp_name"] . " " . $output_file . " " . escapeshellarg($_POST['message'])); header('Content

我正在编写一个PHP脚本,它基本上用一个字符串调用Java程序,让Java创建一个名为该字符串的文件,然后返回该文件。而且,都是midi

$output_file = mt_rand(10000000,99999999) . ".mid";
system("java MCS " . $_FILES["file"]["tmp_name"] . " " . $output_file . " " . escapeshellarg($_POST['message']));
header('Content-type: audio/midi');
header('Content-Disposition: attachment; filename="output.mid"');
readfile($output_file);
unlink($output_file);
唯一的问题是我得到了这个问题:在VM java.lang的初始化过程中发生了错误。错误:Properties init:无法确定当前工作目录

我尝试过使用
exec
。脚本已完成,但java程序未运行。

尝试使用OS shell(
bash
on*nix和
cmd
on Windows),因为它可能在正确配置环境方面做得更好。试着这样做:

$output_file = mt_rand(10000000,99999999) . ".mid";
$platformshell = "/bin/sh -c "; // on windows use "cmd /c "
system($platformshell . "\"java MCS " . $_FILES["file"]["tmp_name"] . " " . $output_file . " " . escapeshellarg($_POST['message']) . "\"");
header('Content-type: audio/midi');
header('Content-Disposition: attachment; filename="output.mid"');
readfile($output_file);
unlink($output_file);
编辑:在Ubuntu上,可能想显式地使用
/bin/bash
,因为他们坚持要将
sh
链接到
dash
(在其他真正令人讨厌的事情中,pushd和popd本机不支持,破坏了多年来一直完美工作的shell调用…)。如果仍然存在工作目录问题,您可以在*nix机器上的java调用之前放置一个
pushd
(不确定Windows语法是什么:可能需要制作一个cmd脚本来处理所有工作目录位,只需调用它)

编辑:忽略我在上面评论末尾的咆哮。我几年前就这样做了,并且不得不使用
exec

$r = array();
    exec($this->config->item("java_path") . ' -cp ' . $this->config->item("java_base") . '\databasebackups.jar;' . $this->config->item("java_base") . '\requirements.jar ' . $startdate . $enddate . ' com.blah.blah.LastTransactionReport --user sa --password ' . $this->config->item("ms_password") . ' --dburl ' . $this->config->item("ms_url"), $r);
我的配置包括Java运行时的完整路径和jar文件所在的目录(这使用的是CodeIgniter),输出保存到$r数组中。尝试类似的方法,并让我知道它是否有效。

尝试使用OS shell(
bash
on*nix和
cmd
on Windows),因为它可能在正确配置环境方面做得更好。试着这样做:

$output_file = mt_rand(10000000,99999999) . ".mid";
$platformshell = "/bin/sh -c "; // on windows use "cmd /c "
system($platformshell . "\"java MCS " . $_FILES["file"]["tmp_name"] . " " . $output_file . " " . escapeshellarg($_POST['message']) . "\"");
header('Content-type: audio/midi');
header('Content-Disposition: attachment; filename="output.mid"');
readfile($output_file);
unlink($output_file);
编辑:在Ubuntu上,可能想显式地使用
/bin/bash
,因为他们坚持要将
sh
链接到
dash
(在其他真正令人讨厌的事情中,pushd和popd本机不支持,破坏了多年来一直完美工作的shell调用…)。如果仍然存在工作目录问题,您可以在*nix机器上的java调用之前放置一个
pushd
(不确定Windows语法是什么:可能需要制作一个cmd脚本来处理所有工作目录位,只需调用它)

编辑:忽略我在上面评论末尾的咆哮。我几年前就这样做了,并且不得不使用
exec

$r = array();
    exec($this->config->item("java_path") . ' -cp ' . $this->config->item("java_base") . '\databasebackups.jar;' . $this->config->item("java_base") . '\requirements.jar ' . $startdate . $enddate . ' com.blah.blah.LastTransactionReport --user sa --password ' . $this->config->item("ms_password") . ' --dburl ' . $this->config->item("ms_url"), $r);

我的配置包括Java运行时的完整路径和jar文件所在的目录(这使用的是CodeIgniter),输出保存到$r数组中。尝试类似的方法,并让我知道它是否有效。

尝试使用
exec
和输出重定向将命令重定向到文件,如
javamcs…>outputlog.txt
并发布结果。尝试使用带有输出重定向的
exec
将命令发送到文件,如
javamcs…>outputlog.txt
并发布结果。不幸的是,所有这些都不起作用。我也不太清楚使用pushd是什么意思。不幸的是,这一切都不起作用。我也不太清楚你用pushd是什么意思。