当我执行以下代码时:
$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方法提供数组。
有谁能告诉我如何解决这个问题?这是一个错误吗?配置错误?还有别的吗?
提前致谢!
答案 0 :(得分:2)
我将此问题发布给捆绑包的开发人员。他们证实这是一个立即修复的错误。
答案 1 :(得分:1)
我不熟悉bundle,但是\ Gearmanclient的doNormal()方法需要一个字符串有效负载(通常采用序列化实体的形式),但是你的接口需要一个数组。
您未向我们展示的部分(“入队”方法)可能会尝试序列化内容,或者可能只是委托。没有看到代码,我们无法确定。
根据您提供的内容,您似乎有以下选项
有趣的是,为什么它们首先默认为数组,更常见的是它用作有效载荷的对象。
发布剩下的代码,我们可以更确定地说。