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

时间:2018-08-28 12:10:28

标签: php html postgresql curl web-development-server

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

curl脚本在获取数据时运行良好。但是它大约每10秒获取一次数据。我想要的是每分钟获取一次数据。

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

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

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

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

编辑

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

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

2)我需要保持浏览器窗口打开,以便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> 

2 个答案:

答案 0 :(得分:2)

我会说使用cronjob是执行此操作的最佳方法! (假设您正在使用Linux发行版) 在cron中,您可以选择间隔,但是如果您愿意,可以使用sleep函数将命令运行几秒钟:

$(function () {
    $("select").click(function () {
        var validOption = $("select > option[value='Orange']");
        if (validOption[0].selected) {
            $("#hiddenDiv").show();
        } else {
            $("#hiddenDiv").hidde();
        }
    });
});

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

答案 1 :(得分:0)

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

使用查找内容= 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>