Команда Symfony, запущенная внутри другой команды, не работает

Здравствуйте, мне нужна помощь по выполнению команд symfony внутри другой команды. Я не новичок в этом, и я создал много команд и запускаю их из внутренних команд, контроллеров, и это всегда работает. Но этот я не понимаю, почему он не работает, как другие. Я все время запускаю одну команду и время от времени создаю несколько дополнительных рабочих, когда есть много заданий, чтобы помочь этому одному рабочему (опция с одной проверкой).

Я создал команду для запуска beanstalk worker с этим классом:

<?php

namespace AppBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Command\LockableTrait;

/**
 * Class BeanstalkWorkerCommand 
 * Command start the Beanstalk worker. Get the job from queue and preform job
 *
 * @method configure()
 * @method execute(InputInterface $input, OutputInterface $output)
 * @method authenticateUser(InputInterface $input, OutputInterface $output)
 * @method checkAuthentication($username, $password)
 */
class BeanstalkWorkerCommand extends ContainerAwareCommand
{
use LockableTrait;

protected function configure()
{
    $this
        ->setName('beanstalk:worker:start')
        ->setDescription('Start the Beanstalk infinitive worker. Get the job from queue and preform job')
        ->addOption(
            'one-check',
            'o',
            InputOption::VALUE_NONE,
            'If set, the worker will check tubes only once and died if there is no jobs in queue'
        )
    ;
}

protected function execute(InputInterface $input, OutputInterface $output)
{
    $output->writeln("\n<info>Beanstalk worker service started</info>");
    $tubes = $this->getContainer()->get('app.job_manager.power_plant')->getTubes();

    if ($input->getOption('one-check')) {
        // run once
        foreach ($tubes as $tubeName) {
            if ($tubeName != "default") {
                $this->getContainer()->get('app.queue_manager')->fetchQueue($tubeName);
            }
        }
        $output->writeln("\n<info>Beanstalk worker completed check and stoped</info>");
    } else {
        // run forever
        set_time_limit(0);
        ini_set('xdebug.max_nesting_level', 1000);
        if (!$this->lock()) {
            $output->writeln('The command is already running in another process.');

            return 0;
        }
        while (1) {
            foreach ($tubes as $tubeName) {
                if ($tubeName != "default") {
                    $this->getContainer()->get('app.queue_manager')->fetchQueue($tubeName);
                }
                sleep(0.1);
            }
        }
        $output->writeln("\n<error>Beanstalk worker service has stoped</error>");
    }
}
}

Затем я запускаю другую команду, чтобы создать дополнительных рабочих с этими функциями:

public function startExtraWorkers(OutputInterface $output)
{
    $numOfExtraWorkers = $this->getContainer()->getParameter('num_of_extra_beanstalk_workers');

    for ($i=0; $i < $numOfExtraWorkers; $i++) {
        $payload = [
            "--one-check"   =>   TRUE
        ];
        $this->getContainer()->get('app.job_manager.queue')->createAndSendToQueue('beanstalk:worker:start', $payload, 10);
    }
    $output->writeln("\n<question>".$numOfExtraWorkers." extra benastalk workers started!</question>");

    return TRUE;
}

public function createAndSendToQueue($command, $payload, $priority = 65536)
{
    $jobData = $this->createJob($command, $payload);

    return $this->job->enqueue($command, $jobData, $priority);
}

public function enqueue($job, array $args, $priority = 65536, $delay = 0, $ttr = 120)
{
    if (!preg_match('/[a-z0-9\.]+/i', $job)) {
        throw new InvalidArgumentException("Invalid job name");
    }
    $args = json_encode($args);

    return $this->pheanstalk->put($args, $priority, $delay, $ttr);
}

И проблема в том, что если я запускаю эту команду из терминала или с помощью cron, она разветвляется, но если я запускаю ее так с этой функцией, она не работает. Я вижу, что команда была выполнена, но по какой-то неизвестной причине она не работает. Если я выполнил эту команду, я вижу, что все команды были выполнены ботом, они не выполняют работу, как если бы я запускал ту же команду из терминала или с заданием cron:

ps ax |grep "beanstalk:worker:start --one-check"

Вывод (первый был запущен из этой функции, а второй - с заданием cron. И работает только второй):

31934 ?        Ss     0:00 /bin/sh -c /usr/bin/php /var/www/mose-base/bin/console beanstalk:worker:start --one-check
31935 ?        S      0:00 /usr/bin/php /var/www/mose-base/bin/console beanstalk:worker:start --one-check

Может ли кто-нибудь дать мне совет, почему это не работает, как другие команды? И почему одна и та же команда работает нормально, если я запускаю ее с заданием cron или внутри терминала?

Спасибо за помощь!


person sanof    schedule 13.02.2018    source источник


Ответы (1)


Попробуйте использовать:

/bin/sh -c '/usr/bin/php /var/www/mose-base/bin/console beanstalk:worker:start --one-check'

Обратите внимание на цитаты.

person Marko    schedule 15.02.2018