我编写了一个类,它从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);
}
}
那么我该怎样做才能只运行一次该方法,以及如何找出文件时间发生变化的原因?
感谢所有人的帮助。
答案 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;
}
否则,尝试同步文件。如果可行,请添加一个条目,存储时间以及用于同步的文件的散列。