PHP通过curl获取数据并插入SQL数据库

PHP通过curl获取数据并插入SQL数据库,php,sql,curl,Php,Sql,Curl,关于通过CURL-GET创建客户端数据库本地副本的代码,我有几个问题 情况: 我需要通过curl创建带有1.5mil记录的本地副本数据库 Url地址正在生成脚本。Url地址包括 参数自,LASTID,访问\u令牌,如https://CLIENT_SERVER_URL/sync?last_id=LAST_ID&since=ISO_8601_TIMESTAMP&access_token=TOKEN 一个curl调用生成100条记录 对客户端服务器的访问限制为每分钟60次 每天运行并同步数据库的脚本

关于通过CURL-GET创建客户端数据库本地副本的代码,我有几个问题

情况:

  • 我需要通过curl创建带有1.5mil记录的本地副本数据库
  • Url地址正在生成脚本。Url地址包括 参数自,LASTID,访问\u令牌,如
    https://CLIENT_SERVER_URL/sync?last_id=LAST_ID&since=ISO_8601_TIMESTAMP&access_token=TOKEN
  • 一个curl调用生成100条记录
  • 对客户端服务器的访问限制为每分钟60次
  • 每天运行并同步数据库的脚本
我有什么问题需要建议

<?php 
// select DB
$servername = "MY_DATABASE";
$username = "USER";
$password = "PASS";
$dbname = "DB_NAME";

// Create connection
$corporateBodies = new mysqli($servername, $username, $password, $dbname);

$sql = "SELECT id FROM my_table ORDER BY id DESC LIMIT 1";
$lastID = $corporateBodies->query($sql);
$lastID = mysqli_fetch_array($lastID);

$base = "CLIENT_SERVER_URL/";
$since = "GENERATED_TIMESTAMP";
$accessToken = "ACCESS_TOKEN";
$url = $base . "sync?last_id=" . $lastID["id"] . "&since=" . $since . "&access_token=" . $accessToken;

//function httpGet($url) {
    $crl = curl_init($url); 
    curl_setopt($crl,CURLOPT_URL,$url);
    curl_setopt($crl,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($crl,CURLOPT_HEADER, false);
    curl_setopt($crl, CURLOPT_TIMEOUT, 60); 
    $reply =curl_exec($crl);

    curl_close($crl);

    //decoding the json data
    $decoded_data = json_decode($reply, true);

    $insertArray = $corporateBodies->prepare(
    "INSERT INTO my_table (
        id,
            cin,
            tin,
            vatin,
            name,
            formatted_address,
            street,
            reg_number,
            building_number,
            postal_code,
            municipality,
            country,
            established_on,
            terminated_on,
            vatin_paragraph,
            registration_office,
            registration_number,
            formatted_street,
            street_number,
            created_at,
            updated_at
    )
    VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    );

    $corporateBodies->query("START TRANSACTION");

    foreach ($decoded_data as $row) {
    $bind = $insertArray->bind_param('iiissssisisssssssssss',
            $row['id'],
            $row['cin'],
            $row['tin'],
            $row['vatin'],
            $row['name'],
            $row['formatted_address'],
            $row['street'],
            $row['reg_number'],
            $row['building_number'],
            $row['postal_code'],
            $row['municipality'],
            $row['country'],
            $row['established_on'],
            $row['terminated_on'],
            $row['vatin_paragraph'],
            $row['registration_office'],
            $row['registration_number'],
            $row['formatted_street'],
            $row['street_number'],
            $row['created_at'],
            $row['updated_at']
    );

    $exec = $insertArray->execute();

    // Close the prepared statement
    $insertArray->close();

    $commit = $corporateBodies->query("COMMIT");

    $corporateBodies->close();
?>
  • 问题1.)BFU问题(对不起),我如何以这种格式生成时间戳
    2016-06-22T23%3A34%3A20.169659Z
    ?时间戳必须生成
    当前日期-1天

  • 问题2.)如何创建循环以脚本重复生成新的URL和URL 是否将记录存储在数据库中

  • Q3.)如何将通话限制为每分钟仅60次

  • Q4.)如何向数据库中插入条目,以便 不存在时插入,或存在时更新

我的PHP代码

<?php 
// select DB
$servername = "MY_DATABASE";
$username = "USER";
$password = "PASS";
$dbname = "DB_NAME";

// Create connection
$corporateBodies = new mysqli($servername, $username, $password, $dbname);

$sql = "SELECT id FROM my_table ORDER BY id DESC LIMIT 1";
$lastID = $corporateBodies->query($sql);
$lastID = mysqli_fetch_array($lastID);

$base = "CLIENT_SERVER_URL/";
$since = "GENERATED_TIMESTAMP";
$accessToken = "ACCESS_TOKEN";
$url = $base . "sync?last_id=" . $lastID["id"] . "&since=" . $since . "&access_token=" . $accessToken;

//function httpGet($url) {
    $crl = curl_init($url); 
    curl_setopt($crl,CURLOPT_URL,$url);
    curl_setopt($crl,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($crl,CURLOPT_HEADER, false);
    curl_setopt($crl, CURLOPT_TIMEOUT, 60); 
    $reply =curl_exec($crl);

    curl_close($crl);

    //decoding the json data
    $decoded_data = json_decode($reply, true);

    $insertArray = $corporateBodies->prepare(
    "INSERT INTO my_table (
        id,
            cin,
            tin,
            vatin,
            name,
            formatted_address,
            street,
            reg_number,
            building_number,
            postal_code,
            municipality,
            country,
            established_on,
            terminated_on,
            vatin_paragraph,
            registration_office,
            registration_number,
            formatted_street,
            street_number,
            created_at,
            updated_at
    )
    VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    );

    $corporateBodies->query("START TRANSACTION");

    foreach ($decoded_data as $row) {
    $bind = $insertArray->bind_param('iiissssisisssssssssss',
            $row['id'],
            $row['cin'],
            $row['tin'],
            $row['vatin'],
            $row['name'],
            $row['formatted_address'],
            $row['street'],
            $row['reg_number'],
            $row['building_number'],
            $row['postal_code'],
            $row['municipality'],
            $row['country'],
            $row['established_on'],
            $row['terminated_on'],
            $row['vatin_paragraph'],
            $row['registration_office'],
            $row['registration_number'],
            $row['formatted_street'],
            $row['street_number'],
            $row['created_at'],
            $row['updated_at']
    );

    $exec = $insertArray->execute();

    // Close the prepared statement
    $insertArray->close();

    $commit = $corporateBodies->query("COMMIT");

    $corporateBodies->close();
?>

您的时间戳与ISO8601完全匹配,
Z
而不是
+00:00
,并且微秒精度,因此创建时间戳-1天可能是

$stamp=(new DateTime('-1 day',new DateTimeZone("UTC")))->format('Y-m-d\TH:i:s.u\Z');
quote
如何创建一个循环,以脚本形式重复生成新URL并将记录存储在数据库中?
如果您想知道如何创建循环

for($i=0;$i<60;++$i){/*code in here will be looped 60 times!*/}
for循环中的代码将以每分钟60次的最大速度运行

quote
Q4。)如何在数据库中插入条目,以便在条目不存在时插入该条目,或在条目存在时更新该条目?

同样,这取决于数据库。但是,假设使用MySQL或MariaDB数据库,则将该值设为唯一列,并生成一条
INSERT或REPLACE
语句,如

INSERT OR REPLACE INTO tbl(`value`,`last_update_time`)
VALUES('FOO',NOW());

对客户端服务器的访问限制为每分钟60次
-您的意思是
每秒最多1次curl请求
?或者你的意思是你可以在一秒钟内同时执行60个curl请求,然后等待60秒,然后再执行另一个60?@hanshenrik每分钟60次访问,每秒一个curl请求那么要求是
每秒最多1个请求
-不是
每分钟最多60个请求
-如果是
每分钟60个请求
,您可以在10秒内执行60个请求,然后等待50秒,然后再次运行。@hanshenrik客户端的确切命令是:“每个IP地址的API访问限制为每分钟60次。”好的,谢谢。但是我在哪里完成了?我的脚本返回通知:未定义变量:finishedsomewhere在循环开始之前,put
$finished=false,当您的循环完成同步数据并且没有更多的循环时,写入
$finished=true;中断