PHP:在第一个脚本运行5分钟后执行脚本
我正在制作一个PHP站点,我希望有一个脚本(当你点击一个按钮时),它可以向我的MySQL数据库添加一些信息(我可以自己完成这部分),并在5分钟后执行一个脚本。也许这并不难,但用谷歌搜索像这样的东西很难。你在找吗PHP:在第一个脚本运行5分钟后执行脚本,php,mysql,events,Php,Mysql,Events,我正在制作一个PHP站点,我希望有一个脚本(当你点击一个按钮时),它可以向我的MySQL数据库添加一些信息(我可以自己完成这部分),并在5分钟后执行一个脚本。也许这并不难,但用谷歌搜索像这样的东西很难。你在找吗 睡眠是一个非常糟糕的主意。客户端浏览器必须等待5分钟才能完成请求 依我看,你想怎么做是不可能的 您应该创建另一个脚本,用于查询数据库并检查是否有新数据(并且在成功获取数据时执行此任务)。cron应该每N分钟运行一次此脚本。您可以在数据库中实现一个队列,在其中添加要执行的“命令”,并存储何
睡眠是一个非常糟糕的主意。客户端浏览器必须等待5分钟才能完成请求 依我看,你想怎么做是不可能的
您应该创建另一个脚本,用于查询数据库并检查是否有新数据(并且在成功获取数据时执行此任务)。cron应该每N分钟运行一次此脚本。您可以在数据库中实现一个队列,在其中添加要执行的“命令”,并存储何时执行此命令。然后有一个每分钟运行一次的cron作业,检查所说的队列,看是否是执行某个命令的时候了。这是一个相当困难的任务。 我喜欢这样的东西:
具体时间不会是5分钟,而是5到7分钟(如果您选择每2分钟启动一次脚本)。这样行吗?我想最好的办法是:在按钮上单击“保存作业”以在数据库中运行,并按作业应运行的时间保存作业。编写一个小守护进程,每10/5/2秒获取一个应该执行的新作业并执行它们
编辑:顺便说一句,使用cron检查要执行的新作业更好,但前提是您有一个小型网站,并且不需要对作业进行负载平衡。我这样做的方法是在两个脚本之间运行cron作业
您可以分叉进程,在子分叉中,在执行第二个脚本之前先休眠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...
“return;”很重要,因为脚本的其余部分将执行第二次(即在子脚本中),除非它在那里。我建议使用Javascript而不是PHP执行计时器 在用户的$\u会话中放置一个时间戳,以指示他们何时启动事件,然后在五分钟后让Javascript调用浏览器
PHP仍然需要知道开始时间(以防止用户通过调整Javascript超时来入侵游戏),但它本身不需要进行任何倒计时、睡眠或类似操作。如果您在unix机器上:
exec("echo 'php script.php' | at now +5 minutes");
这将安排php script.php
命令在5分钟后运行
我正在制作一个基于浏览器的游戏,如果有人想建造一座大楼,我希望它能在*分钟内完成 考虑到这是您的实际目标,我建议只保存带有时间戳的原始建筑 我知道你用PHP标记了你的问题,但我不想包括在PHP中处理mysql查询的所有开销,特别是因为我不知道你喜欢如何执行查询或使用什么框架,所以这里有一些伪代码来处理这个“构建建筑物”任务: 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)');
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();')
my_buildings.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)');
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();')
user\u id=当前用户['id']
已完成的建筑物=查询('从建筑物b中选择*
左外部连接b上的建筑类型t。建筑类型id=t.id
其中DATE_ADD(b.created_at,INTERVAL t.construction_time SECOND)NOW();)
希望这有帮助 有人问起这个目的,你的回答是:
“我正在制作一个基于浏览器的游戏,如果有人想建造一座大楼,我希望它能运行*分钟,然后完成” 实际上,您不需要为执行此操作计时。通过将buildStartedAt和buildFinishedAt存储为构建模式的一部分,您可以在一次运行中完成这一切
现在,也许你想让建筑在完工时有一个漂亮的动画,那么你只需在前端做所有这些,但如果时间戳在建筑完成日期之前,那么确保不能对建筑做任何有意义的事情,以避免潜在黑客的欺骗。
sleep
将阻止;OP没有明确提到它,但它听起来更像是一个非阻塞解决方案的问题。不是真的,我希望它执行另一个脚本。按钮调用process.php,process.php必须在5分钟后执行other.php。想象一下。。。当然,你不能在网页的同一个脚本中这样做。但是,您可以在服务器后台运行5分钟后,通过sleep函数从scriptOfWebBrowser.php调用另一个脚本ActionAfters.php,这样您就不需要任何cron或其他任何东西,对用户来说也不是问题……这次操作的目的是什么?添加了哪些需要这种置换的信息?我正在制作一个基于浏览器的游戏,如果有人想建造一座建筑物,我希望它能在*分钟后完成。这一评论对我们理解您试图实现的目标以及如何帮助您大有帮助。我想说的是,已经给出的很多答案都试图实现一些完全不同的东西