2011-02-28 6 views
10

Los documentos PHP son un poco confusos en este caso, así que lo estoy preguntando aquí. Dado este código de trabajador:Gearman & PHP: forma adecuada para que un trabajador envíe de vuelta un error

<?php 
$gmworker= new GearmanWorker(); 
$gmworker->addServer(); 
$gmworker->addFunction("doSomething", "doSomethingFunc"); 
while($gmworker->work()); 

function doSomethingFunc() 
{ 
    try { 
     $value = doSomethingElse($job->workload()); 
    } catch (Exception $e) { 
     // Need to notify the client of the error 
    } 

    return $value; 
} 

¿Cuál es la forma correcta de notificar al cliente de cualquier error que haya tenido lugar? ¿Falso retorno? Use GearmanJob :: sendFail()? Si es el último, ¿tengo que volver desde mi doSomethingFunc() después de llamar a sendFail()? ¿El valor de retorno debe ser el que devuelva sendFail()?

El cliente está utilizando GearmanClient :: returnCode() para comprobar si hay fallas. Además, simplemente el uso de "return $ value" parece funcionar, pero ¿debería usar GearmanJob :: sendData() o GearmanJob :: sendComplete() en su lugar?

+0

Debe tenerse en cuenta que solo puede recuperar esta información con tareas normales ('GearmanClient :: do()'), no tareas de fondo 'GearmanClient :: doBackground()'). Ver también: http://stackoverflow.com/a/11631673/664108 –

Respuesta

8

Esta puede no ser la mejor manera de hacerlo, pero es el método que he usado en el pasado y me ha funcionado bien.

Uso sendException() seguido de sendFail() en el trabajador para devolver un error de trabajo. La parte de excepción es opcional, pero la utilizo para que el cliente pueda tener un error y sepa más o menos por qué falló. Después de sendFail, no devuelvo nada más. A modo de ejemplo se trata de un método que el trabajador se registra como la devolución de llamada para hacer el trabajo:

public function doJob(GearmanJob $job) 
{ 
    $this->_gearmanJob = $job; 


    try{ 
     //This method does the actual work 
     $this->_doJob($job->functionName()); 
    } 
    catch (Exception $e) { 
     $job->sendException($e->getMessage()); 
     $job->sendFail(); 
    } 
} 

Después sendFail() no devuelve nada más, de lo contrario puede obtener resultados extraños tales como el JobServer pensando en el trabajo terminó bien

En cuanto a la devolución de datos, uso sendData() si devuelvo datos en fragmentos (como la transmisión de video transcodificado, o cualquier dato 'grande' en el que no quiera mover un bloque grande) en varios intervalos durante mi trabajo con sendComplete() al final. De lo contrario, si solo quiero devolver mis datos de una vez al final del trabajo, solo uso sendComplete().

Espero que esto ayude.

+0

Usar gearman para transmitir video suena increíble. Me encantaría saber más sobre la arquitectura de su software ... –

+1

@Omega no era una transmisión de video en el sentido habitual de ver videos, sino una transcodificación fragmentada para su almacenamiento en otro lugar. Además, ciertamente no es cómo lo haría en estos días :-) –

+0

@JamesButler ¿cómo lo harías en estos días? – dre

Cuestiones relacionadas