jQuery / AJAX在处理php中的长任务时输出数据

时间:2018-08-15 22:00:57

标签: php jquery ajax

下午好。

我有以下代码,该代码在提交时将数据发送到PHP文件,该文件查询多个网络节点的运行状况。问题在于任务需要大约40秒钟才能完成,并且在此期间没有输出。我尝试使用ob_flush和flush。没有效果,尽管我在代码的php部分中。我仍然可以看到加载消息,并在准备就绪后获得完整的打印输出。但是,flushob_flush通常可以在我的服务器上运行(经测试为独立脚本),所以这不是问题。

据我了解,这是jQuery / ajax调用,它等待代码完全执行后才吐出打印输出。我浏览了这些论坛,找不到任何适用的解决方案,因为它们大多数与我在使用“ POST”时与“ GET”请求有关。

有人可以为此指出正确的方向吗?在PHP仍在处理请求时,是否可以接收打印输出?

JS代码

$(document).ready(function(){
    $('#userForm3g').on('submit', function(e){
        e.preventDefault();
        e.stopImmediatePropagation();

        $('#response').html("<b>Loading data...</b>");

        $.ajax({
                type: 'POST',
                url: 'myphpfile.php',
                data: $(this).serialize()
            })
            .done(function(data){ 
                $('#response').html(data);
            })
            .fail(function() { 
                alert( "Posting failed." );
            });

        return false;
    });
});

谢谢!

1 个答案:

答案 0 :(得分:0)

您提到的方法的问题在于,它有多种方法可能会失败:您可能会忘记清除php输出缓冲区,或者由于某些原因可能严格控制了设置,可能存在代理或负载均衡器等待请求完成的请求,或者也可以是Web浏览器(用于渲染部分内容的Chrome浏览器,但他们停止了执行此操作)。

尽管答案很少:

  • 您可以使用部分响应(基本上在http上流式传输)。我以前使用过一个专门的库来做这个,但是我忘了它的名字。不过,我不建议使用此选项,如果失败,将很难找到原因。
  • 您可以使用任何长时间轮询的方法,包括彗星或套接字,但是您需要兼容的服务器(node.js或reactphp)
  • 您可以使用诸如PusherOneSignal之类的第三方服务(它们也使用以前的方法,但是更集成,更可靠)