Skrypt PHP w IFRAME Blokuje inny kod

Scenariusz:

Mam dwa skrypty PHP do wywołania jednocześnie:

Pierwszy skrypt będzie działał przez kilka minut (pobieranie plików w PHP), w zależności od wielkości pobranego pliku. Jest umieszczony w<iframe> więc może działać oddzielnie i nie blokuje przeglądarki.Drugi skrypt PHP powinien być wywoływany w regularnych odstępach czasu, aby monitorować wykonanie pierwszego skryptu - pobieranie postępu pliku. Aby uniknąć otwierania nowych okien po zakończeniu skryptu, jest on wywoływany przez AJAX.Problem:

Włożyłem długo działający skrypt PHP (skrypt pobierania) do<iframe> więc ten skrypt może działać asynchronicznie z innym skryptem PHP do monitorowania. Jednak pomimo głównego skryptu jest<iframe>, gdy strona zaczyna się uruchamiać, skrypt uruchamia się i blokuje wykonanie pozostałego kodu JavaScript i skryptu monitorującego wywoływanego wielokrotnie za pośrednictwem AJAX.

Ważne jest, aby skrócone skrypty PHP były wywoływane jednocześnie z długo działającym skryptem PHP (do pobrania), więc skrypt działający w krótkich odstępach czasu (monitorowanie) może przekazywać informacje zwrotne do JavaScript.

Czy byłbyś tak uprzejmy i przeanalizowałbyś moje próbki kodu? Nie mam pojęcia, gdzie jest mój problem. Mój kod jest tak prosty, że wszystko powinno działać dobrze.

Wersja PHP 5.4.12Apache / 2.4.4 (Win64) PHP / 5.4.12Windows 7 x648 GB pamięci RAMGoogle Chrome w wersji 30.0.1599.101 mPróbki kodu:

Kod JavaScript wywołujący oba skrypty 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>

Skrypt monitorowania 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 działający od dłuższego czasu (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();
}
?>
Zrzut ekranu:

Kolejność wykonywania skryptów PHP - przeglądarka czeka na zakończenie skryptu<iframe>

questionAnswers(1)

yourAnswerToTheQuestion