8

我的开发服务器是 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 上远程登录到 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 库似乎很好:

php -i | grep gearman

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

我没主意了

4

4 回答 4

15

我遇到了同样的问题,最近经过几天的挫折后解决了(很难解决,因为要担心三个过程:-)

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

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

于 2013-02-15T18:10:49.070 回答
2

如果您使用过类似的东西

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

或者

$client->addServers();

使用这样的东西

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

PS - 我使用了 localhost IP,这可以替换为实际的主机 IP。

于 2016-04-18T11:43:37.947 回答
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();
于 2019-01-30T14:00:34.000 回答
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

于 2018-05-19T08:05:59.980 回答