首页 > 解决方案 > 使用 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> 

标签: phphtmlpostgresqlcurlweb-development-server

解决方案


我会说使用 cronjob 是最好的方法!(假设您使用的是 linux 发行版)在 cron 中选择时间间隔,但如果您愿意,可以使用 sleep 功能将命令运行延迟几秒钟:

*/1 * * * *    sleep 5; mycommand 
^^                ^^
every minute   five seconds

编辑:您的帖子似乎并不清楚您正在运行哪种操作系统,我建议在我的帖子中使用 cronjob 但这仅适用于 linux 系统。如果您从 Windows 系统运行它,则可以使用 Windows 任务计划程序,尽管我不确定它是如何工作的,所以我无法帮助您设置它。


推荐阅读