每次只能从一个客户端执行PHP方法

每次只能从一个客户端执行PHP方法,php,mysql,xml,apache,Php,Mysql,Xml,Apache,我编写了一个类,它从xml文件同步数据库,并通过电子邮件报告任何警报 xml包含产品价格和库存 仅当xml filetime比上次同步的新时,才会执行该方法 这是第一个问题。我怀疑服务器(随机)出于某种原因更改了文件时间,因为虽然没有生成新的xml文件,但同步方法仍在运行 xml文件从本地服务器导出,并通过ftp客户端上载到远程服务器 (同步返回) 第二个问题是,在交通繁忙的时间,do_sync方法会运行多次,因为我会在电子邮件中多次收到警报 我理解为什么会多次调用它,所以我现在创建了一个标志s

我编写了一个类,它从xml文件同步数据库,并通过电子邮件报告任何警报

xml包含产品价格和库存

仅当xml filetime比上次同步的新时,才会执行该方法

这是第一个问题。我怀疑服务器(随机)出于某种原因更改了文件时间,因为虽然没有生成新的xml文件,但同步方法仍在运行

xml文件从本地服务器导出,并通过ftp客户端上载到远程服务器 (同步返回)

第二个问题是,在交通繁忙的时间,do_sync方法会运行多次,因为我会在电子邮件中多次收到警报

我理解为什么会多次调用它,所以我现在创建了一个标志syncing_,以防止执行

错误在于该标志存储在db中,并且由于第一个调用必须更新db,所以所有其他调用都可以运行该方法

<?php class Sync extends Model{
  public function __construct(){

    parent::__construct();
       $this->syncing_now = $this->db->get($syncing_now);
 }//END constructor

 public function index(){
    if($this->determine_sync()){
    $this->do_sync();
}else{
    return FALSE;
}
 }


 public function determine_sync(){
  if( filemtime($file) <= $this->db->last_sync() or !$this->$syncing_now){
    return FALSE;
  }else{
    return TRUE;
  }
}



public function do_sync(){
   $this->db->update('syncing_now', TRUE);
    //the sync code works fine..
   $this->db->update('syncing_now', FALSE);
}




}

我建议您使用存储同步的表

id | md5_of_xml_file | synched_date
现在使用,以确保一次只有一个进程可以处理您的同步文件

锁定同步表。如果锁定失败,请退出

if (!mysqli_query('LOCK TABLES synchronisations  WRITE')) {
  die();//quit;
}
$md5Hash = md5_file('yourXmlSyncFile.xml');
$result = null;
$stmt= $mysqli->prepare("SELECT md5_of_xml_file FROM synchronisations 
  WHERE md5_of_xml_file=?");
$stmt->bind_param("s", $md5Hash);
$stmt->execute();
$stmt->bind_result($result);
$stmt->fetch();
$stmt->close();

if ($result == $md5Hash) {
  die();//quit;
}
如果已经存在包含XML同步文件哈希的条目,请退出

if (!mysqli_query('LOCK TABLES synchronisations  WRITE')) {
  die();//quit;
}
$md5Hash = md5_file('yourXmlSyncFile.xml');
$result = null;
$stmt= $mysqli->prepare("SELECT md5_of_xml_file FROM synchronisations 
  WHERE md5_of_xml_file=?");
$stmt->bind_param("s", $md5Hash);
$stmt->execute();
$stmt->bind_result($result);
$stmt->fetch();
$stmt->close();

if ($result == $md5Hash) {
  die();//quit;
}

否则,请尝试同步该文件。如果这样做有效,请添加一个条目,存储您执行此操作的时间以及用于同步的文件的散列。

您现在是否也在第一次调用时使用同步?请检查
锁定表
并使用表进行同步?谢谢你的快速回复。。。锁表解决了多重执行和md5文件时间问题。。。我要试试看,虽然我认为它已经解决了。再次感谢。最后一个问题:若xml文件很大,md5会影响性能吗?它对我来说适用于大文件,对其他人也适用<代码>md5_文件
相当快。但是,你可以在这个问题上读到:“HgTaz考虑接受我的答案,所以这个问题不会得到更多的不必要的关注。