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

时间:2014-04-28 08:49:31

标签: php mysql xml apache

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

xml包含产品价格和库存。

仅当xml文件时间比同步的最后一个文件时间更新时,才会执行该方法。

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

xml文件从本地服务器导出,并通过ftp客户端上传到远程服务器 (SyncBack)

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

我理解为什么它被多次调用,所以我创建了一个标志syncing_now,以防止执行。

错误是标志存储在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);
}




}

那么我该怎样做才能只运行一次该方法,以及如何找出文件时间发生变化的原因?

感谢所有人的帮助。

1 个答案:

答案 0 :(得分:0)

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

id | md5_of_xml_file | synched_date

现在使用LOCK_TABLES以确保一次只有一个进程可以处理您的同步文件。

锁定同步表。如果锁定它们失败,只需退出。

if (!mysqli_query('LOCK TABLES synchronisations  WRITE')) {
  die();//quit;
}

如果已存在具有XML同步文件哈希的条目,则只需退出。

$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;
}

否则,尝试同步文件。如果可行,请添加一个条目,存储时间以及用于同步的文件的散列。