我有一个表单,当前在提交时由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表单处理脚本效率很高,工作正常,但由于其操作的性质很慢。)
答案 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调用用于处理脚本,随着处理的进行,我希望状态文本更新。