如何从作为表单提交操作的PHP脚本中检索一系列文本消息/状态报告?

时间:2015-12-21 17:37:10

标签: javascript php jquery ajax forms

我有一个表单,当前在提交时由PHP脚本中的操作处理。 PHP脚本包含许多需要时间处理的过程。我想打印到父脚本(带有表单的脚本,在PHP脚本完成之前仍然可以在屏幕上显示)来自PHP脚本的状态报告,例如:

  

程序1已经开始......程序1已经完成。

     

程序2已经开始......程序2已经完成。

     

程序3已经开始......程序3已经完成。

据我所知,执行此操作的主要方法是使用AJAX调用拦截表单提交,如下所示:

$('#formID').on('submit',function(e){
    e.preventDefault();
    $.ajax({
        type     : "POST",
        cache    : false,
        url      : $(this).attr('action'),
        data     : $(this).serialize(),
        success  : function(data) {
            // do something with the returned data from the PHP script
        }
    });
});

但是,这似乎只是从表单调用的PHP文件返回/报告返回值(回显消息等)。我希望将一系列消息返回到父表单,指示PHP脚本在处理表单中的值时的进度。

由于我不完全理解的原因,表单页面在PHP操作完成之前仍然可见,此时页面通过使用末尾的header()指令重定向到站点中的不同页面。 PHP脚本。 (代码最初由不同的开发人员编写;我对他的例程的理解不完善。在JQuery PLUpload函数中调用submit(),这可能是也可能不是为什么表单页面保留在屏幕上,直到PHP动作脚本为止结束。)

不将PHP表单处理分解为一系列单独的脚本,每个脚本单独处理,如何使用AJAX(或其他技术)拦截默认表单处理并执行PHP处理脚本,以便状态文本消息可能是回显到屏幕或作为样式页面中<div>元素上的样式文本追加? (PHP处理脚本依赖于从表单上的值派生的一系列变量,至少可以说,必须在顺序调用的一系列单个PHP文件中重新创建它们是不优雅的,因为当前PHP表单处理脚本效率很高,工作正常,但由于其操作的性质很慢。)

1 个答案:

答案 0 :(得分:0)

在我的本地主机上,也许在许多实时服务器上,解决方案需要标头<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">后跟while (@ob_end_flush());,然后在每个文本回显后显示flush();。一个简单的例子就是这个简短的例程:

<?php
header( 'Content-type: text/html; charset=utf-8' );

while (@ob_end_flush());

function sendMsg($msg) {
    echo $msg;
    flush();
}

function sleep_test($sleep_time) {

    $x = "Beginning process:<br>";
    sendMsg($x);
    $y = "Waiting $sleep_time seconds ...<br>";
    sendMsg($y);
    sleep($sleep_time);
    $z = "Done.<br><br>";
    sendMsg($z);

}

sleep_test(1);
sleep_test(2);
sleep_test(3);
?>

但是,我正在我的实时服务器上使用共享主机方案,其管理设置(即那些我无法通过php.ini和Apache覆盖更改的内容等)在完全处理之前不会显示其文本;只有这样才能完全刷新缓冲区。上面的脚本在我的XAMPP和WAMP本地主机上完美运行,并且应该为其他任何人使用,但是如果它没有并且你试图在你的实时主机上获得这种性能,那么如果这个脚本没有刷新缓冲区直到它被完全处理,它可能是不可能的;请联系您的liveserver管理员以获取信息。

出于我的目的,一组非常精心构造的AJAX调用用于处理脚本,随着处理的进行,我希望状态文本更新。