gearman给了我GEARMAN_COULD_NOT_CONNECT,它肯定在运行

时间:2013-02-14 20:43:36

标签: php debian gearman

我的开发服务器是Debian Squeeze,我正在运行Gearman 1.1.5,我是从源代码编译的,带有php pecl扩展v1.1.1

如果我运行reverse_client.php脚本,我会收到GEARMAN_COULD_NOT_CONNECT错误。

PHP Warning: GearmanClient::do(): send_packet(GEARMAN_COULD_NOT_CONNECT) Failed to send server-options packet -> libgearman/connection.cc:430 in /home/bealers/build/gearman-1.1.1/examples/reverse_client.php on line 26

这里有一些类似的帖子,他们都指出通用汽车没有运行。

肯定正在运行。

我用这些参数启动它:

PARAMS="--queue-type=MySQL --mysql-db=test_db --mysql-user=gearman --mysql-password=gearman"

如果我删除了test_db中的gearman_queue表,那么重新启动守护进程就会重新创建表,所以它的mysql连接很好,而且它显然已经开始了。

我也可以在localhost上telnet到4730,所以没有防火墙问题。

最初GM起步有问题,因为它是在mysql之前启动的,所以我编辑了init脚本

### BEGIN INIT INFO
# Provides:          gearman-job-server
# Required-Start:    $network $remote_fs $syslog mysql

并且update-rd.c gearman-job-server defaults将其设置为在启动之后开始,并且它现在在启动时正常启动。

我能想到的唯一另一件事是,我最初是通过apt安装的,但是版本是旧的,所以我删除了它并从源代码编译。 / usr / sbin / gearmand不再存在,唯一的版本是/ usr / local / sbin / gearmand

ps ax | grep gearman只显示一个正在运行的进程。

Netstat只显示一个正在运行的进程

tcp 0 0 *:4730 *:* LISTEN 2325/gearmand

PECL lib似乎很好:

php -i | grep gearman

/etc/php5/cli/conf.d/gearman.ini,
gearman
gearman support => enabled
libgearman version => 1.1.5

我没有想法

4 个答案:

答案 0 :(得分:15)

我遇到了同样的问题,最近在几天的挫折之后解决了这些问题(很难排除故障,因为有三个过程需要担心: - )

看来(至少在我的情况下)GearmanClient :: addServer()和GearmanWorker :: addServer()的PHP文档是不正确的。具体来说,文档似乎暗示主机名和端口号是可选的,如果您不指定它们,它将使用localhost和端口4730作为默认值。这从不有效 - 我今天突然想到尝试为客户端和工作进程显式指定它们,一切都开始有效。

尝试指定主机名和端口的所有值,看看这是否适合您。

答案 1 :(得分:2)

如果你使用过这样的东西

  

$ client-> addServers(' 127.0.0.1',4730);

  

$客户端 - > addServers();

使用类似的东西

  

<强> $客户端 - &GT; addServers(&#39; 127.0.0.1:4730&#39);

PS - 我使用过localhost IP,可以用实际主机IP替换。

答案 2 :(得分:1)

在我看来,这没什么不同。当我在循环中放入addServer代码时,我也遇到了同样的错误。

$client = new GearmanClient();
for ($i=0; $i<100000; $i++) {
  $client->addServer("127.0.0.1", 4730);
  $data = json_encode(array('job_id' => $i, 'task_name' => 'send-email'));
  $client->addTaskBackground('sendEmail', $data);
}
$client->runTasks();

这对我来说是固定的:

$client = new GearmanClient();
$client->addServer("127.0.0.1", 4730);
for ($i=0; $i<100000; $i++) {
  $data = json_encode(array('job_id' => $i, 'task_name' => 'send-email'));
  $client->addTaskBackground('sendEmail', $data);
}
$client->runTasks();

答案 3 :(得分:0)

可能这可以帮助某人。 如果要使用单个服务器,可以使用

$client->addServer($host, $port)
e.g. $client->addServer('127.0.0.1', 4730)

http://php.net/manual/en/gearmanclient.addserver.php

如果您想使用多台服务器,则可以使用

$client->addServers($host1:$port1, $host2:$port2, $host3:$port3)
e.g. $client->addServers('127.0.0.1:4730', '127.0.0.2:8080')

http://php.net/manual/en/gearmanclient.addservers.php