【问题标题】:PHP sleep() inside loop not updating DB循环内的PHP sleep()不更新数据库
【发布时间】:2010-12-19 17:07:35
【问题描述】:

我有一个 cronjob 每分钟触发一次的 php 文件。

当 php 文件被触发时,它会更新数据库、休眠等

它是这样编程的:

$start = microtime(true);
set_time_limit(10);

for($i=0;$i<5;$i++)
{
    updateDB();
    time_sleep_until($start + $i + 1);
}

如果运行这段代码,我看不到数据库中发生任何变化。我注意到的另一件事是,当我回显某些内容时,我会在循环结束时打印出来。

[edit] 我尝试使用flush和ob_flush,但它仍然没有打印line for line[/edit]

我能做些什么来避免这些错误。数据库需要更新。

我想知道的另一件事是最好的方法是记录这种事情。我可以将结果记录到日志文件中吗?

【问题讨论】:

  • 您的回声可能会被缓冲。在每次回显后调用 flush 可能会导致它们立即打印。
  • 嗨,感谢您的回复。我尝试使用flush,但没有任何区别。
  • 对不起,我遇到了不同的问题,现在冲洗工作正常,一切都很好。谢谢。

标签: php mysql loops sleep flush


【解决方案1】:

看起来您是从命令行运行的,在这种情况下,您可能希望写入 stderr 以便没有缓冲。 $stderr = fopen('php://stderr', 'w');

在记录的情况下,只需打开一个文件,写入它,然后关闭它。 (fopen, fwrite, fclose);

【讨论】:

    【解决方案2】:

    循环本身看起来不错。如果它没有更新您的数据库,则错误必须在您的 updateDB() 函数中。

    关于回声。脚本的输出通常是缓冲的。要强制 PHP 立即打印它,您可以在想要刷新输出时调用 flush(),或者您可以在脚本顶部调用 ob_implicit_flush(),每次打印时它都会自动刷新。

    此外,如果您通过浏览器调用脚本,浏览器本身可能会在显示给您之前进一步缓冲响应。

    关于日志记录,最简单的方法是在某处选择一个文件,然后使用file_put_contents() 打印您想要记录的任何内容。注意第三个参数的 FILE_APPEND 标志。

    【讨论】:

    • 您好,感谢您的回复。奇怪的是 updateDB() 函数可以正常工作。当我删除循环并制作 1 秒的 html 元刷新页面时,一切正常。除了在循环中。在文件的末尾,它只打印回显的内容,没有错误。使用 sleep 时还有其他方法可以调用吗?
    • 这很奇怪。我看不出该功能以这种方式工作的原因。当然,如果没有实际看到该功能,就很难确定。如果您连续调用该函数五次,每次后跟 sleep(1),这会改变什么吗?... P.S.添加了一些关于缓冲的细节。
    • 嗨,现在一切正常。我的 updateDB() 类中确实有一些错误,它们不是真正的错误,而是错误的编程。必须根据当前时间(以秒为单位)检查数据库更新。时间是在循环之前定义的,所以没有更新,也没有错误。
      但是现在一切正常,冲洗也可以。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2019-06-18
    相关资源
    最近更新 更多