Php 为什么Beanstalkd队列中的作业失败-Laravel 4.2

Php 为什么Beanstalkd队列中的作业失败-Laravel 4.2,php,symfony,laravel,queue,beanstalkd,Php,Symfony,Laravel,Queue,Beanstalkd,我的豆茎队列中“随机”有一些作业失败。 两个问题: 1/通过查看数据库中的失败作业表,我如何解释其中记录的内容?当读取原始数据时,数据闭包意味着“什么都没有”。需要做些什么来获取更多信息吗 2/我查看了Laravel的控制台日志,以下是失败的原因: [2015-04-29 15:40:51] production.ERROR: exception 'ErrorException' with message 'Trying to get property of non-object' in /ho

我的豆茎队列中“随机”有一些作业失败。 两个问题:

1/通过查看数据库中的失败作业表,我如何解释其中记录的内容?当读取原始数据时,数据闭包意味着“什么都没有”。需要做些什么来获取更多信息吗

2/我查看了Laravel的控制台日志,以下是失败的原因:

[2015-04-29 15:40:51] production.ERROR: exception 'ErrorException' with message 'Trying to get property of non-object' in /home/forge/api.hello.me/vendor/jeremeamia/SuperClosure/src/Jeremeamia/SuperClosure/SerializableClosure.php(99) : eval()'d code:6
Stack trace:...
但是我不知道到底是什么失败了。。。stacktrace没有帮助,只是从

    [internal function]: Jeremeamia\SuperClosure\SerializableClosure::{closure}(Object(Illuminate\Queue\Jobs\BeanstalkdJob))
#2 /home/forge/api.hello.me/vendor/jeremeamia/SuperClosure/src/Jeremeamia/SuperClosure/SerializableClosure.php(64): ReflectionFunction->invokeArgs(Array)
然后在晚些时候完成了几行

#15 /home/forge/api.hello.me/vendor/symfony/console/Symfony/Component/Console/Application.php(124): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
    #16 /home/forge/api.hello.me/artisan(59): Symfony\Component\Console\Application->run()
    #17 {main} [] []
你知道我如何理解/了解发生了什么吗?队列甚至不是一直在失败

ps:完整堆栈跟踪:

#0 /home/forge/api.hello.me/vendor/jeremeamia/SuperClosure/src/Jeremeamia/SuperClosure/SerializableClosure.php(99) : eval()'d code(6): Illuminate\Exception\Handler->handleError(8, 'Trying to get p...', '/home/forge/api...', 6, Array)
#1 [internal function]: Jeremeamia\SuperClosure\SerializableClosure::{closure}(Object(Illuminate\Queue\Jobs\BeanstalkdJob))
#2 /home/forge/api.hello.me/vendor/jeremeamia/SuperClosure/src/Jeremeamia/SuperClosure/SerializableClosure.php(64): ReflectionFunction->invokeArgs(Array)
#3 /home/forge/api.hello.me/vendor/laravel/framework/src/Illuminate/Queue/IlluminateQueueClosure.php(36): Jeremeamia\SuperClosure\SerializableClosure->__invoke(Object(Illuminate\Queue\Jobs\BeanstalkdJob))
#4 /home/forge/api.hello.me/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(96): IlluminateQueueClosure->fire(Object(Illuminate\Queue\Jobs\BeanstalkdJob), Array)
#5 /home/forge/api.hello.me/vendor/laravel/framework/src/Illuminate/Queue/Jobs/BeanstalkdJob.php(50): Illuminate\Queue\Jobs\Job->resolveAndFire(Array)
#6 /home/forge/api.hello.me/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(205): Illuminate\Queue\Jobs\BeanstalkdJob->fire()
#7 /home/forge/api.hello.me/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(157): Illuminate\Queue\Worker->process('beanstalkd', Object(Illuminate\Queue\Jobs\BeanstalkdJob), '3', '0')
#8 /home/forge/api.hello.me/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(105): Illuminate\Queue\Worker->pop('beanstalkd', 'default', '0', '10', '3')
#9 /home/forge/api.hello.me/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(67): Illuminate\Queue\Console\WorkCommand->runWorker('beanstalkd', 'default', '0', '128', false)
#10 /home/forge/api.hello.me/vendor/laravel/framework/src/Illuminate/Console/Command.php(112): Illuminate\Queue\Console\WorkCommand->fire()
#11 /home/forge/api.hello.me/vendor/symfony/console/Symfony/Component/Console/Command/Command.php(253): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#12 /home/forge/api.hello.me/vendor/laravel/framework/src/Illuminate/Console/Command.php(100): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#13 /home/forge/api.hello.me/vendor/symfony/console/Symfony/Component/Console/Application.php(889): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#14 /home/forge/api.hello.me/vendor/symfony/console/Symfony/Component/Console/Application.php(193): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#15 /home/forge/api.hello.me/vendor/symfony/console/Symfony/Component/Console/Application.php(124): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#16 /home/forge/api.hello.me/artisan(59): Symfony\Component\Console\Application->run()
#17 {main} [] []

Laravel队列的工作方式是将您提供的所有数据序列化为
负载
,并将其粘贴到数据库中。当您处理队列时,它会神奇地取消所有这些数据的序列化,这样您的内存中就有了与您将其放入队列时基本相同的对象。 当您更改序列化对象的类定义,或者您的对象序列化不完全正确(这里似乎就是这种情况)时,就会出现问题

我建议您尽量不要序列化匿名函数,因为Laravel使用超闭函数来实现这一点,而且它非常粗糙

[内部函数]:Jeremeamia\SuperClosure\SerializableClosure::{closure}(对象(照亮\Queue\Jobs\BeanstalkdJob))


尝试将更简单的对象推入Beanstalk队列(即,不要将对象发送到队列),您将不会遇到此问题。

在这种情况下,stacktrace和错误日志似乎没有多大帮助。您是否可以将正在推送到队列中的代码发布?通过查看失败的作业,您可以看到正在调用的类/函数。打印日志,然后找到崩溃的地方。。。你可以从失败的队列中重新推送作业,这样你就可以捕获这些作业并复制它们。我们需要看看你在推什么。嘿@Ravan,NiRR&Bogdan谢谢你回来!很抱歉,无法提前回复。因此,即使我在队列中重新发布它,我也不知道该应用程序正在生产哪个作业(它正在通过哪个控制器等)。你知道我怎么能找到吗?谢谢,我会再次尝试更改,奇怪的是,队列中只会推送ID或字符串,然后在队列中再次加载模型。表中的数据是什么样子的?只有一个ID号,自动递增的ID号。啊。。。用户名也是,也许特殊字符会导致问题?我怀疑。你能直接粘贴数据的SQL转储吗?我会试试。我的另一个问题是,我不知道哪个队列失败,所以我甚至无法发送该特定问题的sql转储。j如何追溯失败的地方?我在许多控制器中有许多队列。。。