Как получить данные с веб-сайта Wordpress (LAMP stack) в приложение Android практически в реальном времени? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть веб-сайт Wordpress с системой рабочих заказов.Теперь я хочу создать приложение для Android, которое отображает каждый новый заказ в виде списка , как только заказ был сделан.

Последние два дня я думал о следующих решениях:

  1. Простые запросы HTTP GET каждые 10 секунд
  2. Веб-сокеты
  3. Бинарный журнал MySQL + Pusher Ссылка
  4. События, отправленные сервером

Мои мысли (работа со стеком LAMP ):

  1. Простые HTTP-запросы, очевидно, являются наиболее неэффективным решением.
  2. Я понял, что веб-сокеты и Apache не работают вместе.
  3. Чувствую себя довольно взволнованно, и я хочу избегать любых сторонних сервисов, если смогу.

4 .Похоже, что это оптимальный путь для меня, однако есть некоторые проблемы с Apache / php и Server Sent Events из того, что я испытал.

Я пытался реализовать простой демонстрационный скрипт, но я не понимаю, почему некоторые из них используют бесконечный цикл while, чтобы держать соединение открытым, а другие нет.Вот пример без цикла и здесь с бесконечным циклом , также здесь
В дополнение к этому, когда я тестировал вариант с бесконечнымцикл, вся моя страница не будет загружаться из-за этой функции sleep ().Похоже, что весь сервер зависает, когда я его использую.У кого-нибудь есть идеи как это исправить?Или у вас есть другие предложения?

Это код, который вызывает проблемы (скопировано с здесь ) и добавил отсутствующую фигурную скобку:

<?php

    // make session read-only
    session_start();
    session_write_close();

    // disable default disconnect checks
    ignore_user_abort(true);

    // set headers for stream
    header("Content-Type: text/event-stream");
    header("Cache-Control: no-cache");
    header("Access-Control-Allow-Origin: *");

    // Is this a new stream or an existing one?
    $lastEventId = floatval(isset($_SERVER["HTTP_LAST_EVENT_ID"]) ? $_SERVER["HTTP_LAST_EVENT_ID"] : 0);
    if ($lastEventId == 0) {
        $lastEventId = floatval(isset($_GET["lastEventId"]) ? $_GET["lastEventId"] : 0);
    }

    echo ":" . str_repeat(" ", 2048) . "\n"; // 2 kB padding for IE
    echo "retry: 2000\n";

    // start stream
    while(true){

        if(connection_aborted()){
            exit();
        }

        else{

            // here you will want to get the latest event id you have created on the server, but for now we will increment and force an update
            $latestEventId = $lastEventId+1;

            if($lastEventId < $latestEventId){

                echo "id: " . $latestEventId . "\n";
                echo "data: Howdy (".$latestEventId.") \n\n";
                $lastEventId = $latestEventId;
                ob_flush();
                flush();

            }

            else{

                // no new data to send
                echo ": heartbeat\n\n";
                ob_flush();
                flush();

            }

        }

        // 2 second sleep then carry on
        sleep(2);

    }
?>

I'mблагодарен за каждый совет, который я могу получить!:)

РЕДАКТИРОВАТЬ:
Основная идея состоит в том, чтобы часто проверять мою базу данных MySQL на наличие новых записей и, если есть новый заказ, форматировать данные красиво и отправлять информацию черезSSE для моего приложения для Android.
Я уже нашел библиотеки для получения SSE на Android, основная проблема на стороне сервера.

1 Ответ

0 голосов
/ 06 декабря 2018

Исходя из вашего вопроса, я думаю, вы могли бы реализовать отправленные события SSE - Server, что является частью стандарта HTML5.Это односторонняя связь между сервером и клиентом.Он нуждается в html / javascript и языке бэкэнда, например, PHP.

Клиент будет подписываться на события, а когда подписка запущена и работает, сервер будет отправлять любые обновления из входных данных.Стандартно обновление будет отображаться каждые 3 секунды.Это можно настроить, хотя.

Я бы порекомендовал вам сначала создать базовый функционирующий веб-браузер-клиент для начала.Когда и если это работает так, как вы ожидаете, только тогда вы будете судить об усилиях по созданию клиента как приложения.

Возможно, вам потребуется добавить функции на стороне клиента, такие как запуск / остановкаподписка.

Мое понимание пользователей, которые не рекомендуют сочетание (отправленные сервером события) и Apache, заключается в отсутствии контроля над количеством открытых соединений и тем, что постоянно контролирует необходимость закрытия соединений.Это может привести к серьезным проблемам с производительностью сервера.

Кажется, использование, например, node.js не вызовет этой проблемы.

Вот несколько начальных ссылок:

MDN:

https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events

Потоковые обновления с отправленными сервером событиями:

https://www.html5rocks.com/en/tutorials/eventsource/basics/

...