【问题标题】:Run PHP Script once at a specific time在特定时间运行一次 PHP 脚本
【发布时间】:2020-10-24 19:10:20
【问题描述】:

我正在制作某种浏览器游戏。

我已经有了类似“建造房子”的东西,我在其中创建了一个 mysql 事件,将房子的 db 条目从 5 更改为在特定时间说 10 - 例如在 5 分 25 秒内。到目前为止非常简单。

问题是当我想在例如两个人之间打架时6 分 12 秒....我必须在 6 分 12 秒内运行一个 php 脚本来计算他们当时的部队和战斗本身,然后进行数据库更改。

我无法“预先计算”那个人将部队派往另一方时的战斗,因为在那 6 分 12 秒内,对方可以购买更多的部队或防御……

我希望你明白我想做什么。

mysql 无法从事件或触发器运行 php 脚本...

并且每秒运行一次 cron 作业只是为了检查这一秒是否发生了战斗,我猜服务器负载太多了..即使不是,大多数提供商只允许每 5 分钟或 2 分钟一次的 cron .. .

有什么方法可以实现我的目标吗?

编辑: 也许我只是留在mysql-events,但在计算战斗时我必须做很多事情......比如使用随机数,添加百分比,做一些查询,也许使用数组,给玩家写消息......我不认为这一切都可以在 mysql 中实现

【问题讨论】:

  • 你知道'即'意思是“换句话说”,与“例如”相反,意思是“例如”?
  • 当你尝试的时候不要说外语我猜:D ...我会改变它
  • 好吧,我想拉丁语是一门外语;-)

标签: php mysql events time cron


【解决方案1】:

相信可以通过事件来实现

https://dev.mysql.com/doc/refman/8.0/en/events-overview.html

球员桌

CREATE TABLE player (
    id INT PRIMARY KEY AUTO_INCREMENT,
    Name VARCHAR(50) NOT NULL,
    Attack NOT NULL,
    Defense NOT NULL,
    Health NOT NULL,
    TroopCount NOT NULL
);

战斗桌

CREATE TABLE battle (
    id INT PRIMARY KEY AUTO_INCREMENT,
    attackerid INT NOT NULL,
    defenderid INT NOT NULL,
    desc VARCHAR(255) NOT NULL,
    battledate DATETIME NOT NULL
);

CREATE EVENT 语句在 PHP 应用程序中创建这些:

CREATE EVENT IF NOT EXISTS battle_001
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 6 MINUTE + INTERVAL 12 SECONDS
DO
  
  INSERT INTO battle(battledate,desc)
  # Create Select to do the math
  SELECT    NOW()
            , #replace with battle algorithm both the attacker and defender values available for the math
  
    FROM player AS attacker
    INNER Join player AS defender
     ON defender.id = #replace with defenders id
    WHERE attacker.id = #replace with attackers id
  
  ;

【讨论】:

    【解决方案2】:

    cron 非常适合定期运行的脚本,但是如果您希望一次性(或两次)脚本在特定时间运行,您可以使用 unix 'at' 命令,您可以做到直接从 php 使用这样的代码:

    /**** * 使用 AT 命令调度命令 * * 为此,您需要确保允许 www-data 用户 * 使用 'at' 命令 - 在 /etc/at.deny 中检查 * * * 示例用法:: * * scriptat('/usr/bin/command-to-execute', '运行时间'); * 运行时间应采用以下格式:strftime("%Y%m%d%H%M", $unixtime) * **/

    function scriptat( $cmd = null, $time = null ) {
        // Both parameters are required
        if (!$cmd) {
            error_log("******* ScriptAt: cmd not specified");
            return false;
        }
        if (!$time) {
            error_log("******* ScriptAt: time not specified");
            return false;
        }
    
        // We need to locate php (executable)
        if (!file_exists("/usr/bin/php")) {
            error_log("~ ScriptAt: Could not locate /usr/bin/php");
            return false;
        }
    
        $fullcmd = "/usr/bin/php -f $cmd";
    
        $r = popen("/usr/bin/at $time", "w");
        if (!$r) {
            error_log("~ ScriptAt: unable to open pipe for AT command");
            return false;
        }
        fwrite($r, $fullcmd);
        pclose($r);
    
        error_log("~ ScriptAt: cmd=${cmd} time=${time}");
    
        return true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-07
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 2020-11-01
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多