当另一个PHP脚本运行时,AJAX不会调用它的PHP脚本

时间:2013-10-30 13:10:57

标签: javascript php ajax html5 wamp

情景:

我有两个PHP脚本可以同时调用:

  1. 第一个脚本将运行几分钟(基于PHP的文件下载),具体取决于下载的文件大小
  2. 应该定期调用第二个PHP脚本来监视第一个脚本的执行 - 文件进度下载。为了避免在脚本完成时打开新窗口,可以通过AJAX调用它。
  3. 问题:

    在执行第一个长时间运行的PHP(稍后下载)脚本期间,不会处理定期调用的AJAX监视脚本。只有第一个脚本完成后,才会处理称为PHP脚本的AJAX。

    我花了很多时间来解决这个问题。我尽可能地简化了我的测试脚本。但是,在主php脚本执行期间,我仍然无法使AJAX脚本正常工作。我也不能以任何其他方式从主下载脚本中获取中间反馈值。

    请您如此善良并分析我的代码示例吗?它们具有我现在使用它们的精确形式。如果可能的话,你会如此善良并在你的环境中运行它们吗?我怀疑问题可能出现在我的WAMP环境中。

    • PHP Version 5.4.12
    • Apache / 2.4.4(Win64)PHP / 5.4.12
    • Windows 7 x64
    • 8GB RAM

    代码示例:

    调用两个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);
    }
    
    ?>
    

2 个答案:

答案 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中。

希望有所帮助。