«Сериализация« Закрытие »не разрешена» при вызове класса \ Threaded (pthreads) в приложении Symfony - PullRequest
0 голосов
/ 06 сентября 2018

Не могу заставить PthreadsV3 работать с Symfony 4.1.4.

Запуск простого подтверждения концепции в одном файле PHP работает, как и ожидалось, но при перемещении в Symfony ContainerAwareCommand меня приветствует следующая ошибка.

Неустранимая ошибка: необработанное исключение: сериализация «Закрытие» не разрешено в [нет активного файла]: 0 Трассировка стека:

0 {main} добавлено в [нет активного файла] в строке 0

У меня такое ощущение, что это связано с копированием и сериализацией контейнера Symfony в классе \ Threaded. Я пытался исключить пространства имен Thread, Threaded и Worker в списке исключений в services.yaml после предложения в отчете об ошибке , но это не помогло.

Может кто-нибудь объяснить мне, что я делаю не так. В настоящее время я не уверен, возможен ли Symfony 4 с Pthreads.

Следующий код работает из одного файла php.

<?php

$pool = new \Pool(4, TickerWorker::class, []);
for ($i = 0; $i < 10; $i++) {
    $pool->submit(new TickerTask($i));
}

while ($pool->collect()) ;

$pool->shutdown();

echo "Pool done\n";

class TickerWorker extends \Worker
{
    public function __construct()
    {
    }
}

class TickerTask extends \Threaded
{
    protected $complete;
    private $i;

    public function __construct($i)
    {
        echo "$i start\n";
        $this->i = $i;
        $this->complete = false;
    }

    public function run()
    {
        sleep(rand(1, 3));
        echo "$this->i done\n";
        $this->complete = true;
    }

    public function isComplete()
    {
        return $this->complete;
    }
}

Это не работает и выдает исключение

<?php

namespace App\Command;

use App\Pthread\TickerTask;
use App\Pthread\TickerWorker;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
/**
 * Where App\Pthread\TickerWorker and App\Pthread\TickerTask 
 * are the classes as defined in the working example
 */
class CoconutTestCommand extends ContainerAwareCommand
{
    protected static $defaultName = 'coconut:test';

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $pool = new \Pool(4, TickerWorker::class, []);
        for ($i = 0; $i < 10; $i++) {
            $pool->submit(new TickerTask($i));
        }

        while ($pool->collect()) ;

        $pool->shutdown();
        echo "Pool done\n";
    }
}

Сведения об окружающей среде:

  • PHP 7.2.9 (cli) (сборка: 15 августа 2018 23:10:01) (ZTS MSVC15 (Visual C ++ 2017) x64)
  • Pthreads v3 построен: 25.05.2008 8:44
  • Symfony версия 4.1.4

1 Ответ

0 голосов
/ 11 сентября 2018

Внутри команды symfony (2.8) я не заставляю поток (3) работать Моя версия php: PHP 7.2.9-dev (cli) (сборка: 5 сентября 2018 14:13:58) (ZTS)

Но как альтернативное решение:

  • создайте простой php-файл с логикой потока
  • запустите этот php файл с помощью popen
...