私は現在、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が結果を返すのを待たないようにしてください。
ありがとうございました。
これはいくつかの方法で実行できます。つまり、Webソケットを使用してサーバーに接続し、結果を待つか、要求に応じてタスクキューに追加し、タスクランナーで実行して、結果が準備完了かどうかをブラウザーで確認します。 – JimL
RabitMQ、ActiveMQ、Amazon Simple Queue Service(Amazon AWSでアプリケーションがホストされている場合)、MQTTなどのキューサーバーを使用することもできます。 キュー内でリクエストを送信すると、ワーカーがタスクを引き継ぎますが、アプリはワーカーの実行とは独立しています。使用しているキューシステムによっては、Workerが実行を終了したかどうかを随時尋ねることができ、Workerが終了したときに結果を収集できます。 – Dragos
@JimLでは、問題はクライアント側ではなくサーバー側です。PHPは、別のクライアントが現在実行されている間に、指定されたクライアントに対して新しい要求を処理しません。ここでは、Ajax呼び出しが使用され、中止されても、PDOがデータセットを返すまで、SQL文を含むPHPスクリプトは実行され続けます。 – MaxAuray