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分。
请帮帮我,我搞砸了。
答案 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软件看起来过于简单化,至少基于问题中给出的细节,而且对于审计和其他相当明显的目的,坚持下去可能是有意义的使用数据库的所有订单的历史记录,而不是每次输入新订单时覆盖文本文件。