PHP-скрипт в IFRAME блокирует другой код
У меня есть два сценария PHP, которые будут вызываться одновременно:
Первый скрипт будет работать несколько минут (загрузка файлов на основе PHP), в зависимости от размера загружаемого файла. Он помещен в<iframe>
поэтому он может работать отдельно и не блокировать браузер.Предполагается, что второй PHP-скрипт вызывается через равные промежутки времени для отслеживания выполнения первого скрипта - загрузки файла. Чтобы не открывать новые окна после завершения скрипта, он вызывается через AJAX.Проблема:Я поместил долгосрочный скрипт PHP (скачать скрипт) в<iframe>
поэтому этот скрипт может работать асинхронно с другим PHP-скриптом мониторинга. Однако, несмотря на то, что основной сценарий находится в<iframe>
когда веб-страница начинает выполнение, сценарий запускается и блокирует выполнение оставшегося кода JavaScript и сценария мониторинга, вызываемого несколько раз через AJAX.
Важно, чтобы краткосрочный PHP-скрипт мониторинга вызывался одновременно с долгосрочным PHP-скриптом (загрузка), чтобы краткосрочный (мониторинг) скрипт мог обеспечить обратную связь с JavaScript.
Не могли бы вы быть так добры и проанализировать мои примеры кода, пожалуйста? Я понятия не имею, где моя проблема. Мой код настолько прост, что все должно работать хорошо.
Версия PHP 5.4.12Apache / 2.4.4 (Win64) PHP / 5.4.12Windows 7 x648 ГБ ОЗУGoogle Chrome версия 30.0.1599.101 мОбразцы кода:Код JavaScript, вызывающий оба сценария PHP:
<!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()
{
// 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>
<iframe src="PHP/fileDownload.php"></iframe>
</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 if session is not already started
session_start();
// prepare session variables
$_SESSION['DownloadProgress'] ,= 10;
session_write_close();
for( $count = 0; $count < 60; $count++)
{
sleep(1);
print("fileDownload Script was called: ". $count);
echo "Download script: " . $count;
ob_flush();
flush();
}
?>
Скриншот:Порядок выполнения скриптов PHP - браузер ожидает завершения скрипта в<iframe>