0

Hellow , I need some hel regarding executing symfony commands inside another command. I am not new with this and I created many commands and run them from inside commands, controllers and it always work. But this one I do not understand why It do not working like the others are. I am running one command all the time and from time to time I created some extra workers when there are many jobs to get this one worker some help (one-check option).

I created command to run beanstalk worker with this class:

<?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>");
    }
}
}

Than I run another command to create some extra workers with this functions:

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);
}

And the problem is that if I run this command from terminal or with cron job it forks but if i run it like that with this function it do not work. I see that command has been executed but for some unknown reason it do not work. If I executed this command i can see all commands has been executed bot they do not perform job like if i run the same command from terminal or with cron job:

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

Output (first one has been run from this function and second one with cron job. And only second one works):

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

Can any one give me some advice why is this not working like other commands? And why the same command run OK if i run it with cron job or inside terminal?

Thanks for help!

1 Answer 1

0

Try using:

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

Mind the quotes.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.