Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:在第一个脚本运行5分钟后执行脚本_Php_Mysql_Events - Fatal编程技术网

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

PHP:在第一个脚本运行5分钟后执行脚本,php,mysql,events,Php,Mysql,Events,我正在制作一个PHP站点,我希望有一个脚本(当你点击一个按钮时),它可以向我的MySQL数据库添加一些信息(我可以自己完成这部分),并在5分钟后执行一个脚本。也许这并不难,但用谷歌搜索像这样的东西很难。你在找吗 睡眠是一个非常糟糕的主意。客户端浏览器必须等待5分钟才能完成请求 依我看,你想怎么做是不可能的 您应该创建另一个脚本,用于查询数据库并检查是否有新数据(并且在成功获取数据时执行此任务)。cron应该每N分钟运行一次此脚本。您可以在数据库中实现一个队列,在其中添加要执行的“命令”,并存储何

我正在制作一个PHP站点,我希望有一个脚本(当你点击一个按钮时),它可以向我的MySQL数据库添加一些信息(我可以自己完成这部分),并在5分钟后执行一个脚本。也许这并不难,但用谷歌搜索像这样的东西很难。

你在找吗


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

依我看,你想怎么做是不可能的


您应该创建另一个脚本,用于查询数据库并检查是否有新数据(并且在成功获取数据时执行此任务)。cron应该每N分钟运行一次此脚本。

您可以在数据库中实现一个队列,在其中添加要执行的“命令”,并存储何时执行此命令。然后有一个每分钟运行一次的cron作业,检查所说的队列,看是否是执行某个命令的时候了。

这是一个相当困难的任务。 我喜欢这样的东西:

  • 原始脚本会向数据库中添加一条记录,其中包含其执行时间
  • 另一个脚本包含需要在5分钟后执行的操作,但是只有在上面提到的db记录包含至少5分钟前的时间戳时才会启动它(希望这足够清楚,我在编写这个时遇到了问题)
  • 将crontab设置为每X分钟(可能是2分钟)执行第二个脚本

  • 具体时间不会是5分钟,而是5到7分钟(如果您选择每2分钟启动一次脚本)。这样行吗?

    我想最好的办法是:在按钮上单击“保存作业”以在数据库中运行,并按作业应运行的时间保存作业。编写一个小守护进程,每10/5/2秒获取一个应该执行的新作业并执行它们


    编辑:顺便说一句,使用cron检查要执行的新作业更好,但前提是您有一个小型网站,并且不需要对作业进行负载平衡。

    我这样做的方法是在两个脚本之间运行cron作业

  • 第一个脚本在数据库表中设置一个值
  • cron作业执行第二个脚本。每一分钟都有
  • 第二个脚本检查脚本1设置的数据库值,以决定是否完全运行

  • 您可以分叉进程,在子分叉中,在执行第二个脚本之前先休眠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或其他任何东西,对用户来说也不是问题……这次操作的目的是什么?添加了哪些需要这种置换的信息?我正在制作一个基于浏览器的游戏,如果有人想建造一座建筑物,我希望它能在*分钟后完成。这一评论对我们理解您试图实现的目标以及如何帮助您大有帮助。我想说的是,已经给出的很多答案都试图实现一些完全不同的东西