#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
, но намного неприятнее)