首页 > 解决方案 > 如何近乎实时地从 Wordpress 网站(LAMP 堆栈)获取数据到 Android 应用程序?

问题描述

我有一个带有工作订单系统的 Wordpress 网站。现在我想制作一个 Android 应用程序,一旦下订单,它就会在列表视图中显示每个新订单。

这两天我想到了以下解决方案:

  1. 每 10 秒一次的简单 HTTP GET 请求
  2. 网络套接字
  3. MySQL二进制日志+推送链接
  4. 服务器发送事件

我的想法(使用LAMP堆栈):

  1. 简单的 HTTP 请求显然是最无效的解决方案。
  2. 我发现 websockets 和 Apache 不能很好地协同工作。
  3. 感觉很hacky,如果可以的话,我想避免任何第三方服务。

4 . 看起来这对我来说是最佳方式,但是根据我的经验,Apache/php 和服务器发送事件存在一些问题。

我试图实现一个简单的演示脚本,但我不明白为什么其中一些使用无限 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);

    }
?>

我很感谢我能得到的每一个建议!:)

编辑:
主要想法是经常检查我的 MySQL 数据库是否有新条目,如果存在新订单,请妥善格式化数据并通过 SSE 将信息发送到我的 android 应用程序。
我已经找到了在 android 上接收 SSE 的库,主要问题出在服务器端。

标签: phpandroidwordpressapacheserver-sent-events

解决方案


根据您的问题,我认为您可以实施 SSE - 服务器发送事件,它是 HTML5 标准的一部分。它是一种从服务器到客户端的单向通信。它需要 html/javascript 和后端语言,例如 PHP。

客户端将订阅事件,当订阅启动并运行时,服务器将从输入数据发送任何更新。作为标准,更新将每 3 秒可见一次。不过这个是可以调整的。

我建议您首先创建一个基本功能的网络浏览器客户端作为开始。何时以及如果它按您预期的那样工作,只有这样您才能判断将客户端构建为应用程序的努力。

您可能需要在客户端添加功能,例如启动/停止订阅。

我对用户不推荐(服务器发送的事件)和 Apache 组合的理解是缺乏控制有多少打开的连接以及什么可以控制持续关闭连接的需要。这可能会导致服务器性能问题。

似乎使用例如 node.js 不会导致该问题。

以下是一些开始链接:

医疗器械网络:

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

带有服务器发送事件的流更新:

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


推荐阅读