2016-12-07 11 views
0

私は現在、PDOといくつかの数と合計を計算するためにMySQLデータベースを要求しています。このプロセスには時間がかかることがあり、突然別のページを参照したい場合、ユーザーはブラウザの前で立ち往生したままになることがあります。PDO非ロック照会:可能?

私は、PDOを使用してMySQLクエリを開始することができるかどうかを調べるために、クエリ結果が利用可能になるか、ユーザーがページを出るまでループを入力してください(connection_aborted())ユーザーは依然として接続されており、MySQLクエリを中止します。

<?php 

$objPDOStatement = $objPDO->prepare(" 
    SELECT count(*) 
    FROM my_huge_table 
    WHERE <<complex_condition>> 
"); 

$objPDOStatement->execute($arrParameters); 

while (
    (connection_aborted() == 0) 
    && (! $objPDOStatement->resultsAvailable() 
) { 
    usleep(10000); 
} 

if (connection_aborted() == 0) { 
    echo "RESULTS"; 
} else { 
    $objPDOStatement->cancel(); 
} 

これは可能ですか?もしそうなら、どうですか?私は、ユーザーが現在のスクリプト/ページを終了するためにWebサーバー(PHP)を待つ必要がないようにこれをしたいと思います。次回要求されたスクリプト/ページを提供する前に、MySQLが結果を返すのを待たないようにしてください。

ありがとうございました。

+0

これはいくつかの方法で実行できます。つまり、Webソケットを使用してサーバーに接続し、結果を待つか、要求に応じてタスクキューに追加し、タスクランナーで実行して、結果が準備完了かどうかをブラウザーで確認します。 – JimL

+0

RabitMQ、ActiveMQ、Amazon Simple Queue Service(Amazon AWSでアプリケーションがホストされている場合)、MQTTなどのキューサーバーを使用することもできます。 キュー内でリクエストを送信すると、ワーカーがタスクを引き継ぎますが、アプリはワーカーの実行とは独立しています。使用しているキューシステムによっては、Workerが実行を終了したかどうかを随時尋ねることができ、Workerが終了したときに結果を収集できます。 – Dragos

+0

@JimLでは、問題はクライアント側ではなくサーバー側です。PHPは、別のクライアントが現在実行されている間に、指定されたクライアントに対して新しい要求を処理しません。ここでは、Ajax呼び出しが使用され、中止されても、PDOがデータセットを返すまで、SQL文を含むPHPスクリプトは実行され続けます。 – MaxAuray

答えて

0

非同期クエリは、mysqliでのみ利用できますが、PDOでは利用できません。

しかし、あなたは通常、AJAX呼び出しによって簡単に何が達成されますか?

+0

それは問題ではありません。リクエスト*はAjax呼び出しですでに処理されています。ただし、Ajax呼び出しが中止されても、PDOが現在のジョブを終了しない限り、PHPスクリプトは実行を継続します。したがって、Apacheはキュー内の次の要求を処理するためにPHPが現在のプロセスを終了するのを待ちます。だからこそ私はそうしたいのです:ユーザーがまだ接続されているかどうかを確認し、Apacheキューのロックを解放しない場合は、現在のプロセスをただちに終了させることです。 – MaxAuray

関連する問題