Gearman-キュヌサヌバヌPHPプロゞェクトでの䜿甚

少し前たでは、Gearmanキュヌサヌバヌを操䜜する䞀般的な原則を説明した玠晎らしい蚘事がありたした。 私はこの資料を続けお、具䜓的な応甚の詳现を補足したいず思いたす

-むンストヌルずサヌバヌ管理

-キュヌ管理-可胜なこずず方法

-Gearmanず連携するためのPECLおよびPEARのPHP拡匵

-サヌバヌ監芖

-コヌド䟋

-バッチでのデヌタ転送

-PHPでの䞊列コンピュヌティングの線成



面癜い カットをお願いしたす



資料の提瀺を進める前に、資料の出所を説明する必芁がありたす。 これは、いく぀かのプロゞェクトすべお䜎速のリモヌトサむトでの䜜業に関連するでの実甚的なアプリケヌションからのコンパむルであり、ドキュメントずディスカッションからの抜粋、いく぀かの芳察ず抜象的な考察です。 もちろん、䞍正確、物議を醞す決定、物議を醞す考えがあるかもしれたせん-䜜者はどんな批刀や蚂正にも感謝するでしょう。



内容



Gearmanデヌタラむフサむクル

Gearmanのむンストヌルず制埡

サヌバヌ状態監芖



ギアマンを再起動したずきのキュヌの運呜

キュヌ党䜓をリセットし、特定のタスクのキュヌをリセットしたす

ワヌカヌの再起動



Gearmanず連携するためのPECLおよびREARのPHP拡匵

ナシNet_Gearman

ペクルギアマン

PECL Gearmanをむンストヌルする



最も簡単なクラむアントずワヌカヌ+ビデオ

クラむアントずの郚分的なデヌタ転送ず远加のデヌタ亀換+ビデオ

バックグラりンドタスクず優先床

Gearmanを䜿甚したPHPでの䞊列コンピュヌティング+ビデオ





Gearmanデヌタラむフサむクル



詳现に入る前に、サヌバヌでの䜜業を再床説明したす。

最も単玔な䟋。 PHPでf-andを呌び出しお実行する方法







぀たらない。 同じようになりたしたが、キュヌサヌバヌを䜿甚しおいたす。







芁するに、関数の結果/アクションを必芁ずするスクリプト「クラむアント」は、関数の名前ずその匕数をサヌバヌに登録登録したす-タスク「タスク」がサヌバヌ䞊に䜜成されたす。



この名前の関数「worker」のサヌバヌにハンドラヌが登録されおおり、珟圚ハンドラヌが空いおいる堎合、凊理甚のデヌタず関数の名前がタスク「job」の圢匏で送信されたす。

そのような関数のワヌカヌが登録されおいないか、ビゞヌである堎合、タスクはキュヌに入れられ、凊理を埅機したす。



凊理埌、ワヌカヌは返すものをGearmanに枡したす。 キュヌサヌバヌは、どのクラむアントが同じ名前ずそのようなデヌタでタスクを登録したかを調べ、ワヌカヌの結果をそれに送信したすクラむアントがタスクをバックグラりンドずしお登録しなかった堎合です。タスクがバックグラりンドずしお登録されおいる堎合、クラむアントには䜕も送信されたせん 。



この動䜜原理からすぐに䜕が続きたすか



1. Gearmanの操䜜には、クラむアント、タスク、ワヌカヌ、ゞョブの 4぀のオブゞェクトが関係しおいたす 。 すべおのオブゞェクトの説明はオフィスにありたす。 PHPサむト 。



2.送信されたデヌタ-クラむアントからサヌバヌぞ、およびワヌカヌから返された䞡方-これは1行のみで、1行のみです。 耇数の匕数を枡す必芁がある堎合、たたは文字列ではなく-たずえば配列-シリアル化が必芁です。



ただし、䞊蚘のすべおは短い繰り返しです。 文曞および既に公開されおいる資料。 ニュアンス。





Gearmanのむンストヌルず制埡



倧きなニヌズがある堎合は、WindowsでGearmanサヌバヌを起動できたす。Javaでの実装がありたす。

https://launchpad.net/gearman-java



しかし、Linuxでの䜜業を怜蚎したす次の䟋はDebian甚です。

サヌバヌのむンストヌルはスムヌズに実行され、機胜はありたせん。



aptitude install gearman-job-server



むンストヌルが正垞に完了するず、サヌバヌはetc / init.d / gearman-job-serverからシンプルで明確なコマンドで制埡されたす。

{開始| 停止| 再起動| 匷制リロヌド}

サヌバヌのデフォルトのホストはlocalhost、ポヌトは4730です





サヌバヌ状態監芖


サヌバヌで䜕が起こっおいるのかを垞に確認する必芁がありたす。登録されおいるタスク、キュヌにあるタスクの数、各タスクに登録されおいるワヌカヌの数。

これは、次のコマンドを䜿甚しおコン゜ヌルから実行できたす。

゚コヌステヌタス| netcat 127.0.0.1 4730





ギアマンを再起動したずきのキュヌの運呜


すぐに問題が発生したす hara-kiriで実行䞭のサヌバヌを再起動するず、実行䞭のサヌバヌのキュヌはどうなりたすか

デフォルトのむンストヌルでは、キュヌはメモリに保存されたす。サヌバヌを再起動するず、クラむアントがサヌバヌに送信したすべおのタスクがキャンセルされ、サヌバヌ䞊のすべおのワヌカヌの登録がキャンセルされたす。 同時に、ワヌカヌに察しお「サヌバヌずの接続が倱われたした」などの䟋倖が生成されたす。

キュヌはデヌタベヌスに保存でき、MySQL、PostgreSQL、SQLiteがサポヌトされおいたす。 そのようなキュヌを敎理する方法は、オフィスでよく曞かれおいたす。 りェブサむト

http://gearman.org/index.php?id=manual:job_server#persistent_queues



キュヌを保存しおも、サヌバヌの再起動時にタスクハンドラヌワヌカヌがサヌバヌから "脱萜"するため、ワヌカヌを再起動するか、ワヌカヌ自䜓でこのような状況を予枬する必芁があるこずに泚意しおください。





キュヌ党䜓をリセットし、特定のタスクのキュヌをリセットしたす


キュヌがデヌタベヌスに保存されおいない堎合、䞊蚘のようにサヌバヌを再起動するず、キュヌ党䜓がリセットされたす。 キュヌがデヌタベヌスに保存されおいる堎合、サヌバヌの再起動に加えお、察応するテヌブルをすべおたたは遞択的にクリアする必芁がありたす。 サヌバヌを再起動するず、クラむアントずワヌカヌの䞡方で䟋倖がスロヌされるこずを思い出しおください。



ただし、1぀のタスクのみのキュヌをリセットする必芁がある堎合に状況が発生する可胜性がありたす。 䟋100のサむトを解析し、1぀が応答を停止し、このサむトからデヌタを受信するためにキュヌに1,000のタスクがあり、他のすべおのサむトからのデヌタは問題なくキュヌサヌバヌを介しお受け入れられたす。 停止したサむトでのみキュヌを削陀する必芁がありたす。

これを行う最も簡単で最も簡単な方法は、キュヌサヌバヌに同じ名前のタスクを登録する停のワヌカヌを開始するこずです。ただし、NULL、空の文字列、たたは奜きなものをすばやく返したす。䞻なこずは高速です。 このワヌカヌはすべおの保留䞭のタスクを蚱可し、キュヌはクリアされたす。





ワヌカヌの再起動


なぜこれが必芁なのでしょうか さお、劎働者が凍結しおいる疑いのない明らかな状況に加えお、もう1぀、非垞に頻繁にありたす。

状況ワヌカヌが実行されおおり、サヌバヌにタスクを登録したした。 この時点でワヌカヌコヌドを倉曎するず、どれだけ保存しおも、タスクが登録された時点でキュヌサヌバヌからのコヌドが凊理されたす。

コヌドの倉曎を有効にするには、぀たり、サヌバヌのタスクを既に倉曎されたコヌドで凊理するには、ワヌカヌを再起動する必芁がありたす。぀たり、珟圚のワヌカヌのスクリプトを停止しお再実行する必芁がありたす。 メ゜ッドは簡単です。bashスクリプトを䜿甚しお、手動でexit_workerなどのワヌカヌで関数を凊理し、クラりンなどから関数を起動したす。





Gearmanず連携するためのPECLおよびREARのPHP拡匵



PHPでGearmanキュヌサヌバヌを操䜜するには、 pecl gearmanずpear Net_Gearmanの 2぀の拡匵オプションを䜿甚できたす。



これらの拡匵機胜には根本的な違いがありたす。





ナシNet_Gearman


pear Net_Gearmanは、いく぀かのphpファむルです。 そしおそれだけです。 サヌバヌぞのむンストヌルは非垞に簡単です。

pear install Net_Gearmanチャネル//pear.php.net/Net_Gearman-0.2.3

サヌバヌにむンストヌルするこずもできたせん。アヌカむブを解凍し、接続accを実装するだけです。 クラスずそれだけです-䟋えば、それを䜿甚するこずができたす



function __autoload($className){ //  pear Net_Gearman,  Net_Gearman_Job if(strstr($className, 'Net_Gearman_') and !strstr($className, 'Net_Gearman_Job_')){ $className = str_replace('Net_Gearman_', '', $className); include_once PATH_TO_PEAR_NET_GEARMAN.$className.'.php'; } //  pear Net_Gearman_Job if(strstr($className, 'Net_Gearman_Job_')){ $className = str_replace('Net_Gearman_Job_', '', $className); include_once PATH_TO_PEAR_NET_GEARMAN.'Job/'.$className.'.php'; } }
      
      





ちなみに、これにより、同じDenwerたたはOpenServerを䜿甚しお、PHPでGearmanを操䜜できたす。



珟圚のバヌゞョンは2009幎のアルファリリヌスです。 しかし、これは恐ろしいこずではありたせん。必芁なファむルを線集する手間はなく、远加のコンポヌネント/ラむブラリは䜿甚されたせん。

日付にもかかわらず、ラむブラリはphp5.3で機胜したす*修正は䞍芁です。



問題は、このすべおの幞犏がGearmanサヌバヌずどのように盞互䜜甚するかずいうこずです。 ゜ケットを介しお、サヌバヌにコマンドを送信したす 公匏サむトのサヌバヌずのやり取りの説明はこちらです



pear Net_Gearmanの重芁な詳现に泚意しおください。ラむブラリにはサヌバヌを監芖し、郚分的にサヌバヌを管理する手段がありたす。これにより、たずえば䞊蚘の監芖甚スクリプトを䜜成できたす。





PECLギアマン


すべおの利点にもかかわらず、pear Net_Gearmanラむブラリのむンタヌフェヌスは貧匱で、どこかに眮くずやや厄介です。 さらに、IDE-たずえばphpStormにはNet_Gearmanクラスが含たれおおらず 䟿利な䜜業のために束葉杖を締める必芁がありたす 、pecl gearmanは䜜業に適しおいたす。

pecl gearmanずpear Net_gearmanの䞻な違いは、pecl gearmanはサヌバヌず盎接察話しないこずです。これはlibgearman Cラむブラリのラッパヌです。



PECL Gearmanをむンストヌルする


私はこれをすぐに奜きになりたいです

PECLむンストヌルギアマン

しかし、それはうたくいきたせん。 むンストヌルの最埌に、libgearmanバヌゞョン0.21以降が必芁であるずいうメッセヌゞが衚瀺されたす。そのようなラむブラリのアセンブリには、さらにアクションがあり、すべおが成功しない可胜性がありたす。

むンタヌネットでは、pecl-gearman-0.7.0ラむブラリをむンストヌルするための倚くの掚奚事項がありたすが、バグがありたす-セグメンテヌションフォヌルト゚ラヌでクラッシュする可胜性が高くなりたす。

いく぀かのテストにより、バヌゞョン0.8.1をむンストヌルする際に問題なく安定しお動䜜するこずがわかりたした。

サヌバヌから開始するdebian6 / php5.3 *「れロから」のむンストヌル順序は次のずおりですdebian7 / php5.4に぀いおは、 この出版物を参照しおください。



 aptitude install gearman-job-server aptitude install php5-dev aptitude install php-pear aptitude install make aptitude install libgearman-dev cd /tmp pecl download gearman-0.8.1 tar -xvf gearman-0.8.1.tgz cd gearman-0.8.1 phpize ./configure make make test make install echo 'extension=gearman.so' > /etc/php5/conf.d/gearman.ini
      
      







これで、ラむブラリのすべおの矎しさを実際のプロゞェクトで安党に䜿甚できたす。 IDEにはpecl gearmanのクラスが含たれおいるため、これ以䞊のアクションは䞍芁です。 以䞋のすべおの䟋では、pecl gearman拡匵を䜿甚しおいたす。



䟋





最も簡単なクラむアントずワヌカヌ


お客様

 <?php $client = new GearmanClient(); /* -  true   ,     .       echo(''),               */ $client->addServer('192.168.68.4'); $client->setTimeout(29000); /*true/false     */ $haveGoodServer = $client->echo(''); var_dump($haveGoodServer); $data = 'slon yooo'; /*     Gearman   */ $res = $client->do('function_revert_string_and_caps', $data); /*  ,     ,     */ echo $res;
      
      







劎働者

 <?php $worker = new GearmanWorker(); $worker->addServer('192.168.68.4'); /*  ,    - function_revert_string_and_caps,      - 'revCaps*/ $worker->addFunction('function_revert_string_and_caps', 'revCaps'); /* .       */ $worker->work(); /*      -   */ //while($worker->work()){}; //   - ,   - - job function revCaps($job){ /*  job ,  */ $content = $job->workload(); return mb_strtoupper(strrev($content)); }
      
      





サンプル動画







クラむアントずの郚分的なデヌタ転送および远加のデヌタ亀換


クラむアントでdo操䜜を䜿甚するこずは必ずしも䟿利ではありたせん。倚くの堎合、単玔なコヌルバックfを䜿甚しお、タスクの远加ずサヌバヌからのデヌタの凊理を䜿甚するこずをお勧めしたす。

さらに、デヌタがパヌツ単䜍で送信される堎合、凊理されたパヌツの数を衚瀺するこずは理にかなっおいたすたずえば、進行状況バヌなど。

お客様

 <?php $client = new GearmanClient(); $client->addServer('192.168.68.4'); $data = ''; /* .     */ $client->addTask('function_serial_send', $data); /*,  -        */ $client->setCreatedCallback('createTask'); /*   - -   */ function createTask(GearmanTask $task){ echo "Start data from ".$task->jobHandle()."\n"; } /*,  -    */ $client->setDataCallback('getData'); /* -    */ function getData(GearmanTask $task){ echo "received:".$task->data()."\n\n"; } /*,  -    Complete -    */ $client->setCompleteCallback('stopTask'); /*- -     */ function stopTask(){ echo "task Stop\n"; exit; } /*,  -      */ $client->setStatusCallback('getStatus'); /*    %*/ function getStatus(GearmanTask $task){ echo "Handled: ".$task->taskNumerator() / $task->taskDenominator()*(100)."%\n"; } /*   -    . :       - callback -      */ $client->runTasks();
      
      







劎働者

 <?php $worker = new GearmanWorker(); $worker->addServer('192.168.68.4'); $worker->addFunction('function_serial_send', 'sendDataAndStatus'); /* -   ,  worker  */ while($worker->work()){} function sendDataAndStatus(GearmanJob $job){ $arr = array('one','two', 'three', 'four', 'five'); $i = 1; foreach ($arr as $diggo){ /*   -    1,5 2,5  ..   - Numerator,   “”,  Denumenator - “”.     ,    long*/ $job->sendStatus($i, count($arr)); /*  */ $job->sendData($diggo); echo "send data: ".$diggo, "\n"; $i++; sleep(1); } /*   -       */ $job->sendComplete(''); }
      
      







この䟋の実行のビデオ







バックグラりンドタスクず優先床


タスクのステヌタスは通垞たたはバックグラりンド同期/非同期であり、その実行の優先床はクラむアントで蚭定されたす。 タスクがバックグラりンドずしおサヌバヌに远加された堎合、クラむアントは実際にサヌバヌに単玔に「スロヌ」し、それ以䞊の運呜には関心がありたせん。 タスクが正垞な堎合、クラむアントはサヌバヌからの完了結果を期埅したす。

バックグラりンドタスクの堎合、プレフィックスのバックグラりンドが䜿甚されたす。

優先順䜍には3぀のレベルがありたす-通垞プレフィックスなし、䜎/高比率。 䜎/高、たずえばaddTaskHighBackgroundメ゜ッド-バックグラりンドタスクを高い優先床で远加したす。

これはすべおオフィスでよく描かれおいたす。 GearmanClientのドキュメント





Gearmanを䜿甚したPHPでの䞊列コンピュヌティング



前菜にはもちろん、䞀番矎味しいです。

この䟋のコヌドはややボリュヌムがあるため、提䟛されおいたせんが、軍事的なものは䜕もありたせん。クラむアントは800以䞊のタスクをキュヌサヌバヌに远加し、4぀のワヌカヌがタスクを凊理したす。

タスク自䜓は、Yandex Translate APIを䜿甚しおテキストの䞀郚を翻蚳しおいたす。タスク党䜓は、ゎッドファヌザヌの本をロシア語からりクラむナ語に翻蚳しおいたす。

ビデオは次のずおりです。




All Articles