如何将 php 函数延迟 2 分钟?

Posted

技术标签:

【中文标题】如何将 php 函数延迟 2 分钟?【英文标题】:How do I delay a php function for 2 minutes? 【发布时间】:2016-01-04 23:35:51 【问题描述】:

我有这个脚本在页面加载 2 分钟后执行数据库查询。我不能使用 sleep() 函数,因为它不能让页面正确加载。

我找到了这段代码:

$now = time();
while ($now + 120 > time()) 
    // do nothing


//other actions here

但它只是不加载页面。我怎样才能做到这一点?提前谢谢!

编辑:我想在观看视频两分钟后奖励用户。如果用户提前关闭页面,则不会执行任何操作。

【问题讨论】:

为什么不直接使用 cron 作业? 因为我需要在用户加载页面后启动计时器 持有凭证一定时间不是一个好主意。 你不能。 php 脚本基本上是单线程的。您必须启动一些其他脚本才能进行延迟/查询。您在主脚本中所做的任何事情都会迫使用户在水中死去 2 分钟。也许是一个 JS 定时器来做一个 ajax 调用,触发查询,但仍然...... 正是 ^ 您应该向他们展示一些活动类型:“请稍候,正在加载...” 【参考方案1】:

假设您需要将查询结果返回到页面,为什么不进行异步调用。让页面加载,在 javascript 中等待两分钟,然后使用 ajax 访问您的 php 服务器并拉取查询结果。

使用setTimeout https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout

然后发出一个Ajax请求

http://api.jquery.com/jquery.ajax/

或者

https://developer.mozilla.org/en-US/docs/AJAX

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

另外,根据您的应用和查询内容,考虑缓存查询结果以备下次使用。但是,这取决于您的应用程序的用途。


如果您的页面不需要查询结果,请参阅Run PHP Task Asynchronously


考虑到您的新编辑的上下文,仅使用严格的服务器端来实现此功能的正确方法是使用视频流服务,该服务在成功流式传输整个视频(用户不会提前退出或暂停)后运行归功于用户的后期操作脚本。但是,如果您不熟悉视频流服务,那么设置起来比其他建议的方法更复杂。考虑到您的安全需求、成本和黑客行为的后果,我会支持使用您认为简单且最满意的实现方式。

【讨论】:

你不能说这是最好的方法,除非你知道他想要达到什么目的。如果用户在 1 分钟后关闭页面,则永远不会执行。这可能是也可能不是问题。 我的回答假设他需要将查询结果返回到页面。他如果不需要结果,考虑这个***.com/questions/858883/run-php-task-asynchronously 是的,如果用户关闭页面,代码一定不能执行。 如果要求用户在2分钟前关闭页面,则查询不运行,则应使用浏览器发送的ajax请求。 是的,但是使用 jquery 参数和 php 文件 url 是可见的。这意味着用户可以给自己积分。【参考方案2】:

创建一个 PHP 脚本,它将更新用户的信用。例如,使用Cron 每 1 分钟安排一次此脚本的执行。

此脚本会遍历所有活跃用户并更新每个用户的积分。然后就结束了。

应该更新学分的条件由您决定。我想你会检查以前的活动是否经过了 2 分钟,如果是,你会更新学分。否则你什么都做不了。

它可能看起来像这样:

$users = getActiveUsers();
$currentTime = time();

// go through all active users
foreach ($users as $user) 
    // if conditions are met, give some credits to the user
    if ($currentTime - $user->lastActivityOn >= 120) 
        $user->credit += 1;
        $user->save();
    

此脚本将运行非常短的时间,取决于用户数量,可能是几毫秒到几秒,并且每分钟执行一次。 它非常简单,也是实现类似任务的常用方式。

它不应该在客户端上实现,因为你不能信任客户端。你会付出很多努力来实施各种安全检查和机制,但它们很可能不会是 100% 安全的。另一方面,服务器端解决方案在设计上完全安全

【讨论】:

【参考方案3】:

你可以在php中使用usleep函数

等待 2 秒 睡眠(20000); http://php.net/manual/en/function.usleep.php

时间以微秒为单位

【讨论】:

请更好地阅读 OP 的问题。 usleepsleep 相同,它只接受微秒而不是秒作为参数。

以上是关于如何将 php 函数延迟 2 分钟?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决主从复制延迟?

如何使用 PowerShell 在系统重新启动后延迟 10 分钟在 Windows 任务计划程序中安排任务?

RabbitMQ如何实现延迟队列?

如何将函数延迟 X 个刻度?

PHP 延迟执行

Lua 程序延迟