gpt4 book ai didi

php - 如何近乎实时地将数据从 Wordpress 网站(LAMP 堆栈)获取到 Android 应用程序?

转载 作者:行者123 更新时间:2023-11-30 05:11:35 24 4
gpt4 key购买 nike

我有一个带有工作订单系统的 Wordpress 网站。现在我想制作一个 Android 应用程序,它会在 ListView 中在下订单后立即显示每个新订单。

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

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

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

  1. 简单的 HTTP 请求显然是最无效的解决方案。
  2. 我发现 websockets 和 Apache 不能很好地协同工作。
  3. 感觉很老套,如果可以的话,我想避免使用任何第 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 的库,主要问题出在服务器端。

最佳答案

根据您的问题,我认为您可以实现 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/

关于php - 如何近乎实时地将数据从 Wordpress 网站(LAMP 堆栈)获取到 Android 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53643306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com