我有两个PHP脚本可以同时调用:
在执行第一个长时间运行的PHP(稍后下载)脚本期间,不会处理定期调用的AJAX监视脚本。只有第一个脚本完成后,才会处理称为PHP脚本的AJAX。
我花了很多时间来解决这个问题。我尽可能地简化了我的测试脚本。但是,在主php脚本执行期间,我仍然无法使AJAX脚本正常工作。我也不能以任何其他方式从主下载脚本中获取中间反馈值。
请您如此善良并分析我的代码示例吗?它们具有我现在使用它们的精确形式。如果可能的话,你会如此善良并在你的环境中运行它们吗?我怀疑问题可能出现在我的WAMP环境中。
调用两个PHP脚本的JavaScript代码:
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
</head>
<body onload="callScripts();">
<script type="text/javascript">
// call both PHP scripts(download and monitoring) in desired order
callScripts = function()
{
// run long running (later Download) PHP script
console.log("Calling: PHP/fileDownload.php");
window.location.href = 'PHP/fileDownload.php';
// call the monitoring PHP script multiple times in 2 second intervals
window.setTimeout(function(){startDownloadMonitoring()}, 1000);
window.setTimeout(function(){startDownloadMonitoring()}, 3000);
window.setTimeout(function(){startDownloadMonitoring()}, 5000);
window.setTimeout(function(){startDownloadMonitoring()}, 7000);
window.setTimeout(function(){startDownloadMonitoring()}, 9000);
};
// call monitoring PHP script via AJAX
function startDownloadMonitoring()
{
console.log("Calling startDownloadMonitoring()...");
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
console.log("Response Received: " + xmlhttp.responseText);
}
}
xmlhttp.open("GET", "PHP/fileDownloadStatus.php", true);
xmlhttp.send();
}
</script>
</body>
</html>
PHP监控脚本(fileDownloadStatus.php)
<?php
include 'ChromePhp.php';
// start session, update session variable, close session
session_start();
$_SESSION['DownloadProgress']++;
ChromePhp::log('$_SESSION[\'DownloadProgress\'] = ' . $_SESSION['DownloadProgress']);
session_write_close();
echo "success";
?>
PHP长期运行的脚本(fileDownload.php)
<?php
include 'ChromePhp.php';
// disable script expiry
set_time_limit(0);
// start session, define variable, close session
session_start();
// prepare session variables
$_SESSION['DownloadProgress'] = 10;
session_write_close();
// execute for 60 seconds
for( $count = 0; $count < 60; $count++)
{
sleep(1);
}
?>
答案 0 :(得分:3)
它不通过ajax发送的第一个脚本:
// run long running (later Download) PHP script
console.log("Calling: PHP/fileDownload.php");
window.location.href = 'PHP/fileDownload.php';
您只需将用户重定向到另一个页面,并且因为您在php中有download headers
,该文件将在同一页面中下载。
您可以通过iframe
轻松实现范围。您设置该iframe的来源:'PHP/fileDownload.php'
,然后只需调用您的ajax下载检查器。
简短示例:
<iframe src="PHP/fileDownload.php">
<script>
window.setTimeout(function(){startDownloadMonitoring()}, 1000);
window.setTimeout(function(){startDownloadMonitoring()}, 3000);
window.setTimeout(function(){startDownloadMonitoring()}, 5000);
window.setTimeout(function(){startDownloadMonitoring()}, 7000);
window.setTimeout(function(){startDownloadMonitoring()}, 9000);
// .... blah blah
</script>
答案 1 :(得分:1)
致电时
window.location.href = 'PHP/fileDownload.php';
脚本执行停止(不是立即执行,请参阅https://stackoverflow.com/a/2536815/2806497)。
您确定执行了对fileDownloadStatus.php的ajax调用吗?
解决方案是通过ajax异步调用调用fileDownloadStatus.php文件,或者将其加载到您放入页面的iframe中。
希望有所帮助。