2011-01-05 10 views
0

問題の中心を掘り下げる前に、まずは現在のシナリオの概要を説明する必要があります。私は現在、CLIを通していくつかのデータを処理するPHPスクリプトを持っています。情報の非同期処理に最適な言語

  • ユーザーがウェブサイトを通じて、いくつかのデータを送信し、それがデータベース
  • データベースごとに5分ほどで、データのすべてをCLIのサイクルを実行するPHPスクリプトに格納されています。それはこのような何かを行きます。それは、データベース内のユーザによって提出された情報を読み取り、それを処理し、他のデータベースに他の複数のエントリを作成します。しばしば、httpでfile_get_contentsを使って何かを投稿しなければならないかもしれません。
    • 私は常に情報は、ユーザが(これは非交渉です)

をそのためのコードは次のようになります物流の理由のためにそれを送信したときに、単純に処理されていないことができます。

$q = mysql_query("SELECT username, infoA, infoB FROM data"); 

while($r = mysql_fetch_array($q)) 
{ 

some_function($r['username'], $r['infoA']); 
another_function($r['infoB']); 

} 

関数 "some_function"と "another_function"は、情報の実際の処理がすべて行われる場所です。ここで問題があります:頻繁に通過するエントリがたくさんあり、最初のエントリが処理されてから最後のエントリが処理されるまでの遅延が大きすぎます。最初と最後のエントリの間に最小限の遅延で処理されたすべてのデータが必要です。関数自体は最適化されており、非常に速く実行されるため、問題はありません。将来の関数呼び出しは以前の関数呼び出しからのデータを参照する必要がないので、関数を非同期に実行する必要があると考えています。このようにして、スクリプトは、最初の入力が処理されるのを待つことなく、次の入力に循環することができます。

私が作成したphp cliスクリプトは、主にテスト目的のものです。予備テストではうまく動作しますが、起動するとデータ量が大幅に増えます。このようなタスクを処理するための理想的な言語は何ですか?私は確かに非同期に実行される関数が必要です。ただし、同時に非同期呼び出しが多すぎると、システムが過負荷になるか、情報が正しく処理されないことがあります。したがって、これを処理する効率的な方法もなければなりません。私はまだPHPでこれを行うことができますか、私は何か他のものに移動する必要がありますか?

私はGETデータでHTTP要求を行うことができます(結果を待つ必要はありません)、mysqlとmemcachedを使用できるようにする必要があります。

現実的に言えば、私はこれに取り組むプログラマーを雇います。だから、私は本当に、できるだけ多くの情報を探して、スキルセットをプログラマーで探すべきかを正確に判断しています。

また、より高速なサーバーを取得することをお勧めしません。私はこのソフトウェアの最適化に集中しています。改善されたソフトウェアアプローチに必要な物理サーバーの改善が考慮される場合があります。しかし、ソフトウェアの非効率性を補うためにハードウェアインフラストラクチャに資金を投入するのを避けようとしています。

答えて

1

私は現在ギアマンを使用することをお勧めします。

それだけでgearmanサーバを設定し、このサーバにすべての処理を委譲するようにコードをリファクタリング。この拡張http://php.net/manual/fr/book.gearman.php

でPHPを使用することは非常に簡単です

あなたの前のコードは、そのようにリファクタリングすることができます。

<?php 

# Client Code 
$client= new GearmanClient(); 
$client->addServer(); 
print $client->doBackground("action1", json_encode(array($username, $infoA))); 
print $client->doBackground("action2", $infoB); 


# Worker Code 
$worker= new GearmanWorker(); 
$worker->addServer(); 
$worker->addFunction("action1", "some_function"); 
$worker->addFunction("action2", "another_function"); 
while ($worker->work()); 

function some_function($job) 
{ 
    list($username, $infoA) = json_decode($job->workload(), true); 
    // do the stuff ... 
} 

function another_function($job) 
{ 
    $infoB = $job->workload(); 
    // do the stuff ... 
} 
+0

はどうもありがとうございました。私はこれを今見ている。 – user396404

+0

奇妙なことに、クライアントの要求をすべて処理するのに十分な人員がいない場合、Gearmanは従業員が利用可能になるまでジョブのキューを自動的に作成しますか? – user396404

+0

正確に。デフォルトでは、すべてのジョブ・キューはメモリーに保管されます。しかし、http://gearman.org/index.php?id=manual:job_server#persistent_queuesに記載されているように、キューをMySQLに格納することができます –

関連する問題