我正在制作一个php网站,我希望有一个脚本(当你点击一个按钮时)向我的mysql数据库添加一些信息(我可以自己做这部分)并且它执行一个脚本5分钟后来。也许这并不难,但事先感谢谷歌这样的事情很难。
答案 0 :(得分:6)
睡眠是一个非常糟糕的主意。客户端浏览器必须等待5分钟才能完成请求!!!
在我看来,不可能像你想的那样去做。
您应该创建另一个查询数据库的脚本并检查是否有新数据(并且成功获取时会执行该作业)。这个脚本应该每隔N分钟由cron运行。
答案 1 :(得分:6)
相当艰难。 我会选择这样的东西:
它不会是5分钟,而是5到7之间(如果您选择每2分钟启动一次脚本)。那会吗?
答案 2 :(得分:4)
您可以在数据库中实现一个队列,在其中添加要执行的“命令”,并在时存储以执行此命令。然后有一个每分钟运行一次的cron作业并检查所述队列以查看是否该执行某个命令。
答案 3 :(得分:4)
如果你在unix盒子上:
exec("echo 'php script.php' | at now +5 minutes");
这将调度php script.php
命令在5分钟后运行。
答案 4 :(得分:1)
我正在制作一个基于浏览器的游戏,如果有人想要建造一个需要*分钟然后完成的建筑,我想要它。
考虑到这是您的实际目标,我建议您只使用时间戳保存原始建筑物。
我知道你用PHP标记了你的问题,但我不想包含在PHP中处理mysql查询的所有开销,特别是因为我不知道你喜欢如何执行查询或你是什么框架suing,所以这里有一些伪代码来处理这个“建筑物”任务:
<强> build.php 强>
building_type_id = sanitize(POST['id'])
user_id = current_user['id']
query('INSERT INTO buildings (user_id, building_type_id, created_at)
VALUES (' + user_id + ', ' + building_type_id + ', CURRENT_TIME)');
<强> my_buildings.php 强>
user_id = current_user['id']
completed_buildings = query('SELECT * FROM buildings b
LEFT OUTER JOIN building_types t ON b.building_type_id = t.id
WHERE DATE_ADD(b.created_at, INTERVAL t.construction_time SECOND) < NOW();')
under_construction = query('SELECT * FROM buildings b
LEFT OUTER JOIN building_types t ON b.building_type_id = t.id
WHERE DATE_ADD(b.created_at, INTERVAL t.construction_time SECOND) > NOW();')
希望这有帮助!
答案 5 :(得分:0)
恕我直言,最好的方法是:在按钮上单击保存作业以在数据库中运行它应该运行的时间。编写一个小守护进程,每10/5/2秒获取一个应该执行的新作业并执行它们。
编辑:使用cron检查要执行的新作业的想法更好,但只有当你有一个小网站并且你不需要为这些作业进行负载平衡时。答案 6 :(得分:0)
我这样做的方法是在两个脚本之间运行一个cron作业。
答案 7 :(得分:0)
你可以分叉进程并在子fork中,在执行第二个脚本之前休眠5分钟。我已经测试了这个,看起来子进程即使在父进程完成后仍然会执行。像
这样的东西//initial code
$pid = pcntl_fork(); //fork the process
if ($pid==0) // if in the child
{
exec("sleep 300; php second_process.php"); //sleep for 5 minutes and execute second script
return; // or exit
}
// rest of initial script...
“回归”很重要,因为脚本的其余部分将执行第二次(即在孩子中),除非它在那里。
答案 8 :(得分:0)
我建议用Javascript而不是PHP来做计时器。
在用户的$ _SESSION中添加一个时间戳,以指示他们何时启动该事件,然后在五分钟后将Javascript回调给浏览器。
PHP仍然需要知道开始时间(以防止用户通过调整Javascript超时来破解游戏),但它不需要实际执行任何倒计时或睡眠或类似的东西本身。
答案 9 :(得分:0)
有人问过这样做的目的,你的回答是: “我正在制作基于浏览器的游戏,如果有人想要建造建筑物,我希望它需要 * 分钟然后完成”
您实际上不需要为此计算执行时间。您可以通过将 buildStartedAt 和 buildFinishedAt 作为构建模式的一部分存储在一次运行中完成所有操作。
现在也许您希望建筑物在完成时有一个漂亮的动画,然后您只需在前端执行所有这些操作,但如果时间戳在 buildFinishedAt 时间之前,请确保对建筑物没有任何意义潜在黑客的无效作弊。
答案 10 :(得分:-3)
你在找那个吗?