【发布时间】:2018-12-06 01:29:20
【问题描述】:
我有一个带有工作订单系统的 Wordpress 网站。现在我想制作一个 Android 应用,在下单后立即在列表视图中显示每个新订单。
这两天我想到了以下解决方案:
- 每 10 秒发出一次简单的 HTTP GET 请求
- 网络套接字
- MySQL 二进制日志 + Pusher Link
- 服务器发送事件
我的想法(使用 LAMP 堆栈):
- 简单的 HTTP 请求显然是最无效的解决方案。
- 我发现 websockets 和 Apache 不能很好地协同工作。
- 感觉很老套,如果可以的话,我想避免任何第三方服务。
4。看起来这对我来说是最佳方式,但是根据我的经验,Apache/php 和服务器发送事件存在一些问题。
我尝试实现一个简单的演示脚本,但我不明白为什么其中一些使用无限 while 循环来保持连接打开而另一些则没有。
这是example without a loop 和here 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