2017-09-12 8 views
0

私は、20億のオーダー(何百万行ものデータを集める)という非常に大きなクエリをMySQLデータベースに持っています。クエリはAJAX呼び出しを介して実行され、PHPスクリプトからの応答を待ってデータを収集します。Javascript/AJAXから大規模なmysqliクエリを実行しているPHPスクリプトを中断する

JSクエリ:

$.ajax({ 
     url: "../largeQuery.php", 
     type: "POST", 
     success: function (data) { 
      alert(data); 
     } 
}); 

largeQuery.php:

$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); //these are set elsewhere 
$largeQuery = 'I am some super long query'; 
$response = $mysqli->query($largeQuery); 
print_r($response); 

ユーザーがページの内容を変更しないと$responseデータが必要なくなった場合には、次のページがロックされていますMySQLはまだ$largeQueryをフェッチしており、完了するまで別のクエリを処理できないため、$largeQueryが終了します。

$thread_id = $mysqli->thread_idからスレッドIDを取得してから$mysqli->kill($thread_id)で終了することができますが、現在実行中のPHPコードを更新するにはどうすればよいですか?

+0

あなたはこれをチェックしましたか? – Dekel

+0

たぶんあなたは "大規模なクエリ"を修正し、より速く実行させるべきです。 –

+1

セッションを開いていると思われる場合はブラウザに応じて4つ(または6)の同時接続が可能です。セッションを解放するためにクエリを開始した後に 'session_write_close'を呼び出してみてください。また不要になった場合は 'XMLHttpRequest'を取り消します。 – andrew

答えて

1

MySQLはあなたのPHPをブロックしていません。問題はセッションです。クエリ中、PHPはクエリを待つでしょう、そしてセッションはPHPが終了するのを待っています、その間セッションはロックされ、PHPはクエリが完了し、PHPの実行が終了するまで新しいリクエストを受け付けません。

クエリーを実行する前にセッションを閉じることができますが、それ以降はセッションを読み書きしないようにする必要があります(またはクエリー後に再度開くこともできます)。

しかし、このシナリオでは、SQLを低速のクエリで溢れさせ、さらに遅くする可能性があります。それを最適化しようとする。

この場合に小さな記事があります:http://php.net/manual/en/function.ignore-user-abort.php:http://konrness.com/php5/how-to-prevent-blocking-php-requests/

+0

私はあなたがまだ問題なしで書面でそれを閉じた後にセッションから読むことができると思います – andrew

+0

私はあなたが読むことができないと思う(そしてあなたはできないはずです)。閉じた後、他のリクエストによってセッション内のデータが変更され、セッションを再度開くことなく古いデータを読み取ることができます。 – CappY

+0

ありがとう、その記事は多くの助けになりました! – JDog131

関連する問題