>  기사  >  백엔드 개발  >  gearman-php의 Net_Gearman 라이브러리 학습

gearman-php의 Net_Gearman 라이브러리 학습

WBOY
WBOY원래의
2016-08-08 09:26:241630검색

이 영어 포스팅에서 배운 점
원본 코드 백업

예시 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>

클라이언트 측의 메인 코드는

<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>

전통적인 gearman API에서는 사용자가 하위 클래스 형태로 함수를 구현해야 합니다(예: example1.php 파일의 코드 조각:


예제 1의 트릭은 클라이언트가 호출한다는 것입니다). _call 메커니즘을 사용하는 존재하지 않는 예제1의 메서드. 쓸모 없는.

<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>
예 2:

클라이언트 측에서는 여러 작업을 세트로 모아 함께 발행할 수 있도록 작업 및 세트 개념을 도입합니다. 클라이언트 프래그먼트:

<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>
예 3:

콜백 함수는 작업이 완료된 후 추가됩니다. 콜백의 매개변수에는 함수 이름, 핸들(주로 작업을 고유하게 식별하기 위해 jobserver:number 래핑) 및 작업의 반환 값이 포함됩니다.


예 4:

주로 전체 콜백을 통해 반환된 데이터를 보여줍니다.
<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>
예시 5:
<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>
클라이언트 측에서 실패 콜백을 추가하는 방법을 보여줍니다. 함수에서 Net_Gearman_Job_Exception 예외가 발생하면 실패 유형 콜백이 트리거됩니다. 코드 조각:



실패 콜백 함수로 다시 전달되지 않으므로 일반 완료 콜백을 사용하는 것이 좋습니다. 사용자는 실패 정보를 캡처하여 반환 값에 넣을 수 있습니다.
<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>
예시 6:

모니터 기능은 작업자에서 사용됩니다. 코드 조각은


트리거 이벤트는

입니다. 작업이 시작되기 전.

작업이 완료된 후.
작업을 대기할 때 1분에 한 번씩 트리거됩니다.

<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>
예 7:

가장 중요한 것은 내부에서 작업을 수행할 수 있도록 작업자 측에서 작업의 시작, 완료 및 실패 콜백을 추가하는 것입니다.


예 8:

다음과 같은 주목할 만한 주요 사항이 포함된 종합적인 리뷰입니다.
<code><span>if</span> (call_user_func(<span>$monitor</span>, <span>$idle</span>, <span>$lastJob</span>) == <span>true</span>) {
<span>$working</span> = <span>false</span>;
}</code>
1. 저자는 PHP를 매우 좋아하지만, PHP가 데몬 워커의 역할을 맡게 하는 것은 그다지 안전하지 않다고 생각합니다. 비정상적인 종료, 불합리한 메모리 사용 등이 성능에 영향을 미칠 수 있기 때문입니다. 그는 전략을 제공합니다. 각 작업자에는 인스턴스 번호가 있습니다. 인스턴스 번호당 하나의 작업자만 실행되도록 하기 위해 파일 잠금이 사용됩니다. 작업자는 특정 수의 작업을 처리한 후 자동으로 종료됩니다. 초 안에. 2. 워커의 BeginWorker 종료 여부는 모니터 콜백에서 판단할 수 있습니다. 모니터 콜백에는 다음과 같은 특징이 있습니다. 콜백 함수가 false를 반환하면 워커는 계속해서 루프를 수행하고, true를 반환하면 루프가 종료되는 것도 확인됩니다. 작업자의 소스 코드:

위 내용은 gearman-php의 Net_Gearman 라이브러리에 대한 학습 내용을 다양한 측면에서 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.