更新 - 已经缩小为beanstalkd,sync
正常工作
尝试在生产环境中运行排队命令时,我收到以下错误:
exception 'ErrorException' with message 'unserialize(): Function spl_autoload_call() hasn't defined the class it was called for'
in /home/forge/default/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php:74
我已经尝试过beanstalkd和数据库驱动程序,没有变化。为简单起见,我使用以下命令:
<?php namespace App\Commands;
use App\Commands\Command;
use App\User;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldBeQueued;
class TestQueueCommand extends Command implements SelfHandling, ShouldBeQueued {
use InteractsWithQueue, SerializesModels;
/**
* @var User
*/
private $user;
/**
* Create a new command instance.
*
* @param User $user
*/
public function __construct(User $user)
{
//
$this->user = $user;
}
/**
* Execute the command.
*
* @return void
*/
public function handle()
{
\Log::info("You gave me " . $this->user->fullName());
}
}
调度代码:
get('queue-test', function()
{
Bus::dispatch(new TestQueueCommand(User::first()));
});
这适用于我的Homestead环境,生产失败(Digital Ocean,Forge)。我有几个beanstalkd工作者,我尝试重新启动它们。我还运行了php artisan queue:flush
。
以下是发生错误的代码(来自源代码):
/**
* Handle the queued job.
*
* @param \Illuminate\Contracts\Queue\Job $job
* @param array $data
* @return void
*/
public function call(Job $job, array $data)
{
$command = $this->setJobInstanceIfNecessary(
$job, unserialize($data['command'])
);
$this->dispatcher->dispatchNow($command, function($handler) use ($job)
{
$this->setJobInstanceIfNecessary($job, $handler);
});
if ( ! $job->isDeletedOrReleased())
{
$job->delete();
}
}
答案 0 :(得分:1)
过去,我在反序列化时遇到了类似的问题。问题是默认的Beanstalk作业大小(65,535字节),如果被序列化的类包含许多需要保留的属性(增加序列化字符串的大小并使用超过65K的存储空间),则可能不够大。
为了解决这个问题,请尝试在配置文件(-z
)上使用/etc/default/beanstalkd
选项将大小设置为131,072或甚至262,144字节:
BEANSTALKD_EXTRA="-z 262144"
之后,您应该重新启动该服务。
另请注意,配置文件路径可能是其他路径,具体取决于您使用的分配。
由于你正在使用Digital Ocean,你可能会发现他们documentation很有用。