PHP通过curl获取数据并插入SQL数据库
关于通过CURL-GET创建客户端数据库本地副本的代码,我有几个问题 情况: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创建带有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
// 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次的最大速度运行
quoteQ4。)如何在数据库中插入条目,以便在条目不存在时插入该条目,或在条目存在时更新该条目?
同样,这取决于数据库。但是,假设使用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;中断代码>