我有一个问题,当我创建实时订阅时,我会收到来自不同 Instagram IP 地址的重复通知。我进行了设置,以便在收到通知时使用 min_tag_id 设置发送最新更新请求。我将它存储在我的数据库中以用于下一个请求。我并不总是得到重复,但是当我这样做时,关于通知的所有内容都是相同的(时间,对象,changed_aspect),除了我可以告诉它们与我列出两个几乎相同的请求的调试输出不同......唯一不同的信息是不同的 IP 地址,REQUEST_TIME_FLOAT 相差大约 1/10 秒。它们甚至具有相同的 HTTP_X_HUB_SIGNATURE 值。
我的一般算法是:
process_subscription_update($data){
# get old min_id
$min_tag_id = mysqli_fetch_object(mysqli_query($dbconnecti,sprintf("SELECT instagram_min_id+0 as instaid FROM xxxx WHERE xxxx=%d",$_GET['xxxx'])));
$min_id = $min_tag_id->instaid;
# make api call
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, 'https://api.instagram.com/v1/tags/'.$_GET['tag'].'/media/recent?client_id=xxxx&min_tag_id='.$min_id.($min_id==0?'&count=1':''));
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$result = curl_exec($ch);
curl_close($ch);
$i = json_decode($result);
if ($min_id == $i->pagination->min_tag_id) { exit; }
# write new min_id to db
record_min_id($i->pagination->min_tag_id);
$data2 = $i->data;
foreach($data2 as $d) {
process_instagram($d);
}
// debugging output: ****************
$file = file_get_contents($_SERVER['DOCUMENT_ROOT'].'instagram/updates.txt');
$foo = "\n";
foreach($_SERVER as $key_name => $key_value) {
$foo .= $key_name . " = " . $key_value . "\n";
}
$fulldata = $file . "\n\n\n" . $result . "\n min_id = " . $min_id . $foo;
$fulldata .= "\nTIME:".$data[0]->time;
$fulldata .= "\nOBJECT:".$data[0]->object;
$fulldata .= "\nCHANGED_ASPECT:".$data[0]->changed_aspect;
file_put_contents($_SERVER['DOCUMENT_ROOT'].'instagram/updates.txt', $fulldata);
// end debugging output *************
}
我想避免在 process_instagram 函数中检查我的数据库中是否已经存在 instagram 消息 ID,并且重复项仅相隔 1/10 秒,我不知道这是否可行。
还有其他人经历过这个和/或有解决方案吗?