2011-12-05 29 views
3

私のPHPスクリプトでは、データベースにcsvデータを挿入するためにPDOを使用しています。データを待たずにデータベースに挿入

$sqlsmttempl = 'INSERT INTO %s (%s) VALUES (%s)';

しかし、それは私が挿入を待ってからクライアントを防ぐことができますrecords.Howだけで数千のために非常に長い時間がかかりましたか?

私はINSERT DELAYEDを試しましたが、何のエラーもありませんが、まったく反応がないようです。

何かヒントありますか?ありがとうございます。

+0

「INSERT DELAYEDを試しましたが、エラーはありませんが、まったく応答がないようです」という意味はどうですか?あなたは何が起こることを期待していますか? –

+0

@FrancisAvilaテーブルが他のスレッドによって使用されていないときにデータが挿入されるのですか?ここから読む:http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html –

+0

しかし、 「それはまったく反応していないようです」とはどういう意味ですか? 'INSERT DELAYED'は何があっても挿入が成功したことを常に報告します。なぜなら、挿入するまでエラーがあるかどうかを知ることができず、今は挿入できないからです。 –

答えて

1

クライアントが処理を終了するのを待機させる唯一の方法は、応答を送信した後に別のプロセスで処理を実行させることです。

INSERT DELAYEDはこれを行うためのすばやく汚い方法です。挿入するデータベース行は、MySQLによってキューに入れられ、後で挿入されます。つまり、​​の後に行が実際に挿入されていないため、値エラーを検出または処理する方法がありません。クライアントが待機している間は、csvをループして問合せを発行する必要があります。

これが長すぎる場合は、何らかの種類のスプールまたはタスクキューを構築または使用する必要があります。この設計では、要求は受け入れられ、長時間実行されるプロセスに渡されるか、ディレクトリに配置され、Web応答が直ちに送信されます。その間、サーバ上で実行されている別のプロセスがリクエストをスクープして処理し、ステータスをどこかに記録します(データベーステーブルなど)。ユーザーは自分のタスクの状態を監視するために別のページを表示する必要があります。

+0

あなたの答えをありがとう。処理する前にクライアントにメッセージを送信しても、ウェブサイトはロードされ続けているので、処理が完了するまで他のページにアクセスすることはできません。この問題を解決するにはどうすればよいですか? –

+0

あなたは私の答えを誤解しているか、他の問題があります。あなたはクライアントに "私たちはこのメッセージを処理する"メッセージを送ってから、**応答を閉じます**。 * webserver *はリクエストを処理しません。*別のプロセスが処理します。 –

関連する問題