我正在使用来自提供商的 API 服务。API 用法看起来像 -
https://api.thesite.com/getTable1Records?offset=0
https://api.thesite.com/getTable2Records?offset=0
https://api.thesite.com/getTable3Records?offset=0
(不是真实地址)为每个 API 调用返回 1000 条记录的 JSON。
第一次,我检索了所有记录并将其保存到我的数据库服务器。用户搜索/处理在我的数据库服务器上运行。这是API服务提供商推荐的方式。
每当数据更改时,API 服务提供商都会更新他们的数据库。我不知道它们何时改变以及改变了什么。他们可能会添加新记录/更新现有记录/删除一些记录。我需要定期更新我的数据库(每周、每周一或每周 2 次都可以)。
这是我的 PHP 代码,它更新了一张表
// Update Table1
echo "STARTED@" . time() . "<br />\n"; // just for log
$offset = 0;
$username = "username";
$password = "password";
$url = "https://api.thesite.com/getTable1Records";
$c = curl_init();
do{
curl_setopt($c, CURLOPT_URL, "$url?offset=$offset" );
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($c, CURLOPT_USERPWD, "$username:$password");
$json = curl_exec($c);
$phpobj = json_decode($json);
$offset += 1000;
update($phpobj);
echo "1000UPDATED@" . time() . "<br />\n"; // just for log
}while( count($phpobj) > 0 );
echo "ENDED@" . time() . "<br />\n"; // just for log
function update($phpobj){
$host = "localhost";
$user = "root";
$pass = "";
$db = "theapitest";
$link = mysqli_connect($host, $user, $pass, $db);
for( $i=0; $i<count($phpobj); $i++){
$row = $phpobj[$i];
$id = mysqli_real_escape_string($link, $row->id);
$name = mysqli_real_escape_string($link, $row->name);
$query = "INSERT INTO `tablename` VALUES('$id', '$name')
ON DUPLICATE KEY UPDATE `name`='$name'";
mysqli_query($link, $query);
}
mysqli_close($link);
}//end function
问题是
- 它太慢了。有些表有数百万条记录。(有更好的方法吗?)
- 有些表没有主键(我不能使用 INSERT INTO ... ON DUPLICATE KEY UPDATE)
- 对于记录删除(我不知道该怎么做;我认为删除所有记录并重新添加所有记录不是最好的主意)