Gearman在CLI中工作但不在浏览器中工作 - GEARMAN_COULD_NOT_CONNECT(485)

时间:2015-11-23 12:49:01

标签: php apache gearman

我有两个 PHP 脚本(工作人员和客户),可以使用 Gearman 在并行执行任务。

服务器正常运行,如果从我的CentOS 6的命令行中删除,也会出现问题。当我从浏览器运行这些脚本时出现问题,这个回复没有回复。

当我通过命令行运行我的客户端脚本(又需要工人实例)时,我得到了这个结果:

Got in: 0.02 seconds
NULL

但如果我从您的网络浏览器运行它,我会得到这个:

<?php

class GrmWorker
{

    /**
     * Declaración de atributos.
     */
    private $worker;

    /**
     * Constructor de la clase.
     */ 
    public function __construct()
    {
        // Instancia un nuevo Worker.
        $this->worker = new \GearmanWorker();
    }

    /**
     * Añade un servidor de trabajo a una lista de servidores que pueden ser usados para ejecutar trabajos. 
     */
    public function addServer(array $servers = array())
    {
        // Comprueba si se envían los parámetros de servidor o se establecen los predeterminados.
        if (sizeof($servers) == 0)
        {
            $this->worker->addServer('127.0.0.1', '4730');
        }
        else
        {
            // Recorre el array de servidores.
            foreach ($servers as $server)
            {
                // Comprueba que los índices de los parámetros sean correctos.
                if (null !== $server['host'] && null !==$server['port']) 
                {
                    $this->worker->addServer($server['host'], $server['port']);
                }
                else
                {
                    throw new Exception('El array de servidores solo puede contener los índices "host" y "port".');
                }
            }
        }
    }

    /**
     * Registra el nombre de una función en el servidor de trabajos y especifica la llamada de retorno quer corresponde a esa función.
     */
    public function addFunction($functionName, callable $function)
    {
        $this->worker->addFunction($functionName, $function);
    }

    /**
     * Establece el intervalo de tiempo, en milisegundos, en el cual estará disponible el Worker.
     */
    public function setTimeout($miliseconds)
    {
        $this->worker->setTimeout($miliseconds);
    }

    /**
     * Retorna el tiempo actual a esperar, en milisegundos.
     */
    public function timeout()
    {
        $this->worker->timeout();
    }

    /**
     * Pone a funcionar el trabajador.
     */
    public function work()
    {
        while ($this->worker->work());
    }
}

/**
 * Clase que contiene as funciones a declarar para el trabajador.
 */
class Functions
{
    public static function reverse_cb($job)
    {
        sleep(2);

        return strrev('123' . $job->workload());
    }
}

// Instancia un nuevo trabajador.
$worker = new GrmWorker();
$worker->addServer();
$worker->setTimeout(60000);

// Declara las funciones que puede ejecutar el trabajador.
$worker->addFunction("reverse", "Functions::reverse_cb");

// Comienza a trabajar.
$worker->work();

我不知道为什么它以某种方式而不是另一种方式正常工作。 任何人都已经发生过或者知道可能会发生类似情况吗?

问候并谢谢。

PS:附带的代码:

Worker.php

<?php

class GrmClient
{
    // Declaración de atributos.
    private $client;
    private $tasks;

    /**
     * Constructor de la clase.
     */
    public function __construct()
    {
        $this->client = new GearmanClient();
        $this->tasks = 0;
    }

    /**
     * Añade un servidor de trabajo a una lista de servidores que pueden ser usados para ejecutar trabajos.
     */
    public function addServer(array $servers = array())
    {
        // Comprueba si se envían los parámetros de servidor o se establecen los predeterminados.
        if (sizeof($servers) == 0)
        {
            $this->client->addServer('127.0.0.1', '4730');
        }
        else
        {
            // Recorre el array de servidores.
            foreach ($servers as $server)
            {
                // Comprueba que los índices de los parámetros sean correctos.
                if (null !== $server['host'] && null !== $server['port']) 
                {
                    $this->client->addServer($server['host'], $server['port']);
                }
                else
                {
                    throw new Exception('El array de servidores solo puede contener los índices "host" y "port".');
                }
            }
        }
    }

    /**
     *  Añade una tarea para ser ejecutada en paralelo.
     */
    public function addTask($function_name, $workload, mixed $context = null)
    {
        $this->client->addTask($function_name, $workload, $context);

        // Aumenta el contador de tareas a ejecutar.
        $this->tasks++;
    }

    /**
     *  Ejecuta una tarea en segundo plano para ser ejecutada en paralelo.
     */
    public function addTaskBackground($function_name, $workload, mixed $context = null)
    {
        $this->client->addTaskBackground($function_name, $workload, $context);

        // Aumenta el contador de tareas a ejecutar.
        $this->tasks++;
    }

    /**
     *  Añade una tarea de alta prioridad para ser ejecutada en paralelo.
     */
    public function addTaskHigh($function_name, $workload, mixed $context = null)
    {
        $this->client->addTaskHigh($function_name, $workload, $context);

        // Aumenta el contador de tareas a ejecutar.
        $this->tasks++;
    }

    /**
     *   Añade una tarea de alta prioridad para ser ejecutada en segundo plano y en paralelo.
     */
    public function addTaskHighBackground($function_name, $workload, mixed $context = null)
    {
        $this->client->addTaskHighBackground($function_name, $workload, $context);

        // Aumenta el contador de tareas a ejecutar.
        $this->tasks++;
    }

    /**
     *  Añade una tarea de baja prioridad para ejecutar en paralelo.
     */
    public function addTaskLow($function_name, $workload, mixed $context = null)
    {
        $this->client->addTaskHigh($function_name, $workload, $context);

        // Aumenta el contador de tareas a ejecutar.
        $this->tasks++;
    }

    /**
     *  Añade una tarea de baja prioridad para ser ejecutada en segundo plano y en paralelo.
     */
    public function addTaskLowBackground($function_name, $workload, mixed $context = null)
    {
        $this->client->addTaskHighBackground($function_name, $workload, $context);

        // Aumenta el contador de tareas a ejecutar.
        $this->tasks++;
    }

    /**
     * Especifica una función a ser llamada cuando se complete una tarea. La función de llamada de retorno acepta un único argumento, un objeto GearmanTask.
     */
    public function setCompleteCallback(callable $function)
    {
        $this->client->setCompleteCallback($function);
    } 

    /**
     * Elimina todas las funciones de retorno de llamada establecidas.
     */
    public function clearCallbacks()
    {
        $this->client->clearCallbacks();
    }

    /**
     * Ejecuta una lista de tareas, previamente establecidas, en paralelo.
     */
    public function runTasks()
    {   
        // Declara el array que contendrá los recursos que manejan los procesos de los workers.
        $process = array();

        // Comprueba si existen suficientes Workers para las tareas solicitadas.
        if ($this->getNumWorkers() < $this->getNumTasks())
        {
            for ($i = 0; $i < $this->getNumTasks() - $this->getNumWorkers(); $i++)
            {
                // Pone en marcha un worker en segundo plano.
                $proce = proc_open("php /var/www/html/web/Worker.php > /dev/null &",
                        array(
                                array("pipe","r"),
                                array("pipe","w"),
                                array("pipe","w")
                        ),
                        $pipes);
                $process[] = $proce;
            }
        }

        // Ejecuta las tareas puestas en cola.
        $this->client->runTasks();

    }

    /**
     * Devuelve el número de tareas definidas.
     */
    public function getNumTasks()
    {
        return $this->tasks;
    }

    /**
     * Devuelve el número de trabajadores activos.
     */
    private function getNumWorkers()
    {
        $workers = shell_exec ("gearadmin --workers");
        $workers = explode(PHP_EOL, $workers);
        return sizeof($workers) - 3;
    }
}

$client = new GrmClient();
$client->addServer();

$result = null;

$client->setCompleteCallback(function(GearmanTask $task) use (&$result)
{
    $result .= $task->data();
});

$client->addTask('reverse', 'Ola q ase');
$client->addTask('reverse', 'Adios');

$start = microtime(true);
$client->runTasks();
$totaltime = number_format(microtime(true) - $start, 2);

echo "Got in: " . $totaltime . " seconds \n";
var_dump($result);

Client.php

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:id="@+id/linearLayout2">
<ImageButton
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_height="wrap_content"
    android:id="@+id/imgButton1"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter"
    android:background="@null" />

<ImageButton
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:id="@+id/imgButton2"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter"
    android:background="@null" />

<ImageButton
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:id="@+id/imgButton3"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter"
     android:background="@null" />

<ImageButton
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:id="@+id/imgButton4"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter"
    android:background="@null" />

 </LinearLayout>

1 个答案:

答案 0 :(得分:0)

我发现解决方案,因为我认为与代码或齿轮手无关,应该是服务配置的东西。重点是我发现了这场辩论 https://groups.google.com/forum/#!topic/gearman/_dW8SRWAonw 并通过SHH执行以下命令

转入MAC控制执行许可模式。

[root @ localhost share] # getenforce
enforcing
[root @ localhost share] # setenforce 0
[root @ localhost share] # getenforce
permissive

我希望有人帮忙。