我的开发服务器是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"
如果我将gearman_queue表放在test_db中,然后重新启动守护进程,则会重新创建该表,因此它的mysql连接很好,而且它显然正在启动。
我还可以在本地主机上telnet到4730,所以没有防火墙问题。
最初GM在启动时遇到问题,因为它是在mysql之前启动的,所以我编辑了init脚本
### BEGIN INIT INFO
# Provides: gearman-job-server
# Required-Start: $network $remote_fs $syslog mysql
并且CCD_ 3将其设置为之后启动。
我唯一能想到的是,最初我是通过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
我没主意了
我遇到了同样的问题,最近在经历了几天的挫折后解决了它们(很难排除故障,因为有三个过程需要担心:-)
看起来(至少在我的情况下)GearmanClient::addServer()和GearmanWorker::addServer的PHP文档是不正确的。具体来说,文档似乎暗示主机名和端口号是可选的,如果您不指定它们,它将使用localhost和端口4730作为默认值。这个从来都不起作用-今天我突然想到要为客户端和工作进程显式指定它们,然后一切都开始工作了。
尝试指定主机名和端口的所有值,看看这是否适用。
如果您使用了类似的东西
$client->addServers('27.0.0.1',4730);
或
$client->addServers();
使用类似的东西
$client->addServers('27.0.0.1:4730')
PS-我使用了localhost IP,这可以用实际的主机IP代替。
在我的情况下,它有点不同。当我的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();
这可能会对某人有所帮助。如果你想使用单一服务器,你可以使用
$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