Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中运行shell命令并进行实时输出_Php_Shell - Fatal编程技术网

在php中运行shell命令并进行实时输出

在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

我通过php
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();