Я пытаюсь запустить темы из команды 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 в каждом потоке, что позволяет автозагрузке и всем остальным работать нормально?
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);
}
}
Я добавил это для запуска метода:
$loader = require_once $kernel_root_dir.'/bootstrap.php.cache';
require_once $kernel_root_dir.'/AppKernel.php';
$kernel = new \AppKernel($env, true);
Добавление только автозагрузки фактически загружало все классы, но приводило ко многим другим ошибкам.
Приведенный выше код будет загружать весь Symfony 2, что, вероятно, приведет к увеличению занимаемой площади в каждом потоке.