2

我有这个 PHP 代码:

<?php
    include_once("connect_to_mysql.php");

    $max=300;
    while($max--)
    {
        sleep(1);
        doMyThings();
    }
?>

它应该重复一个 mysql 查询 300 次,每次之间的间隔为 1 秒。但问题是在浏览器中大约一分钟后我收到这条消息:没有收到数据。无法加载网页,因为服务器未发送数据。

4

4 回答 4

2

浏览器不会等待整整 5 分钟让您完成查询。

您需要找到不同的解决方案。考虑在 CLI 中执行 PHP 脚本。

于 2013-01-02T15:28:32.887 回答
2

问题如下:您的代码将至少(不考虑所需的时间量doMyThings())持续 300 秒。大多数 PHP 环境将默认脚本运行时间设置为大约 60 秒,脚本停止并且没有打印出任何内容。

接下来的事情是(如果脚本执行时间设置得足够高以允许长时间运行脚本),脚本必须运行直到完成(即约 300 秒),然后将数据写入输出流。在此之前,您将看不到任何输出。

要规避这两个问题,请参阅以下代码:

<?php
    // If allowed, unlimited script execution time
    set_time_limit(0);

    // End output buffering
    ob_end_flush(); 

    include_once("connect_to_mysql.php");

    $max=300;

    // End output buffering IE and Safari Workaround
    // They will only display the webpage if it's completely loaded or
    // at least 5000 bytes have been "printed".
    for($i=0;$i<5000;$i++)
    {
        echo ' ';
    }       

    while($max > 0)
    {
        sleep(1);
        doMyThings();
        $max--;

        // Manual output buffering
        ob_flush();
        flush();            
    }
?>

也许你也对这篇文章感兴趣:逐步输出 exec() ping 结果

于 2013-01-02T15:37:39.490 回答
0

执行 300 次 doMyThings(); 似乎超时 你可以试试set_time_limit(0);

设置允许脚本运行的秒数。如果达到此值,脚本将返回致命错误。默认限制为 30 秒,如果存在,则为 php.ini 中定义的 max_execution_time 值。

于 2013-01-02T15:42:01.257 回答
0

当您在服务器端执行长时间的 php 代码时,您需要更改 php.ini 中的 max_execution_time 指令。但是浏览器不会等待你想要多长时间,所以你需要使用像 AJAX 这样的异步技术

于 2013-01-02T15:44:30.250 回答