使用 curl 定期从远程服务器获取数据

Fetch data from a remote server periodically using curl

我正在尝试使用 curl 从远程服务器获取 JSON 数据并将其保存在数据库中。远程服务器上的数据每分钟更新一次。

curl 脚本 运行 可以很好地获取数据。但它大约每 10 秒获取一次数据。我想要的是它一分钟获取一次数据。

我搜索了 SO,发现 cronjob 和 windows 任务调度程序是使用 curl 为计划作业提供的解决方案。我的问题是我不需要 运行 包含 curl 的网页,因此它可能会开始从服务器获取数据,但我必须每分钟读取一次数据。

因为数据在每分钟的第 5 秒更新,例如 9:10:05 -> 9:11:05 ->9:12:05 ->... 一种选择是使用 cronjob 或 windows 调度程序到 运行 网页,例如第 3 秒并关闭于例如第 7 秒,因此每分钟读取一个值。但这对我来说似乎不是一个好的或可靠的解决方案,或者是吗?

我的问题是如何使用 curl 每隔一分钟从远程服务器读取一次数据。是否有一些编程解决方案或使用 cronjob/windows 任务调度程序是选择?

我正在 Windows 工作站上进行开发,但我需要将其部署到服务器 运行ning Ubuntu。

编辑

我还有 2 个关于我的代码的问题:

1) 正如我在上面的 OP 中所述,curl 不断从源中获取数据,就像它是一个无限循环 运行ning。这是 curl 的默认行为还是我需要做一些配置来获取数据,例如一次通过它?

2) 我需要保持浏览器 window 打开,以便 curl 开始获取数据。如果网页未打开,则不起作用。它是 curl 的默认行为还是它也可以 运行 作为后端作业,所以包含它的网页不应该一直保持打开状态?


这是我的代码:

Index.PhP

HTML + PHP + 数据输入显示的JS

Connect.PhP

数据库连接

RequestData.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 中,你 select 间隔,但如果你愿意,你可以使用睡眠功能来延迟命令 运行 几秒钟:

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

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

如果您不想使用 cron 作业并且想通过浏览器直接使用此页面,请使用此代码。

使用元标记在五分钟后使用 find content = 300 刷新

 <!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="300">
<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>