Периодически извлекайте данные с удаленного сервера, используя curl - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь получить данные JSON с удаленного сервера с помощью curl и сохранить их в базе данных. Данные на удаленном сервере обновляются каждую минуту.

Сценарий 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, но мне нужно развернуть ее на сервере под управлением Ubuntu.

EDIT

У меня есть еще 2 вопроса о моем коде:

1) Как я уже говорил в OP выше, curl постоянно извлекает данные из источника, как будто работает бесконечный цикл. Это поведение curl по умолчанию, или мне нужно выполнить некоторую настройку для извлечения данных, например, один раз через это?

2) Мне нужно держать окно браузера открытым, чтобы завиток начал извлекать данные. Не работает, если веб-страница не открыта. Это стандартное поведение 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 голосов
/ 28 августа 2018

Если вы не хотите использовать cron job и если вы хотите использовать эту страницу напрямую через браузер, используйте этот код.

использовать метатег для обновления через пять минут, используя 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> 
0 голосов
/ 28 августа 2018

Я бы сказал, что использование cronjob - лучший способ сделать это! (Если вы используете дистрибутив Linux) В cron вы выбираете интервал, но при желании вы можете использовать функцию режима сна, чтобы задержать выполнение команды на несколько секунд:

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

РЕДАКТИРОВАТЬ: ваш пост не совсем ясно, какую операционную систему вы используете, я предложил использовать cronjob в своем посте, но это доступно только для систем Linux. Планировщик задач Windows можно использовать, если вы запускаете его из системы Windows, хотя я не уверен, как он работает, поэтому я не смогу помочь вам настроить его.

...