mmoreram / GearmanBundle在调用\ GearmanClient方法时抛出异常

时间:2013-09-24 12:50:17

标签: symfony php-5.3 gearman symfony-2.3

当我执行以下代码时:

$Gearman = $this->get('gearman');
$Gearman->doNormalJob('BundleName~test');

我的代码抛出以下异常:

GearmanClient::doNormal() expects parameter 2 to be string, array given

堆栈:

#0 [internal function]: Symfony\Component\Debug\ErrorHandler->handle(2, 'GearmanClient::...', '/Users/reneters...', 178, Array)
#1 /Users/reneterstegen/Sites/core.xxx.nl/vendor/mmoreram/gearman-bundle/Mmoreram/GearmanBundle/Service/GearmanClient.php(178): GearmanClient->doNormal('XXXBundleCoreBu...', Array, NULL)
#2 /Users/reneterstegen/Sites/core.xxx.nl/vendor/mmoreram/gearman-bundle/Mmoreram/GearmanBundle/Service/GearmanClient.php(153): Mmoreram\GearmanBundle\Service\GearmanClient->doEnqueue(Array, Array, 'doNormal', NULL)
#3 /Users/reneterstegen/Sites/core.xxx.nl/vendor/mmoreram/gearman-bundle/Mmoreram/GearmanBundle/Service/GearmanClient.php(266): Mmoreram\GearmanBundle\Service\GearmanClient->enqueue('XXXBundleCoreBu...', Array, 'doNormal', NULL)
#4 /Users/reneterstegen/Sites/core.xxx.nl/src/XXX/Bundle/CoreBundle/Controller/TestController.php(32): Mmoreram\GearmanBundle\Service\GearmanClient->doNormalJob('XXXBundleCoreBu...')
#5 [internal function]: XXX\Bundle\CoreBundle\Controller\TestController->testAction()
#6 /Users/reneterstegen/Sites/core.xxx.nl/app/bootstrap.php.cache(2815): call_user_func_array(Array, Array)
#7 /Users/reneterstegen/Sites/core.xxx.nl/app/bootstrap.php.cache(2789): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#8 /Users/reneterstegen/Sites/core.xxx.nl/app/bootstrap.php.cache(2918): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#9 /Users/reneterstegen/Sites/core.xxx.nl/app/bootstrap.php.cache(2220): Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#10 /Users/reneterstegen/Sites/core.xxx.nl/web/app_dev.php(19): Symfony\Component\HttpKernel\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#11 {main}

当我深入到代码时,此函数抛出异常:

/**
 * Execute a GearmanClient call given a worker, params and a method.
 *
 * If he GarmanClient call is asyncronous, result value will be a handler.
 * Otherwise, will return job result.
 *
 * @param array  $worker Worker definition
 * @param mixed  $params Parameters to send to job
 * @param string $method Method to execute
 * @param string $unique A unique ID used to identify a particular task
 *
 * @return mixed  Return result of the GearmanClient call
 */
private function doEnqueue(Array $worker, $params = '', $method = null, $unique = null)
{
    $gearmanClient = new \GearmanClient();
    $this->assignServers($gearmanClient);

    return $gearmanClient->$method($worker['job']['realCallableName'], $params, $unique);
}

引起:

public function doNormalJob($name, $params = array(), $unique = null)
{

    return $this->enqueue($name, $params, GearmanMethods::GEARMAN_METHOD_DONORMAL, $unique);
}

这是$params = array()的默认值。在链的其余部分,此参数不会更改,因此将为de doNormal方法提供数组。

有谁能告诉我如何解决这个问题?这是一个错误吗?配置错误?还有别的吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

我将此问题发布给捆绑包的开发人员。他们证实这是一个立即修复的错误。

请参阅: https://github.com/mmoreram/GearmanBundle/issues/45

答案 1 :(得分:1)

我不熟悉bundle,但是\ Gearmanclient的doNormal()方法需要一个字符串有效负载(通常采用序列化实体的形式),但是你的接口需要一个数组。

您未向我们展示的部分(“入队”方法)可能会尝试序列化内容,或者可能只是委托。没有看到代码,我们无法确定。

根据您提供的内容,您似乎有以下选项

  1. 将界面更新为默认为数组,但为null
  2. 传递空值作为第二个参数(hacky)。
  3. 有趣的是,为什么它们首先默认为数组,更常见的是它用作有效载荷的对象。

    发布剩下的代码,我们可以更确定地说。