ホームページ  >  記事  >  バックエンド開発  >  gearman-php の Net_Gearman ライブラリを学習する

gearman-php の Net_Gearman ライブラリを学習する

WBOY
WBOYオリジナル
2016-08-08 09:26:241570ブラウズ

この英語の投稿に従って学習してください
元のコードのバックアップ

例 1:
Net_Geaman の基本アーキテクチャを示したように、クライアント側のメイン コード:

<code><span>// 一个client对象,需要jobserver信息,一个数组</span><span>$client</span> = <span>new</span> Net_Gearman_Client (gm::<span>$servers</span>);
<span>// Example1就是function name</span><span>$client</span>->Example1 (<span>array</span> (<span>'date'</span>));</code>

ワーカー側のメイン コード:

<code><span>// worker对象,需要jobserver信息</span><span>$worker</span> = <span>new</span> Net_Gearman_Worker (gm::<span>$servers</span>);
<span>// 传入function name,给他处理Example1的能力</span><span>$worker</span>->addAbility (<span>'Example1'</span>);
<span>// loop</span><span>$worker</span>->beginWork ();</code>

は、従来の Gearman API とは少し異なります。Net_Geaman では、ユーザーが次の形式で関数を実装する必要があります。 Example1.php ファイル コードのようなサブクラス スニペット:

<code><span><span>class</span><span>Net_Gearman_Job_Example1</span><span>extends</span><span>Net_Gearman_Job_Common</span>
{</span><span>// arg 是数组,与client里面的入参array对应</span><span>public</span><span><span>function</span><span>run</span><span>(<span>$arg</span>)</span>
    {</span><span>$cmd</span> = <span>$arg</span>[<span>0</span>];
    <span>//...</span><span>return</span><span>$result</span>;
    }
}</code>

例 1 のトリックの 1 つは、クライアントが _call メカニズムを使用して、存在しないメソッド Example1 を呼び出すことです。使い物にならない。

例 2:
クライアント側ではタスクとセットの概念を導入し、複数のタスクをセットに蓄積して一緒に発行できるようにします。 クライアント フラグメント:

<code><span>$set</span><span>=</span><span>new</span> Net_Gearman_Set();
<span>$task</span><span>=</span><span>new</span> Net_Gearman_Task (<span>'Example1'</span>, <span>array</span> (<span>'date'</span>));
<span>$set</span><span>-></span>addTask (<span>$task</span>);
<span>$client</span><span>-></span>runSet (<span>$set</span>);</code>

例 3:
コールバック関数は、タスクの完了後に追加されます。コールバックのパラメーターには、関数名、ハンドル (主にタスクを一意に識別するために jobserver:number をラップ)、およびタスクの戻り値が含まれます。

そうです

例 4:
ここには主に、完全なコールバックを通じて返されたデータが表示されます。
例5:
クライアント側で失敗コールバックを追加する方法を示します。 Net_Gearman_Job_Exception 例外が関数でスローされると、失敗タイプのコールバックがトリガーされます。 コード スニペット:

<code>$task->attachCallback (<span>"complete"</span>,Net_Gearman_Task::TASK_COMPLETE);
//<span>...</span><span>function</span> complete ($func, $handle, $result) {
    gm::log_msg (<span>"[gm_client] complete ($handle/$func)"</span>);
    gm::log_msg (<span>"[gm_client] result: "</span> . $result[<span>'result'</span>]);
}</code>
<code><span><span>class</span><span>Net_Gearman_Job_Example3</span><span>extends</span><span>Net_Gearman_Job_Common</span>
{</span><span>public</span><span><span>function</span><span>run</span><span>(<span>$arg</span>)</span>
    {</span><span>if</span> (count (<span>$arg</span>) != <span>1</span>)
        {
            <span>throw</span><span>new</span> Net_Gearman_Job_Exception (<span>"must provide exactly one command to run"</span>);
        }
        <span>//...</span></code>

ただし、例外の内容は失敗コールバックに渡されません。関数を使用するため、通常の完全なコールバックを使用することをお勧めします。ユーザーは障害情報を自分で取得して戻り値に入れることができます。
例6:
モニター関数はワーカーで使用されます。コード スニペットは次のとおりです。

<code>$task->attachCallback (<span>"complete"</span>,Net_Gearman_Task::TASK_COMPLETE);
$task->attachCallback (<span>"fail"</span>,Net_Gearman_Task::TASK_FAIL);
//<span>...</span><span>function</span> fail ($task) {
    gm::log_msg (<span>"[gm_client] fail, task: "</span> . print_r ($task, true));
}</code>

トリガーとなるイベントは次のとおりです。 仕事が始まる前。
仕事が完了した後。
ジョブを待機している場合、ジョブは 1 分に 1 回トリガーされます。

例 7:

主なことは、タスクの開始、完了、および失敗のコールバックをワーカー側に追加して、内部で何かを実行できるようにすることです。 コード スニペット:

<code><span>$worker</span>->beginWork (<span>'monitor'</span>);
<span>// ...</span><span><span>function</span><span>monitor</span><span>(<span>$idle</span>, <span>$time_of_last_job</span>)</span>
{</span><span>$idle_str</span> = (<span>$idle</span>) ? <span>'idle'</span> : <span>'not idle'</span>;
    <span>$time_of_last_job_str</span> = date (<span>'r'</span>, <span>$time_of_last_job</span>);
    gm::log_msg (<span>"[gm_worker] status: $idle_str, time of last job: $time_of_last_job_str"</span>);
}</code>
例 8:

これは包括的なレビューであり、注目すべき主な点は次のとおりです:
1. 著者は PHP がとても好きですが、PHP にデーモン ワーカーの役割を引き受けさせるのはあまり安全ではないとも考えています。異常終了や不当なメモリ使用などが発生し、パフォーマンスに影響を与える可能性があるためです。各ワーカーにはインスタンス番号があり、インスタンス番号ごとに 1 つのワーカーのみが実行されるようにするために、crontab タスクが使用されます。すぐに。
2. ワーカーの beginWorker 終了は、モニターのコールバックで判断できます。モニターのコールバックには、コールバック関数が false を返した場合、ワーカーはループを継続し、true を返した場合、ループが終了するという特性があります。これも確認されています。ワーカーのソースコード内:

<code><span>$worker</span><span>-></span>attachCallback (<span>'job_start'</span>, Net_Gearman_Worker<span>::JOB_START</span>);
    <span>$worker</span><span>-></span>attachCallback (<span>'job_complete'</span>, Net_Gearman_Worker<span>::JOB_COMPLETE</span>);
    <span>$worker</span><span>-></span>attachCallback (<span>'job_fail'</span>, Net_Gearman_Worker<span>::JOB_FAIL</span>);</code>
上記は、gearman-php の Net_Gearman ライブラリの学習を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。