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
希望有人帮忙
我有两个 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
希望有人帮忙