在900秒(15分钟)后混淆PHP / AJAX超时

时间:2011-09-30 05:37:59

标签: php javascript html ajax

以下所有内容都基于Linux,最新的Apache,最新的Apache模块。

我遇到了基于AJAX + PHP的Web应用程序的意外行为。 这是一个非常简单的AJAX方法,基本上涉及对运行一段时间(几秒到几分钟)的PHP脚本(execute.php)的请求。作为测试设置,PHP脚本(execute.php)基本上只是睡了一段时间。当这个数量为899秒时,它可以正常工作,但是当我将它设置为900时,PHP脚本(简单的echo())的答案似乎已经过期或者类似的东西(究竟是什么原因或原因实际上是未知的) me)因为请求没有注意到它,因此没有响应,并且各个innerHTML没有按预期更新。 请找到以下代码。

我现在想知道900秒的“超时”来自何处,更重要的是,我该如何防止这种情况发生?毕竟,我认为这至少是AJAX处理异步调用的一般概念,并在请求改变其状态后立即通知客户端?!

process.php

<?php
session_start();

include("functions.php");
include("env.php");

html_head("Processing...");

$sid = $_SESSION['my_sid'];

?>
<script type="text/javascript">
function run_analyses(params){
    <?php
    print "var sid = \"". $sid ."\";
    ";
    ?>

    // Use AJAX to execute the programs independenantly in the background
    // Allows for the user to close the process-page and come back at a later point to the results-link, w/o need to wait.
    if (window.XMLHttpRequest)
    {
        http_request = new XMLHttpRequest();
    }
    else
    {
        //Fallback for IE5 and IE6, as these don't support the above writing/code
        http_request = new ActiveXObject("Microsoft.XMLHTTP");
    }
    //Is http_request still false
    if (!http_request)
    {
        alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
    }

    http_request.onreadystatechange=function(){
        if (http_request.readyState==4 && http_request.status==200){
            // Maybe used to display the progress of the execution
            document.getElementById("output").innerHTML=http_request.responseText;
        }
    };

    http_request.open("POST","execute.php",true);
    //Send the proper header information along with the request
    http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http_request.setRequestHeader("Content-length", params.length);
    http_request.setRequestHeader("Connection", "close");
    http_request.send(params);
};
</script>

<?php
$params "some_params";
print "
Starting AJAX-call<br>
<div style=\"width:400px; border: 1px black solid;\" id=\"output\">Use this to display an information about the progress</div>
<script type=\"text/javascript\">
    run_analyses('".$params."');
</script>
<form action=\"./usersets/". $sid ."/results.html\" id=\"go_to_results\" method=\"POST\">
<input type='hidden' name=\"session_id\" value=\"" .$sid. "\">
</form>
";
html_foot();
?>

和execute.php:

<?php

session_start();

include("functions.php");
include("env.php");

$sid = $_SESSION['my_sid'];

// Used to get the time at start of processing
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;
session_write_close();

sleep(900);  //899 here works

session_start();
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 3);
//echo 'Page generated in '.$total_time.' seconds.'."\n";

// Make it accessible for the results
$_SESSION['process_time'] = $total_time;

echo("none");

?>

因此,当PHP脚本休眠899秒时,“启动AJAX调用”之后的文本会更新为“none”,但如果该值为900秒,则保留“使用此项显示有关进度的信息”。

我真的很期待你的建议。

最佳,

修改

执行grep max_execution $(locate php.ini )给出:

/etc/php5/apache2/php.ini:max_execution_time = 30
/usr/share/doc/php5-common/examples/php.ini-development:max_execution_time = 30
/usr/share/doc/php5-common/examples/php.ini-production:max_execution_time = 30
/usr/share/php5/php.ini-production:max_execution_time = 30
/usr/share/php5/php.ini-production-dist:max_execution_time = 30
/usr/share/php5/php.ini-production.cli:max_execution_time = 30

EDIT2 在我的浏览器中本地调用脚本(在我的本地linux机器上运行的apache webserver)时,它的行为与预期的一样,并且会重新响应请求的返回。但是,当在运行在不同计算机上的Web服务器上运行时,它会出现上述意外行为。有什么线索吗?因为我没有...抱歉。

3 个答案:

答案 0 :(得分:1)

在你的php.ini中有一个max_execution_time,默认是30秒,所以它似乎已经设置为900.所以我先检查那里。信息:http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

至于解决它,您可以编辑php.ini以将该值设置为非常高(或0表示无限制),或者您也可以使用此函数:http://php.net/manual/en/function.set-time-limit.php在300之后重置它秒。

希望这有帮助!

编辑:添加了李的建议0值max_execution_time

编辑2:

在这里找到了一些有趣的东西http://www.php.net/manual/en/function.set-time-limit.php#75557

  

请注意,在Linux下,睡眠时间会被忽略,但在Windows下,它会被视为执行时间。

所以,这可能就是为什么它被允许执行超过30秒,但最终仍然会切断它。

答案 1 :(得分:0)

我尝试了您的示例并将其放在不同的主机(不是localhost)中。在我的情况下它运行良好,并在900秒后得到“无”值。我删除了SESSION调用以简化示例...

不用会话就试试吧。如果这改变了某些东西,那么也许“session.cookie_lifetime”值可能是相关的。

答案 2 :(得分:0)

在所有php.ini.htaccess中搜索值900:

grep -HR 900 $(locate php.ini ) $(locate -e .htaccess )

还在源代码中搜索900和900的分数:

cd /var/www/ #path_to_yoursite
grep --color=auto -HR "=\s*900\b"
grep --color=auto -HR "=\s*20\s*\*\s*45\b"
grep --color=auto -HR "=\s*15\s*\*\s*60\b"
...