php - 使用 curl 定期从远程服务器获取数据
问题描述
我正在尝试使用 curl 从远程服务器获取 JSON 数据并将其保存在数据库中。远程服务器上的数据每分钟更新一次。
curl 脚本在获取数据时运行良好。但它大约每 10 秒获取一次数据。我想要的是它每分钟获取一次数据。
我搜索了SO,发现cronjob和windows task scheduler是为使用curl的计划作业提供的解决方案。我的问题是我不需要运行包含 curl 的网页,因此它可能会开始从服务器获取数据,但我必须每分钟读取一次数据。
因为数据会在每分钟的第 5 秒更新,例如 9:10:05 -> 9:11:05 ->9:12:05 ->... 一种选择是使用 cronjob 或 windows 调度程序来运行网页,例如第 3 秒并在第 7 秒关闭,因此每分钟读取一个值。但这对我来说似乎不是一个好的或可靠的解决方案,或者是吗?
我的问题是如何使用 curl 每分钟从远程服务器读取一次数据。是否有一些编程解决方案或使用 cronjob/windows 任务调度程序是选择?
我正在 Windows 工作站上进行开发,但我需要将其部署在运行 Ubuntu 的服务器上。
编辑
我对我的代码还有 2 个问题:
1)正如我在上面的 OP 中所说,curl 不断地从源中获取数据,就像它是一个无限循环运行一样。这是 curl 的默认行为还是我需要做一些配置来获取数据,例如一次通过它?
2)我需要保持浏览器窗口打开,以便 curl 开始获取数据。如果网页没有打开,它就不起作用。它是 curl 的默认行为还是它也可以作为后端作业运行,因此包含它的网页不应该一直保持打开状态?
这是我的代码:
索引.PhP
HTML + PHP + JS 用于数据输入和显示
连接.PhP
数据库连接
请求数据.PhP
<!DOCTYPE html>
<html lang="en">
<head>
<title>Weather Data</title>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
</head>
<body>
<h2>Connect.php</h2>
<div>
<?php
require("Connection.php");
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://cors.io/?http://api.holfuy.com/live/?s=759&pw=h1u5l4kka&m=JSON&tu=C&su=m/s",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"Cache-Control: no-cache"
),
));
$response = curl_exec($curl);
$Wdata = json_decode($response, true);
$tem = $Wdata["temperature"];
$hum = $Wdata["humidity"];
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
// Here code to save $response into database;
echo $response;
echo "<br>";
echo $tem;
echo "<br>";
echo $hum;
}
try{
$sql = "INSERT INTO weatherdata (humidity, temprature)
VALUES ('".$tem."','".$hum."')";
echo "<meta http-equiv='refresh' content='0'>";
($conn->query($sql));
//$conn = null;
}
catch(PDOException $e)
{
}
?>
</div>
</body>
</html>
解决方案
我会说使用 cronjob 是最好的方法!(假设您使用的是 linux 发行版)在 cron 中选择时间间隔,但如果您愿意,可以使用 sleep 功能将命令运行延迟几秒钟:
*/1 * * * * sleep 5; mycommand
^^ ^^
every minute five seconds
编辑:您的帖子似乎并不清楚您正在运行哪种操作系统,我建议在我的帖子中使用 cronjob 但这仅适用于 linux 系统。如果您从 Windows 系统运行它,则可以使用 Windows 任务计划程序,尽管我不确定它是如何工作的,所以我无法帮助您设置它。
推荐阅读
- javascript - 在单页应用程序中,当在 VueJs 中输入新数据时,如何在不重新加载页面的情况下重新加载 api
- python - Selenium Web 驱动程序:如何从元素中获取 url?
- kubernetes - 坚持尝试通过端口 8080 将 Angular 前端连接到 Java 后端
- r - GGplot scale_fill_manual() 意外行为
- javascript - 如何在 JSS 中指定 :focus 属性?
- office-js - 如何将键盘快捷键绑定到 Office 插件命令?
- python - 循环遍历python中的数据框列表并将每个df写入不同的excel表
- c# - 导航 - PopAsync() 似乎不起作用
- python - 在 scrapy 请求中放置请求 url 的 *params* 的位置
- android - 在 Android 中的行之间创建空格