Php 防止函数重复执行

Php 防止函数重复执行,php,automation,Php,Automation,我开发了一个在线游戏。它有一个名为automations.php的文件,负责所有类型的自动化任务,如训练士兵、处理战斗等。我的问题是有时函数会执行两次: class automation{ function automation(){ if(!file_exists('traning.txt')){ file_put_contents('traning.txt' ,''); $this->

我开发了一个在线游戏。它有一个名为
automations.php
的文件,负责所有类型的自动化任务,如训练士兵、处理战斗等。我的问题是有时函数会执行两次:

class automation{
        function automation(){
            if(!file_exists('traning.txt')){
                file_put_contents('traning.txt' ,'');
                $this->train_soldiers();
            }
        }
        private function train_soldiers(){@unlink('traning.txt');}

    }

正如您所看到的,
train_-soldies
应该只执行一次,但是当有很多在线播放器时,函数会执行两次(在两个不同的请求上)。我的问题是如何解决这个问题

您需要将文件保存在那里,以备将来的请求:

class automation{
    function automation(){
        if(!file_exists('traning.txt')){
            $fp = fopen('traning.txt', 'r+');
            if (flock($fp, LOCK_EX, false)) {
                $this->train_soldiers();
                flock($fp, LOCK_UN);
            }
            fclose($fp);
        }
    }
    private function train_soldiers(){/** do all training, don't remove the file**/}
}
这样,下一个请求将不会执行它


更新1:添加了群集功能。如果不起作用,请说明什么是不起作用的。

既然您使用文件作为锁定因子,我将使用
flock
,而不是创建和删除文件。@cmorrissey除了使用文件还有其他方法吗?如何使用这个函数?我不认为这是完全正确的。问题是请求是异步的。如果两个请求同时发出,则该方法将再次执行两次或更多次。这是因为不可能立即创建文件,总有一些延迟。如果某个其他请求此时正在检查文件,则会出现问题。@timviseée这是真的。我添加了群集功能以实现排他性。@AzizSaleh move
fclose($fp)在if之外statement@cmorrissey接得好。@AzizSaleh看起来很棒,升级不错。