2017-10-03 23 views
0

POSソフトウェアは注文をテキストファイルに上書きします。私は注文を表示するキッチンディスプレイを作ろうとしています。 私のPHPスクリプトはそのテキストファイルから読み込みます... sleep(1);を使って1秒ごとに比較を行い、新しい注文が到着したかどうかを確認します。AJAXを介してPHPで条件が満たされるたびにエコーされる

<?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

_textファイルの注文_... POSは「Point of Sale」または「Piece of S ***」を表しますか?なぜデータベースはありませんか?とにかく、あなたのPHPスクリプトは各実行中にファイルから_once_を読み込み、以前の実行中に見つからなかった注文を返す必要があります(そのために、おそらくajaxクライアントは受け取った最後の注文のIDを伝える必要があります。あなたはSESSION変数を使うことができます)。そして、毎ミリ秒ごとにajaxコールを実行することは狂っています。前の呼び出しが完了する前に戻ることができないということは、サーバーの負荷が高くなり、並行処理の問題が発生することです。 – ADyson

+0

代わりに前回の呼び出しが完了するまで待ってから、setIntervalを使用せずにreadystatechangeコールバックから再度loadDoc()を呼び出してください。または、それを変更してより長い間隔(10秒、30秒?それは時間的に重要なこのデータが本当にあるかどうかに依存します) – ADyson

+0

私はプログラミングに新しいです、あなたはコードを書き換えてください。私はあなたに素晴らしいことができます! –

答えて

0

これはうまくいくと思います。同じスクリプトを実行するために繰り返しAjaxを呼び出すので、各実行中にファイルから繰り返し読み込むことはあまり意味がありません。さらに、比較してもスクリプトが実行された前回の状況を参照することはできません。これは、Ajaxリクエストの非常識な頻度と組み合わせれば、結果は無限に重複しています。

代わりに、各実行で取得した注文IDを、前回の実行で取得した注文IDと比較してください。また、リクエスト間の間隔を広げる必要があります。それ以外の場合は、サーバを急上昇させ、次のリクエストが開始される前に同時実行の問題が発生する危険性もあります(ajaxコールが非同期で実行されることを忘れないでください) 。すなわち、通常はちょうど限りブラウザウィンドウがあるとのために - これが唯一のセッションの間に動作することを念頭に置い

PHP

<?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); 

はJavaScript

<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(loadDoc, 10000); //refresh every 10 seconds. You can decrease the interval if you like, but don't make it so short that it regularly starts another request before the previous one has completed. You can use your browser's network tools to see how the long requests normally take, and use that to help you decide on a suitable value. Leave some headroom for the occasional slowdown. 
</script> 

ベア開いているか、セッションがタイムアウトするまで。必要に応じて、セッションのタイムアウトを増やす方法をGoogleに伝えることができます。これより永続的なもの(セッション間の最後の注文IDを記憶する)が必要な場合は、セッションではなく、この情報を記録するために別のテキストファイルまたはデータベースを使用する必要があります。

POSソフトウェアは少なくとも質問の詳細に基づいて、過度に単純化されていると思います。監査やその他のかなり明白な目的のためには、新しい注文が入力されるたびにテキストファイルを上書きするのではなく、データベースを使用してすべての注文の履歴レコードを保持します。

+1

ありがとうございますあなたは素晴らしいです....それは魅力のように働いた –

+0

問題はありません。私は編集をしました、ちょうどタイプミス。 – ADyson

関連する問題