在php中运行shell命令并进行实时输出
我通过php在php中运行shell命令并进行实时输出,php,shell,Php,Shell,我通过phpmove\u upload\u file函数上传一个文件,然后将该文件作为java程序的参数。当java程序执行时,它在终端中输出进度。java程序的输出是执行相同操作的perl脚本的输入。 我在我的php网站上以shell_exec函数的形式执行所有这些函数,并将它们打印到屏幕上 echo "Running java ..... "; $output=shell_exec("java -jar abc.jar ".( $_FILES['uploaded']['nam
move\u upload\u file
函数上传一个文件,然后将该文件作为java程序的参数。当java程序执行时,它在终端中输出进度。java程序的输出是执行相同操作的perl脚本的输入。
我在我的php网站上以shell_exec函数的形式执行所有这些函数,并将它们打印到屏幕上
echo "Running java ..... ";
$output=shell_exec("java -jar abc.jar ".( $_FILES['uploaded']['name']));
echo "<pre>$output</pre>";
echo "running perl .....";
$output=shell_exec("perl abc.pl outputfromjava.txt");
echo "<pre>$output</pre>";
我应该如何编写我的php,以便输出
谢谢尝试
>file.txt
然后读取文件
:)使用
ob\u end\u flush
禁用输出缓冲,并使用proc\u open
而不是shell\u exec
启动进程,因此您可以完全控制文件描述符,无需等待进程完成即可获得输出。当您使用proc\u open
启动进程时,从其STDOUT和STDERR读取数据并将其输出到浏览器,可能使用flush
,以确保输出不会保存在任何缓冲区中。这是我的解决方案:(在Windows machine+wamp服务器上测试)
header('Content-Encoding:none;');
设置时间限制(0);
$handle=popen(“>”,“r”);
如果(ob_get_level()==0)
ob_start();
而(!feof($handle)){
$buffer=fgets($handle);
$buffer=trim(htmlspecialchars($buffer));
echo$buffer。“
”;
echo str_垫('',4096);
ob_flush();
冲洗();
睡眠(1);
}
pclose($handle);
ob_end_flush();
我使用系统而不是shell_exec,它工作正常。proc_open比system有什么额外的优势吗?当然!您基本上可以完全控制流程及其fd(输入/输出)。也就是说,您的脚本在命令运行时保持继续(在proc\u open
之后),这会带来很多潜在的好处。我已经尝试了您的代码,实际上它不是实时显示shell命令,而是等待shell命令完成加载所有文本并使用sleep(1)help逐位显示它。对不起,你应该投反对票
Running java ....
Running Perl ....
Running Java...
Progress1 //from java output
progress2 //from java output
Running Perl....
Progress1 //from perl output
progress2 //from perl output
header('Content-Encoding: none;');
set_time_limit(0);
$handle = popen("<<< Your Shell Command >>>", "r");
if (ob_get_level() == 0)
ob_start();
while(!feof($handle)) {
$buffer = fgets($handle);
$buffer = trim(htmlspecialchars($buffer));
echo $buffer . "<br />";
echo str_pad('', 4096);
ob_flush();
flush();
sleep(1);
}
pclose($handle);
ob_end_flush();