每次通过AJAX在PHP中满足条件时都可以回收数据

时间:2017-10-03 09:11:34

标签: php jquery html ajax

POS软件会以文本方式覆盖订单。我正在尝试制作一个显示订单的厨房显示器。 我的php脚本从该文本文件中读取... 使用sleep(1);每1秒进行一次比较,以检查新订单是否已到达。

<?php

$f1 = fopen("G:/order.txt", 'r');    
$firstLine1 = fgets($f1);
fclose($f1);

sleep(1);

$f2 = fopen("G:/order.txt", 'r');
$firstLine2 = fgets($f2);

fclose($f2);

if($firstLine1 != $firstLine2) {    
    $fh = fopen("G:/order.txt", "r");    
    echo "<div>";        
    while ($line = fgets($fh)) {        
        echo ($line);
    }
    fclose($fh);
    echo "</div>";
}    
?>

使用Ajax我每1小时运行一次该脚本。

<script>
function loadDoc(){
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
    $("p").before(this.responseText);
}
};
xhttp.open("GET", "order.php", true);
xhttp.send();
}
window.setInterval(function(){
loadDoc()
}, 1);
</script>

问题在于为每个新订单创建了大约50个Div,它应该只有1个。

每个订单1分。

请帮帮我,我搞砸了。

1 个答案:

答案 0 :(得分:0)

我认为这会更好。由于您正在重复执行ajax调用以运行相同的脚本,因此在每次运行期间重复读取文件没有多大意义。另外,你的比较并没有提到上次脚本运行时发生的事情,这与ajax请求的疯狂频率相结合,导致无休止的重复结果。

相反,将每次运行时检索到的订单ID与上次运行时检索到的订单ID进行比较。此外,您需要增加请求之间的间隔,否则您将淹没您的服务器,并且还存在并发问题的风险,其中您的下一个请求尝试在上一个请求完成之前开始(不要忘记ajax调用以异步方式运行)

<强> PHP

alert()

<强>的JavaScript

<?php
session_start(); //enable sessions
$f1 = fopen("G:/order.txt", 'r');    
$firstLine = fgets($f1);

//check whether a previous order ID has been stored during this session.
if (isset($_SESSION["lastOrderID"])) {
  //if the order ID in the file is the same as the last stored one in the session, don't send any data to the client
  if ($firstLine == $_SESSION["lastOrderID"]) 
  {  
    echo "";
    fclose($f1);
    die();
  }
}

echo "<div>";
echo $firstLine;      
while ($line = fgets($f1)) {
  echo ($line);
}
echo "</div>";

//store the last order ID in the session
$_SESSION["lastOrderID"] = $firstLine;
fclose($f1);

请记住,这只会在会话期间有效 - 即通常仅在浏览器窗口打开时,或直到会话超时。如有必要,您可以谷歌如何增加会话超时。如果你需要比这更持久的东西(即要记住会话之间的最后一个订单ID),那么你应该使用另一个文本文件或数据库来记录这些信息,而不是会话。

我还想在此重申我的担忧,即你的POS软件看起来过于简单化,至少基于问题中给出的细节,而且对于审计和其他相当明显的目的,坚持下去可能是有意义的使用数据库的所有订单的历史记录,而不是每次输入新订单时覆盖文本文件。