1

我正在使用来自提供商的 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

问题是

  1. 它太慢了。有些表有数百万条记录。(有更好的方法吗?)
  2. 有些表没有主键(我不能使用 INSERT INTO ... ON DUPLICATE KEY UPDATE)
  3. 对于记录删除(我不知道该怎么做;我认为删除所有记录并重新添加所有记录不是最好的主意)
4

0 回答 0