PHP睡眠延迟

Posted

技术标签:

【中文标题】PHP睡眠延迟【英文标题】:PHP sleep delay 【发布时间】:2013-03-03 02:48:13 【问题描述】:

php 中,我想在循环的每次迭代中放置一些秒延迟。

for ($i=0; $i <= 10; $i++) 
    $file_exists=file_exists($location.$filename);
    if($file_exists) 
        break;
    

    //sleep for 3 seconds

我该怎么做?

【问题讨论】:

只是好奇...为什么要延迟循环? 我可能应该指出,以 3 秒延迟运行 10 次的循环将需要 30 秒才能执行。这可能会使您的服务器超时,因此请检查您的配置,看看您是否可以在 PHP 之外完成一些处理,即通过 cron 或其他方式。 @Husman:11 次,而不是 10 次。 ;) 你确实是对的,撇开迂腐不谈,我所说的仍然是正确的——Web 服务器不喜欢慢速脚本并且会抱怨很多。而你网站上的一些用户,在服务器上运行 33 秒的脚本是一个很大的 NO。 @Baba 他/她可能正在等待其他一些任务(如文件权限、解压缩、下载等)完成 【参考方案1】:

使用PHP sleep() 函数。 http://php.net/manual/en/function.sleep.php 这会在给定的秒数内停止执行下一个循环。所以像这样的

for ($i=0; $i <= 10; $i++) 
    $file_exists=file_exists($location.$filename);
    if($file_exists) 
        break;
    
    sleep(3); // this should halt for 3 seconds for every loop

【讨论】:

出于某种原因,这只是将脚本暂停 33 秒,然后立即运行脚本... @MrPizzaGuy 我也有同样的问题,你找到解决方案了吗? @MrPizzaGuy 这不会停止整个循环的整个脚本。尝试在循环内打印一些内容,您会看到脚本实际上正在运行,但如果找不到文件,则会继续查找文件,然后继续执行脚本的其余部分。【参考方案2】:

您可以使用 sleep(3) 使线程休眠 3 秒。

更正php are in seconds中的休眠方法。

【讨论】:

把 sleep 和 usleep() 混为一谈 它是 sleep(3),而不是 sleep(3000)。 sleep(3000) 将睡近一个小时! 大声笑,是的,谢谢你们,我刚刚修好了。我和java的sleep方法搞混了。【参考方案3】:

我明白你在做什么......你延迟了一个脚本来不断检查文件系统上的一个文件(我假设一个正在上传或由另一个脚本编写的文件)。这是一种糟糕的做法。

    您的脚本将运行缓慢。如果有多个用户正在运行该脚本,则会阻塞服务器。 您的服务器可能对某些用户超时。 HDD 访问是一种昂贵的资源。 有更好的方法来做到这一点。

您可以使用 Ajax。并使用超时每隔几秒钟调用一次您的 PHP 脚本。这将避免缓慢的脚本加载。而且你也可以一直做下去(当前的 for 循环只会运行 33 秒然后停止)。

您可以使用数据库。在某些情况下,数据库访问比 HDD 访问更快。尤其是视图和缓存。创建文件/上传文件的脚本可以在表中设置一个标志(即 file_exists),然后您可以拥有一个脚本来检查数据库中的该字段。

【讨论】:

完全不写延迟函数会不会更好,只是让它运行更长的时间,也许是 20 次? @Yevo 否。循环运行 20 次将在不到一秒的时间内执行。这实际上取决于CPU速度。我的延迟将在用户时间(秒)内运行。 这种依赖 AJAX 的事情是它很容易被规避。在客户端运行的任何东西都不能依赖,因为我可以将其关闭,甚至可以使用 curl 之类的工具直接发送 http 命令【参考方案4】:

您是否考虑过使用supervisorD 的PHP 守护程序脚本。我在需要一直运行的多个任务中使用它。

关键是确保每次运行脚本时检查内存资源。如果它太高,请停止该过程,然后让它重新启动。

我已成功使用此流程来始终检查数据库记录以查找要处理的任务。

这可能有点矫枉过正,但值得考虑。

【讨论】:

【参考方案5】:

野兔有两种方法让 php 脚本休眠一段时间。当您有代码并希望暂停脚本工作一段时间时,请使用这些功能。 在这些示例中,第一部分代码将在脚本运行时完成,第二部分代码将完成,但有时间延迟。

    使用sleep() 函数,您可以以秒为单位定义睡眠时间。

例子:

echo "Message 1";
// The first part of code.
$timeInSeconds = 3;
sleep($timeInSeconds);
// The second part of code.
echo "Message 2";

这样可以让 php 脚本休眠 3 秒。使用此函数,您可以将脚本休眠整数(整数)秒。

    使用usleep() 函数,您可以以微秒为单位定义睡眠时间。对于需要比一秒更精确的时间的间隔,此睡眠时间很方便。

例子:

echo "Message 1";
// The first part of code.
$timeInMicroSeconds = 2487147;
usleep($timeInMicroSeconds);
// The second part of code.
echo "Message 2";

如果你想让 php 睡眠的时间值小于秒(浮点数),你可以使用这个函数。在这个例子中,我让脚本休眠了 2.487147 秒。

【讨论】:

以上是关于PHP睡眠延迟的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的延迟/睡眠?

JavaScript Javascript中的睡眠/延迟

iphone 处于睡眠模式时,iphone 应用程序延迟 10 -15 分钟

Swift 中的延迟/睡眠不起作用

为啥 PyGame 在延迟或睡眠之前没有在窗口中绘制?

Javascript中的睡眠/延迟