2017-09-13 7 views
1

現在、私は 'sniffer.php'という名前の単一のPHPファイルを呼び出そうとしています。 JavaScriptファイルを使用してこの非同期を実行しています。私が現在持っている問題は、PHPコードでは、(ページがロードされているように動作するように)ランダムにスリープ関数を追加したことです。その問題は2つ以上の関数がそのページを呼び出すことであり、ページの1つが最初に終了してからもう1つのリクエストが停止するまで待機します。 EG:5秒間スリープ状態になり、6秒間スリープ状態になります。最初のものは5秒で完了し、次のものは11秒で終了します。私が探しているのは5秒後に終了し、次は1秒後に終了するということです。私はそれが問題を引き起こしているだけの "スリープ"か、スリープのためにファイルがロックされているかどうかはわかりません。単一のファイルへの複数のHTTPリクエスト

ご協力いただきありがとうございます。

は私のPHPファイルは、次のようになります。

$c = rand(2,10); 
sleep($c); 
$html .= $c; 
echo json_encode(array('html'=>$html,'status'=>1)); 
exit; 

私のjavascriptのクラスは次のようになります。

var path = '/'; 

var polling = { 
    add : function(name, obj) { 
     this[name] = new xAjax(obj); 
     return this; 
    } 
}; 

function xAjax(options) { 

    var consti = { 
    }; 
    var defaults = { 
     url: path + 'sniffer.php', 
     method: 'POST', 
     responseType: 'json', 
     async: true, 
     timeout: 30000, 
     success: function(response) {console.log(response);}, 
     done: function() {}, 
     beforeSend: function() {}, 
     error: function(e) {console.log(e);}, 
     abort: function() {} 
    }; 
    var settings = Object.assign({}, defaults, options, consti); 
    var xhr = null; 

    this.run = function() { 
     xhr = new XMLHttpRequest(); 

     settings.beforeSend(); 
     xhr.responseType = settings.responseType; 
     xhr.open(settings.method, settings.url, settings.async); 
     xhr.timeout = settings.timeout; 
     xhr.onreadystatechange = function() { 
      if (xhr.readyState == XMLHttpRequest.DONE) { 
       if (xhr.status === 200) { 
        settings.success(xhr.response); 
       } else { 
        settings.error(xhr.response); 
       } 
       settings.done(); 
       xhr = null; 
      } 
     }; 
     xhr.send(); 
     return this; 
    }; 

    this.abort = function() { 
     xhr.abort(); 
     xhr = null; 
     settings.abort(); 
     return this; 
    }; 

    this.isRunning = function() { 
     return xhr != null; 
    }; 

    this.set = function(options) { 
     settings = Object.assign({}, defaults, options, consti); 
     return this; 
    }; 
} 

マイ作成/ sniffer.phpに呼び出す:

polling.add('x'); 
polling.x.run(); 
polling.add('y'); 
polling.y.run(); 
+1

PHPセッションは同時リクエストをロックします。 PHPコードでセッションを開始しているかどうかを確認してください。 – jorgonor

+0

スリープは現在のリクエストだけでなく、現在のセッションの実行を遅らせます。 – ADyson

+0

あなたは正しいです。私はセッションを開始していた。私はそれをバイパスする方法がないと仮定しています。それが睡眠以外の何か(EG SQLプロセス)だったら、それでもセッションロックですか? – Deadweight

答えて

1

これをセッションのために起こっている。スクリプトに時間がかかると、睡眠の有無にかかわらず起こります。

セッションを開始するとどうなりますか? PHPは、セッションデータが最新であり、変更されないことを確認しなければなりません。また、変更されたデータが次の実行時に利用可能になるようにする必要があります。

スクリプトは、それがどこか開いている間のセッションを開こうとした場合、最初のスクリプトは非常によく、まだセッション情報を変更される可能性があるためので、ロックは、あります。最初のスクリプトがセッションを閉じると、次のスクリプトはそれを保持し続けることができます。

あなたは書き込みのためにセッションを閉じるにはsession_write_close()を呼び出すことができますので、ロックを外します。セッションが閉じている間も値は引き続きアクセスできますが、後続のスクリプトが何か変更される前の値になります(2番目のスクリプトが最初のスクリプトが終了する前に何か変更があった場合、そのスクリプトはわかりません)。あなたがセッションに新しいデータを書き込む場合、それは保存されません、あなたのスクリプトが なしsession_write_closeを(コールする必要が終了した後も、...

documentationからセッションデータは通常)が格納されています、同時データ書き込みを防ぐためにセッションデータがロックされているので、1つのスクリプトのみがセッションで動作します。

あなただけではありませんように。また、それはそうです:

あなたがまだアクティブなセッションを持っている 場合は、それに)(睡眠で何かをデバッグ面白い楽しみを持つことができます。たとえば、 ajaxリクエストを作成するページ。ajaxリクエストはサーバー側のイベントをポーリングします( はすぐには返されません)。

ajax関数がsession_write_close()を実行しないと、外側の ページがハングしているように見え、新しいタブで他のページを開くと、 も停止します。

+0

これはたくさん説明します、ありがとうございます。 – Deadweight

関連する問題