PHP:在第一个脚本运行5分钟后执行脚本

时间:2011-01-23 15:01:05

标签: php mysql events

我正在制作一个php网站,我希望有一个脚本(当你点击一个按钮时)向我的mysql数据库添加一些信息(我可以自己做这部分)并且它执行一个脚本5分钟后来。也许这并不难,但事先感谢谷歌这样的事情很难。

11 个答案:

答案 0 :(得分:6)

睡眠是一个非常糟糕的主意。客户端浏览器必须等待5分钟才能完成请求!!!

在我看来,不可能像你想的那样去做。

您应该创建另一个查询数据库的脚本并检查是否有新数据(并且成功获取时会执行该作业)。这个脚本应该每隔N分钟由cron运行。

答案 1 :(得分:6)

相当艰难。 我会选择这样的东西:

  1. 您的原始脚本会向数据库添加一条记录,其中包含执行时间
  2. 另一个脚本包含需要在5分钟后执行的操作 - 但只有在上面提到的db记录包含至少5分钟之前的时间戳时才启动它(希望它足够清楚,我很难说这个)
  3. 设置crontab,每隔X分钟(可能是2分钟)执行第二个脚本。
  4. 它不会是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作业。

  1. 第一个脚本在数据库表中设置一个值。
  2. cron作业执行第二个脚本。每一分钟或什么不是。
  3. 第二个脚本检查脚本1设置的数据库值,以决定是否完全运行。

答案 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)

你在找那个吗?

sleep php.net