2011-01-28 3 views
3

私は500万以上の行を持つデータベースを持っています。各行に対して、最大500個の接続でいくつかのパラメータを使用してサーバーにHTTPポストを行う必要があります。各投稿要求は処理に12秒かかります。古い接続が完了すると、新しい接続を確立して〜500接続を維持する必要があります。私はその後、これらのWebcallから返された値でDBを更新する必要があります。 上記のようにウェブコールを作成するにはどうすればよいですか?async webはPHPを呼びます

私のアプリケーションはPHPです。 PHPを使用することはできますか?これについては別のものに切り替える必要があります。

+0

この投稿を見るhttp://stackoverflow.com/a/13690590/599993 – jzafrilla

答えて

1

PHPは、デフォルトでは実行時間がかなり短いため、長時間実行するスクリプトを作成するための適切なツールではありません。あなたは、このタスクのためにPythonを使用して探すかもし​​れません。また、PHPを使用している唯一の理由は、Webフロントエンドを簡単に統合できるようにするために、system()関数を使用してPHPから外部スクリプトを呼び出すことができることです(pythonスクリプトなど)。

しかし、あなたはあなたのPHPスクリプトを一度に1つの行しか扱わず、cron-jobを毎回phpスクリプトを呼び出させるだけで、cron-jobでphpでこれを行うことができます[/ b]秒。テーブルのインデックスをデータベースの他の場所に置いておくか、ファイルに書き込むだけです。

500の接続制限を満たすには、一度に40行ずつスクリプトを作成してください。 40行/秒は約500行/ 12秒です

+2

これに追加するには、WebサーバーモジュールとしてのPHPのデフォルトの「max_execution_time」は30秒です。 PHPのCLI(スタンドアロンコマンドラインプログラム)のデフォルトは無制限です。これは、Web以外のタスクでは限界を設定するのが面倒です。ただし、デフォルトのメモリ制限はPHP CLIにも適用されますが、同時に500のリソース接続を維持する場合は注意が必要です。 – Wiseguy

2

実際には、これは間違いなくロングポーリングと呼ばれる手法を使用してPHPで行うことができます。基本的にどのように動作するのかは、クライアントマシンがサーバーにpingを尋ね、「あなたは私のために何かを持っていますか?」と言って、サーバーはそれを見ません。応答するのではなく、要求を保持し、送信するものがあるときに応答します。

ロングポーリングは、DrupalChatとAPEプロジェクト(AJAX Push Engine)の両方で使用される方法です。ここで http://drupal.org/project/drupalchat
http://www.ape-project.org/

プッシュ技術上のいくつかの詳細です:http://en.wikipedia.org/wiki/Push_technologyhttp://en.wikipedia.org/wiki/Comet_%28programming%29

そして、ここではそれについてStackOverflowのポストです:How do I implement basic "Long Polling"?

今、私は12秒が本当にあることを言っている一顧DBクエリを実行するのに長い時間です。クエリを最適化する必要があるか、またはDBが行う(またはその両方)のいずれかと思われます。データベースを正規化して、適切なテーブルとテーブル間インデックスをセットアップしましたか?

DB更新の衝突を防止するために、トランザクション(PostGresと新しいバージョンのMySQLの両方が大部分のエンタープライズDBシステムと共に提供する)を使用する必要があります。トランザクションを使用すると、DBの変更をロールバックして、テーブルIDなどを予約することができます。 http://en.wikipedia.org/wiki/Database_transaction