【问题标题】:php exec how to see progressphp exec如何查看进度
【发布时间】:2012-02-19 11:53:44
【问题描述】:

我有一个运行 2 exec 的 php 脚本。

exec(".....", $output, $return1);
echo $return1;
exec(".....", $output, $return2);
echo $return2;

这 2 个 exec 每个需要 1 分钟才能运行。 当我运行这个脚本时,我正在等待 2 分钟,结果是“00”。 没关系,但我想看看$return1; 1 分钟后看到$return2 1 分钟后。 我必须使用 Ajax/js 吗? 事实上,我会做一个进度条,当第一次执行完成时 => 50% 当第二次执行完成时 => 100%

非常感谢您的帮助!


开始解决方案:

类似这样的:

定义.php:

setInterval(function() {
$.ajax({
    type: "GET",
    url: 'convert.php?file='+id_file,
    cache:false,
    success:function(result){
        $('.content_box').html(result);

    }
});

}, 3000);

转换.php:

exec(convert id_file.pdf id_file.jpg, $output, $return1);
echo $return1;
exec(convert -resize50x50 id_file.jpg id_file_thumb.jpg, $output, $return2);
echo $return2;

但它运行时没有回调且不间断!

【问题讨论】:

    标签: php exec return progress


    【解决方案1】:

    没有任何方法可以控制 PHP 何时返回结果。最好的选择是执行其中一个,然后返回。一旦第一个运行,将其设置为然后运行第二个。

    【讨论】:

    • 但正如它在 PHP.net 上所说的那样刷新缓冲区是不可靠的。
    【解决方案2】:

    是的,您必须使用 AJAX - 只需保持脚本不变,您将需要另一个脚本来报告原始脚本的进度和/或部分结果。原始脚本可以使用 $_SESSION 传递进度/部分结果信息,这是最简单的解决方案。

    或者,您可以使用 AJAX 请求,不仅可以报告进度/部分结果,还可以分阶段运行操作,正如 Zar 可能建议的那样。但是这种方法不太灵活;阶段可能会共享一些全局数据,因此如果它们都在一个脚本运行中会更好。所以我在第 1 段中勾勒的方法更可行。

    【讨论】:

    • 谢谢,好的,我会用 Jquery 开发一个 ajax 脚本。你能给我建议吗?一个 php 文件对应一个“exec”和 2 个脚本 jquery 还是一个 php 文件对应两个“exec”和一个脚本 jquery?
    • @SebGouaille,继续我在第一段中勾勒的解决方案,所以 *'一个带有两个“exec”的 php 文件和一个用于 ajax 的 php 文件(它甚至可能都在一个php 文件)。
    【解决方案3】:

    确实,您可以使用 javascript 和 AJAAX 来实现。 查看setTimeout() 和 AJAX。

    您可以指定 GET 或 POST 数据,以便服务器知道要运行什么函数。

    【讨论】:

      【解决方案4】:

      如果exec()'ed 应用程序输出进度信息,您甚至可以得到:传统上我们使用重定向技巧来做到这一点:

      首先创建一个类似的shell脚本

      #!/bin/bash
      $OUTFILE=$1
      shift
      your_executable "$@" > $OUTFILE &
      echo $!
      

      然后

      • 创建(关闭)临时文件
      • exec() 以临时文件名作为第一个参数的脚本并存储返回的 PID
      • 现在轮询临时文件,每当您发现新行 echo 他们和 fflush()
      • 当带有存储 pid 的进程退出时,退出您的脚本

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多