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

Gearman working in CLI but not in browser - GEARMAN_COULD_NOT_CONNECT (485)

我有两个 PHP 脚本(worker 和 client)使用 并行执行任务齿轮人.

服务器 运行 正确 和 scrips,如果是从我的 CentOS 6 的命令行执行的。当我 运行 这些脚本来自 浏览器 ,未返回此响应。

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

Got in: 2.04 seconds
string (20) "soidA321esa q alO321"

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

Got in: 0.02 seconds
NULL

我不知道为什么它以一种方式而不是另一种方式正常工作。 有人发生过或知道类似的事情可能正在发生吗?

您好,谢谢。

PS: 附上涉及的代码:

Worker.php

<?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();

Client.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);

我找到了解决方案,因为我认为与代码或 gearman 无关,应该是某种服务配置。重点是我发现了这场争论 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

希望有人帮忙