Php 创建MDT/CAD系统的最佳方法是什么?(AJAX、SSE、WebSocket)

Php 创建MDT/CAD系统的最佳方法是什么?(AJAX、SSE、WebSocket),php,jquery,ajax,websocket,server-sent-events,Php,Jquery,Ajax,Websocket,Server Sent Events,大家好,可能正在阅读的人 我在一个网站的后端工作了很长时间,该网站提供了一个真实的移动数据终端和计算机辅助调度系统,用于在线角色扮演 我最初在setInterval上使用AJAX调用,每次刷新一部分页面100毫秒,在PHP端,它运行一个SQL查询 正如你们所能想象的,这已经被证明是非常缓慢的,最终甚至会弄乱会话,并以其他人的身份登录(不要问如何…我不知道)。我已经读过WebSocket和SSE,但我需要真正决定一种方法,并将整个系统转换过来,所以我的简单问题是 优化我的系统的最佳方法是什么?我可

大家好,可能正在阅读的人

我在一个网站的后端工作了很长时间,该网站提供了一个真实的移动数据终端和计算机辅助调度系统,用于在线角色扮演

我最初在setInterval上使用AJAX调用,每次刷新一部分页面100毫秒,在PHP端,它运行一个SQL查询

正如你们所能想象的,这已经被证明是非常缓慢的,最终甚至会弄乱会话,并以其他人的身份登录(不要问如何…我不知道)。我已经读过WebSocket和SSE,但我需要真正决定一种方法,并将整个系统转换过来,所以我的简单问题是

优化我的系统的最佳方法是什么?我可以举一两个实际的例子吗

非常感谢您的阅读

AJAX调用示例

JQuery

mdt.php

session_start();
包括(“../config.php”);
包括(“../backend.php”);
$panicsql=getConnection()->query(“从Status='PANIC'所在的单元中选择*);
如果($SQL->num\u rows>0){
echo“togglePanic('activate');”;
}否则{
echo“togglePanic('deactivate');”;
}
?>
终点站

更改状态:

可用
途中
现场
囚犯
无效。。 恐慌



PNC
报告

活跃事件
````
您的现有代码不需要太多更改就可以转移到服务器发送的事件

在前端,作为
success
处理程序的是
消息
事件处理程序。(本着一步一步重构的精神,您可以继续推动现成的HTML。)

您将间隔计时器放在前端,而它将移到后端

(这样做的结果是套接字保持打开状态,PHP进程现在持续运行,而不是每次轮询时启动和关闭。这可能会影响扩展到大量客户端。)

后端需要更改的是将当前拥有的内容封装在一个循环中,如下所示:

<?php
header("Content-Type: text/event-stream");
$prev_d = null;
while(true){
  $d = ...
  if($d != $prev_d){
    echo "data:".$d."\n\n";
    @ob_flush();@flush();
    $prev_d = $d;
    }
  usleep(100000); //Poll every 0.1 seconds
  }
<?php
header("Content-Type: text/event-stream");
$prev_sql = null;
while(true){
  $panicsql = getConnection()->query("SELECT * FROM Units WHERE Status='PANIC'");
  if($panicsql != $prev_sql){
    $d = json_encode($panicsql);
    echo "data:".$d."\n\n";
    @ob_flush();@flush();
    $prev_sql = $panicsql;
    }
  usleep(100000); //Poll every 0.1 seconds
  }

您可以将html部分移出mdt.php,让mdt.php充当数据服务器。这将大大加快速度,使代码更易于管理。谢谢大家!我会照张相的谢谢!这太神奇了,我现在不在家,但我会尽快尝试实施你的建议,并让你知道:)这似乎不起作用。。。客户端:
var source=neweventsource('mdt.php');source.onmessage=函数(e){console.log(e.data);}服务器端:
标题(“内容类型:文本/事件流”)$prev_sql=null;while(true){$panicsql=getConnection()->query(“从机器=2的单元中选择状态”);if($panicsql!=$prev_sql){$d=json_encode($panicsql);echo“data:”.$d.“\n\n”@ob_flush();@flush();$prev_sql=$panicsql;}usleep(100000)//每0.1秒轮询一次)
更正上述问题:它正在工作,SQL查询由于某种原因无法运行。但是,即使在工作时,它也需要很长时间才能输出任何内容。您需要进行一些故障排除,例如使用浏览器中的网络工具,或者使用curl,登录php脚本。如果你认为这个问题与这个问题不同,请考虑发表一个新的问题。请注意,我问题中的代码只是给您一个想法,不一定准备好运行。(例如,在第二个示例中,您需要定义
getConnection()
<?php
header("Content-Type: text/event-stream");
$prev_d = null;
while(true){
  $d = ...
  if($d != $prev_d){
    echo "data:".$d."\n\n";
    @ob_flush();@flush();
    $prev_d = $d;
    }
  usleep(100000); //Poll every 0.1 seconds
  }
<?php
header("Content-Type: text/event-stream");
$prev_sql = null;
while(true){
  $panicsql = getConnection()->query("SELECT * FROM Units WHERE Status='PANIC'");
  if($panicsql != $prev_sql){
    $d = json_encode($panicsql);
    echo "data:".$d."\n\n";
    @ob_flush();@flush();
    $prev_sql = $panicsql;
    }
  usleep(100000); //Poll every 0.1 seconds
  }