我使用JQuery和AJAX在PHP文件中调用慢速函数,但在PHP函数完成之前我不会得到响应。尽管进行了2天的搜索,我还是无法弄清楚原因。我把它缩小为两个测试文件,它们表现出完全相同的行为。因此,我的php函数位于名为" ajaxfuncs.php"的文件中:
<?php
Class AjaxFuncs{
public function __construct() {
$this->testbuffer ();
}
function testbuffer(){
echo 'Starting Test Buffer Output. There should be a 2 second delay after this text displays.' . PHP_EOL;
echo " <br><br>";
echo '<div id="testdata" class="testdata">0</div>';
// The above should be returned immediately
flush();
// Delay before returning anything else
sleep(2);
for ($a = 0; $a < 3; $a++) {
echo '<script type="text/javascript">document.getElementById("testdata").innerHTML="' . (int)($a + 1) . '"</script>';
flush();
// Delay for 1 second before updating the value
sleep(1);
}
}
}
$AjaxFuncs = new AjaxFuncs();
?>
如果我打开&#34; ajaxfuncs.php&#34;文件在浏览器中。它完全符合我的期望,输出每秒更新一次,直到完成。所以我知道我已经在服务器上进行了缓冲。
但是当我使用以下$ .ajax调用它时,它是不对的。我把除了php之外的所有东西都放到ajax函数中,放到另一个名为&#34; testindex.php&#34;的php文件中。为了方便。就是这样:
<?php
header( 'Content-type: text/html; charset=utf-8' );
header("Cache-Control: no-store, must-revalidate");
header ("Pragma: no-cache");
header("Expires: Mon, 24 Sep 2012 04:00:00 GMT");
?>
<body>
<a>Test Page. Wait for it...</a>
<div id="maincontent">
</div>
</body>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script>
<script>
$(document).ready(function(){
console.log ('Document Ready');
function callajax(){
var ajaxfilepath = "ajaxfuncs.php";
return $.ajax({
url: ajaxfilepath,
data: {action: 'testbuffer'},
type: 'get',
cache: false,
dataType: "text",
beforeSend: console.log('Starting Ajax Operation')
})
.done(function(result){
processajaxcalloutput(result);
})
.always(function(){
console.log(' Ajax Internal Complete Detected');
})
.fail(function( jqXHR, textStatus ) {
console.log( "Ajax Request failed: " + textStatus );
});
}
function processajaxcalloutput(result){
var message = 'Processing Ajax Response' ;
console.log(message);
$("#maincontent").append(result);
}
callajax();
});
一切正常,没有错误。控制台很清楚 - 没有错误(我正在使用Chrome和Firefox进行测试)。但是在完成整个PHP功能之前,我似乎无法获得响应。我已经尝试了所有我能找到的东西,特别是数百种不同的东西来强迫缓存,但无济于事。任何帮助深表感谢。感谢。
更新 因此,基于到目前为止的反馈,很明显调用是异步的并且代码很好,但异步并不意味着我会在执行时从php函数获得连续的输出数据流。相反,整个响应将在执行结束时返回。我不会将此问题转移到有关流式传输的问题,而是将其留在此处,直到我解决流式传输问题。