如何将 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 的问题。usleep
与sleep
相同,它只接受微秒而不是秒作为参数。以上是关于如何将 php 函数延迟 2 分钟?的主要内容,如果未能解决你的问题,请参考以下文章