Как исправить ошибку сегментации при использовании контейнера Symfony с pthreads?

#php #symfony #pthreads

#php #symfony #pthreads

Вопрос:

Я использую Symfony 3 и php pthreads в своем проекте. Мне нужно получить доступ к entity manager из потока. Я прочитал какой-то способ, как это сделать в StackOverflow и в отслеживателе проблем pthreads.

 class BaseBackgroundThread extends Thread
{
    private $container;
    private $env;
    private $debug;

    public function __construct($env, $debug)
    {
        $this->env = $env;
        $this->debug = $debug;
    }

    public function run()
    {
        require 'app/autoload.php';
        include_once 'var/bootstrap.php.cache';

        $kernel = new AppKernel($this->env, $this->debug);
        $kernel->loadClassCache();
        $kernel->boot();

        $this->container = $kernel->getContainer();
    }

    public function start(int $options = null)
    {
        return parent::start(PTHREADS_INHERIT_NONE);
    }
}
  

Но есть одна проблема. Я получаю сообщение segmentation fault (core dumped) об ошибке при вызове $kernel->getContainer() .

Обновить:

Я понял, что $kernel->getContainer() это не приводит к сбою. Но $this->container = $kernel->getContainer() вызывает сбой.

Обновление 2:
$this->container = $kernel->getContainer() вызывает сбой
self::$container = $kernel->getContainer() также вызывает сбой
$container = $kernel->getContainer() не вызывает сбоя.

Обновление 3:

Я попытался запустить его на версии php PHP 5.6.27RC1 (cli) (built: Oct 12 2016 02:24:27)

И получил эту ошибку.

Fatal error: Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDO instances' in /root/TheBuggestBot/src/TheBuggestBot/CoreBundle/BackgroundThread/BaseBackgroundThread.php:27
zend_mm_heap corrupted

Но в этом (https://github.com/krakjoe/pthreads/issues/369 ) в обсуждении говорилось, что этот код работает.

PS Проблема на github -> https://github.com/krakjoe/pthreads/issues/629

Комментарии:

1. Можете ли вы вообще сериализовать контейнер? Существует высокая вероятность попадания в ссылочный цикл, что приведет к переполнению стека. Какова мотивация этого?

2. Я пытался использовать getContainer без сериализации, но у меня такая же ошибка. Я пытался сериализовать контейнер, потому что читал в других обсуждениях, что это единственный способ создать поток, используя нормальный объем памяти (люди пишут, что без сериализации объекты не собираются GC и занимают много памяти)

3. Фиктивный вопрос, но вы уверены, что используете это в потокобезопасной версии PHP? Кроме того, какая это версия PHP?

4. Да, я уверен. Версия PHP: PHP 7.0.5-4 donate.sury.org ~ubuntu 1 (cli) (ZTS ) Он был установлен из специального PPA, где php компилировался с включенным ZTS.

5. В этом случае я бы сначала попробовал протестировать код на некоторых 5.6 и посмотреть, не сломается ли он. Из того, что вы описали, похоже $this , это проблема. Это почти, как если бы объект был уничтожен преждевременно, поэтому присвоение члену класса не могло произойти (в основном NPE , но намного неприятнее)