Повышение Symfony 2 для pthread из команды

Я пытаюсь запустить темы из команды Symfony 2.

protected function execute(InputInterface $input, OutputInterface $output)
{
$parser = $this->getContainer()->get('app.article.parser');
$providers = $parser->getProviders();
foreach ($providers as $name=>$provider)
{
$parseThread = new ParseThread($parser, $name);
$parseThread->start();
}
}

Класс ParseThread:

class ParseThread extends \Thread
{

private $parser;
private $providerName;

function __construct (Parser $parser, $providerName)
{
$this->parser       = $parser;
$this->providerName = $providerName;
}

public function run ()
{
$this->parser->parse($this->providerName);
}

}

$ this-> parser-> parse (…) должен, как я понимаю, запускаться в новом потоке.
Внутри метода разбора, основанного на строке $ providerName, инициализируется группа классов.

Проблема здесь в том, что новый поток не имеет загруженной Symfony 2 и, следовательно, не имеет автозагрузки композитора — поэтому мои классы не загружаются.

Есть ли какой-нибудь разумный способ загрузить Symfony 2 в каждом потоке, что позволяет автозагрузке и всем остальным работать нормально?

2

Решение

PThreads не наследует автозагрузку.
Это, однако, не должно иметь большого значения. Вы можете просто сделать:

<?php

class ParseThread extends \Thread
{

private $parser;
private $providerName;

function __construct (Parser $parser, $providerName)
{
$this->parser       = $parser;
$this->providerName = $providerName;
}

public function run ()
{
require_once 'location/to/vendor/autoload.php';
$this->parser->parse($this->providerName);
}

}
3

Другие решения

Я добавил это для запуска метода:

    $loader = require_once $kernel_root_dir.'/bootstrap.php.cache';
require_once $kernel_root_dir.'/AppKernel.php';
$kernel = new \AppKernel($env, true);

Добавление только автозагрузки фактически загружало все классы, но приводило ко многим другим ошибкам.
Приведенный выше код будет загружать весь Symfony 2, что, вероятно, приведет к увеличению занимаемой площади в каждом потоке.

1

По вопросам рекламы [email protected]