gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:19:39 24 4
gpt4 key购买 nike

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

XML 包含产品价格和库存。

仅当 xml 文件时间比上次同步的文件时间新时,才会执行该方法。

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

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

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

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

错误在于该标志存储在数据库中,并且由于第一次调用必须更新数据库,因此所有其他调用都可以运行该方法。

<?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

现在使用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;
}

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

关于PHP 方法一次仅从一个客户端执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23336523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com