2016-10-10 8 views
2

新しいリクエストが発生した場合、長いポーリングを行い、AJAXコールによって開始されたスクリプトを停止しようとしています。 これは、AJAXリクエストによって開始されたPHPコードです:

$checker = $_SESSION['checker'] = time(); 

while (true) { 
    if ($checker != $_SESSION['checker']) { 
      $out = 'new one started'; 
      break; 
    } 

    if (some other condition) { 
      $out = 'smth done or happend'; 
      break; 
    } 

    sleep(3); 
} 

echo $out; 

私はいくつかのログをやっていると私は($_SESSION['checker']変数を変更する必要があります)同じスクリプトを実行しますので、もし$_SESSION['checker']は、更新されていないように見えます以前に起動したスクリプトのwhileループには、古い$_SESSION['checker']が表示されます。なぜ更新されないのですか?

+1

「すべてが意味を持ちたい」と私は疑います。 –

+0

こんにちは、あなたの質問を明確にしてください。 – brclz

+0

私はあなたがPHPではなく、ajaxの部分でそれを破壊すべきだと思います。現在のhttprequestで.abort()を試して停止し、別のものを開始してください。 –

答えて

3

PHPセッションは、既定では同時読み込み/書き込み操作をサポートしていません。つまり、1つのリクエストから$ _SESSION配列を更新すると、 PHPリクエストを既に実行しているには伝播しません。

解決方法は、ファイルを作成し、そのファイルのfilemtime(ファイル変更時刻)を監視することです。ファイルが更新されるのを見るたびに、別のプロセスtouchが編集されていることがわかります。

実装例:あなたが最初のプロセスは、whileループ内のコードは、時間がかかりすぎてはならないことを意味し、終了する必要がありますどのように迅速に応じて、頻繁に変更するためにテストする必要があります

$filename = ".test_file"; 

// Update the file modification time to the current time 
touch($filename); 
$modificationTime = filemtime($filename); 

while ($modificationTime === filemtime($filename) { 
    // Do stuff, file modification time is not yet updated. 
} 

// The file modification time has been updated! 

注意。

+0

ファイルのfilemtimeのチェックが遅れるという問題はありません。それは、もう一方のプロセスが既に実行されており、それが魔法の働きをしており、互いに干渉する可能性があるからです。 –

+0

他のプロセスが開始されるとすぐにプロセスを停止する必要があります。このスクリプトはそれを行いますが、すべての 'while'だけです。しばらくの間にプロセスに数秒かかる場合は、最初のコールが停止する前に2回目のajaxコールが開始されてから数秒かかります。これは、両方のコールが最初のコールが停止する前に少量の時間実行されることを意味します。これは、開発者の希望に応じて潜在的に問題となる可能性があります。 –

+0

ファイルをどのように変更するのですか?既に実行中の操作(停止したい操作)が1つあります。キャッチの種類22 :) – user3195616

1

これは、PHP側ではなく、ajax側から対応したい場合があります。 現在のhttpリクエストは、中止などで中断することができます。

var xhr = $.ajax({ 
    type: "POST", 
    url: "file.php", 
    data: "parameter=input&type=test", 
    success: function(msg){ 
     alert("Data Saved: " + msg); 
    } 
}); 

//kill the request 
xhr.abort() 
+0

これは実際にPHPプロセスを終了させますか? – Pete

+0

良い質問、私はそう考えない* 'abort()はブラウザの観点からリクエストをキャンセルするが、リクエストが既にサーバに正常に送られていれば、サーバはまだすべてを処理する。ブラウザはサーバーから返されたすべてのデータ/応答に応答します。 '* –

+0

PHPプロセスを終了しません。サーバー上で実行されているPHPスクリプトはそのままで、ブラウザは待機しません – user3195616

関連する問題