Laravel 5 - Команды в очереди, вызывающие ошибку spl_autoload_call ()

ОБНОВЛЕНИЕ. Это было сужено до 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();
        }
    }

person NightMICU    schedule 03.04.2015    source источник
comment
Никто?? Решение на данный момент: iron.io :/   -  person NightMICU    schedule 04.04.2015


Ответы (1)


В прошлом я также сталкивался с подобной проблемой при десериализации. Проблема заключалась в размере задания Beanstalk по умолчанию (65 535 байт), который может быть недостаточно большим, если сериализуемый класс содержит множество свойств, которые необходимо сохранить (увеличение размера сериализованной строки и использование более 65 КБ для хранения).

Чтобы решить эту проблему, попробуйте установить размер 131 072 или даже 262 144 байта, используя параметр -z в файле конфигурации (/etc/default/beanstalkd):

BEANSTALKD_EXTRA="-z 262144"

После этого следует перезапустить службу.

Также обратите внимание, что путь к файлу конфигурации может быть другим, в зависимости от используемого вами дистрибутива.

А поскольку вы используете Digital Ocean, вы можете найти их документация полезная.

person Quetzy Garcia    schedule 16.04.2015
comment
Как-то вышло из головы. Даже самые простые задачи, выполняемые в команде, такие как запись Hello World в журнал, не увенчались успехом. Ничего сверхсложного не происходит с кучей свойств. - person NightMICU; 18.04.2015
comment
Но вы хотя бы пытались увеличить размер задания, чтобы увидеть, работает ли это? В документации есть примечание о таких проблемах: Вместо того, чтобы делать объекты доступными для замыканий в очереди с помощью директивы use, рассмотрите возможность передачи первичных ключей и повторного извлечения связанных моделей из задания очереди. Это часто позволяет избежать неожиданного поведения при сериализации. - person Quetzy Garcia; 18.04.2015
comment
Ааа вот это уже интересно. Сейчас я использую Iron, но в прошлом у меня были проблемы с беглыми заданиями, поэтому я надеялся сохранить все на Beantsalk. Я поковыряюсь и отчитаюсь, когда будет время. Мне просто запустить beanstalkd -z 26144 в терминале? - person NightMICU; 18.04.2015
comment
Вам просто нужно отредактировать файл конфигурации для Beanstalk и перезапустить службу. Смотрите мой обновленный ответ. - person Quetzy Garcia; 18.04.2015