gubin_niko
@gubin_niko

Pthreads, Laravel Commands и Closure — Как исправить Serialization of 'Closure' is not allowed?

Добрый день, товарищи.

Есть необходимость выполнить определённый процесс в несколько потоков. Открыл для себя расширение для php - pthreads.

На примере простого скрипта вне Laravel всё работает замечательно и мне очень понравились результаты. Решил перенести в Laravel и столкнулся с проблемой. Конечно же я поискал в сети, отыскал несколько вопросов на stackoverflow, где отвечал сам автор расширения. Но мне не помогли его ответы, потому я прошу вас помочь мне.

Вопрос с ответом автора расширения.

Есть класс App\Commands\QuestionsParserCommand. Внутри я создаю экземпляр класса App\My\Questions\QuestionsParser и вызываю метод init. Дальше код метода init():

// Создадим пул
$pool = new Pool($this->threads, ParserWorkers::class);

// Создадим класс потока
$thread = new class extends Threaded
{
  public function run()
  {
    // Класс будет получать определённые данные из некого провайдера,
    // который будет распределяться между потоками через ParserWorkers
    // Работать с API и сохранять данные в БД.
    // Необходима работа с потоками, ибо данных для обработки невероятно много

    echo '+';
  }
};

// Запустим потоки
for ($i = 0; $i < $this->threads; $i++) {
  $pool->submit($thread);
}

$pool->shutdown();


Класс ParserWorkers наследуется от Worker и пока имеет пустой метод run().

В итоге я запускаю сценарий и получаю в логах сообщение:

[13-Oct-2016 11:27:35 Europe/Moscow] PHP Fatal error: Uncaught Exception: Serialization of 'Closure' is not allowed in [no active file]:0
Stack trace:
#0 {main}
thrown in [no active file] on line 0


Сведения:
Laravel 5.2.43, php 7.0.8, Windows

P.S. Пожалуйста, не предлагайте планировщик задач Laravel или очереди, я прекрасно про них помню, но они не совсем подходят для моей задачи.

Благодарю за любую помощь.
  • Вопрос задан
  • 813 просмотров
Пригласить эксперта
Ответы на вопрос 1
romy4
@romy4
Exception handler
Вам надо создавать не анонимный класс
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы