【问题标题】:How to get data from Wordpress website (LAMP stack) to Android app in nearly realtime?如何几乎实时地从 Wordpress 网站(LAMP 堆栈)获取数据到 Android 应用程序?
【发布时间】:2018-12-06 01:29:20
【问题描述】:

我有一个带有工作订单系统的 Wordpress 网站。现在我想制作一个 Android 应用,在下单后立即在列表视图中显示每个新订单。

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

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

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

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

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

我尝试实现一个简单的演示脚本,但我不明白为什么其中一些使用无限 while 循环来保持连接打开而另一些则没有。 这是example without a loophere with an infinite loop,还有here
除此之外,当我使用无限循环测试变体时,由于那个 sleep() 函数,我的整个页面都不会加载。每当我使用它时,看起来整个服务器都会冻结。 有谁知道如何解决这个问题?或者您有其他建议吗?

那是导致麻烦的代码(从here复制)并添加了一个缺少的大括号:

<?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 的库,主要问题出在服务器端。

【问题讨论】:

  • 关键字:长轮询
  • 感谢您的建议,但使用 php 和 Apache 实现长轮询显然也涉及使用 sleep() 函数。所以我想我会在冻结网站时遇到同样的问题。或者我在这里错过了什么?使用 php 进行长轮询的可能示例:link

标签: php android wordpress apache server-sent-events


【解决方案1】:

根据您的问题,我认为您可以实施 SSE - 服务器发送事件,它是 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/

【讨论】:

  • 感谢您的回答。我知道服务器发送事件是什么,它们可能是解决我的问题的最佳方法。这就是我尝试实施它们的原因,正如我的问题中已经说明的那样。但是,由于 Apache 处理这些问题的方式,我可能不得不找到不同的解决方案。遗憾的是,使用 Node.js 不是一种选择,我必须坚持使用 LAMP 堆栈。必须有一个解决方案。我无法想象我是唯一遇到这种问题的人。
  • @Apocabal:我正在准备使用 Apache 和 PHP 的服务器发送事件解决方案。我的理解是,您可以创建一个驻留在 PHP 中的控制机制(假设您不包含数据库)。我已经启动并运行了解决方案,数据以 json 格式存储为外部文件。目前我从 3 个文件中获取流,我正在调查是否可能只创建一个打开的连接并让 3 个流共享该连接。我还将在前端添加打开/关闭流的可能性。
  • @Apocabal:您能否更具体地说明您的问题是什么?
  • 感谢您的努力。我需要从我的 MySQL 数据库中获取有关新订单的信息,所以不幸的是涉及到一个数据库。我相应地编辑了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2015-03-18
相关资源
最近更新 更多