我有这个脚本在页面加载后2分钟执行数据库查询。我无法使用 sleep()函数,因为它不会让页面正确加载。
我找到了这段代码:
$now = time();
while ($now + 120 > time()) {
// do nothing
}
//other actions here
但它只是不加载页面。我怎样才能做到这一点?提前谢谢!
编辑:我希望在观看视频两分钟后奖励用户。如果用户提前关闭页面,则不会执行任何操作。
答案 0 :(得分:4)
假设您需要将查询结果返回到页面,为什么不进行异步调用。让页面加载,在javascript中等待两分钟,然后使用ajax命中你的php服务器并提取查询结果。
使用Write-EventLog
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
在新编辑的上下文中,仅使用严格的服务器端实现此目的的正确方法是使用成功流式传输整个视频的视频流服务(无需用户提前退出或暂停),运行归功于用户的后期操作脚本。但是,如果您不熟悉视频流服务,则设置其他方法会更复杂。考虑到您的安全需求,成本和hackery的后果,我会尽量使用您认为容易且最舒适的实现。
答案 1 :(得分:0)
创建一个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%安全的。另一方面,服务器端解决方案在设计上完全安全,无需任何努力。
答案 2 :(得分:-2)