Issues (219)

Command/RunCommand.php (10 issues)

1
<?php
2
3
namespace Dtc\QueueBundle\Command;
4
5
use Dtc\QueueBundle\Exception\ClassNotSubclassException;
6
use Dtc\QueueBundle\Run\Loop;
7
use Dtc\QueueBundle\Util\Util;
8
use Psr\Log\LoggerInterface;
0 ignored issues
show
The type Psr\Log\LoggerInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
9
use Symfony\Component\Console\Command\Command;
0 ignored issues
show
The type Symfony\Component\Console\Command\Command was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
10
use Symfony\Component\Console\Input\InputArgument;
0 ignored issues
show
The type Symfony\Component\Console\Input\InputArgument was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
11
use Symfony\Component\Console\Input\InputInterface;
0 ignored issues
show
The type Symfony\Component\Console\Input\InputInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
12
use Symfony\Component\Console\Input\InputOption;
0 ignored issues
show
The type Symfony\Component\Console\Input\InputOption was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
13
use Symfony\Component\Console\Output\OutputInterface;
0 ignored issues
show
The type Symfony\Component\Console\Output\OutputInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
14
use Symfony\Component\DependencyInjection\Container;
0 ignored issues
show
The type Symfony\Component\DependencyInjection\Container was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
15
use Symfony\Component\HttpKernel\Kernel;
0 ignored issues
show
The type Symfony\Component\HttpKernel\Kernel was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
16
17
class RunCommand extends Command
18
{
19
    protected $loggerPrivate = false;
20
    protected $nanoSleepOption = null;
21
22
    /** @var Loop */
23
    private $runLoop;
24
    /** @var LoggerInterface */
25
    private $logger;
26
    /** @var Container */
27
    private $container;
28
29 1
    protected function symfonyDetect()
30
    {
31 1
        $this->nanoSleepOption = null;
32 1
        if (class_exists('Symfony\Component\HttpKernel\Kernel')) {
33 1
            if (Kernel::VERSION_ID >= 30000) {
34 1
                $this->nanoSleepOption = 's';
35
            }
36 1
            if (Kernel::VERSION_ID >= 30400) {
37 1
                $this->loggerPrivate = true;
38
            }
39
        }
40 1
    }
41
42 1
    protected function configure()
43
    {
44 1
        $this->symfonyDetect();
45
        $options = [
46 1
            new InputArgument('worker-name', InputArgument::OPTIONAL, 'Name of worker', null),
47 1
            new InputArgument('method', InputArgument::OPTIONAL, 'DI method of worker', null),
48 1
            new InputOption(
49 1
                'id',
50 1
                'i',
51 1
                InputOption::VALUE_REQUIRED,
52 1
                'Id of Job to run',
53 1
                null
54
            ),
55 1
            new InputOption(
56 1
                'max-count',
57 1
                'm',
58 1
                InputOption::VALUE_REQUIRED,
59 1
                'Maximum number of jobs to work on before exiting',
60 1
                null
61
            ),
62 1
            new InputOption(
63 1
                'duration',
64 1
                'd',
65 1
                InputOption::VALUE_REQUIRED,
66 1
                'Duration to run for in seconds',
67 1
                null
68
            ),
69 1
            new InputOption(
70 1
                'timeout',
71 1
                't',
72 1
                InputOption::VALUE_REQUIRED,
73 1
                'Process timeout in seconds (hard exit of process regardless)',
74 1
                3600
75
            ),
76 1
            new InputOption(
77 1
                'nano-sleep',
78 1
                $this->nanoSleepOption,
79 1
                InputOption::VALUE_REQUIRED,
80 1
                'If using duration, this is the time to sleep when there\'s no jobs in nanoseconds',
81 1
                500000000
82
            ),
83 1
            new InputOption(
84 1
                'disable-gc',
85 1
                null,
86 1
                InputOption::VALUE_NONE,
87 1
                'Disable garbage collection'
88
            ),
89
        ];
90
91 1
        $options[] =
92 1
            new InputOption(
93 1
                'logger',
94 1
                'l',
95 1
                InputOption::VALUE_REQUIRED,
96 1
                'Log using the logger service specified. Otherwise if not used will output to console. Logger service must be public, otherwise inject one by overriding the definition for this RunCommand service and calling the setLogger() method instead of using this option.'
97
            );
98
99
        $this
100 1
            ->setName('dtc:queue:run')
101 1
            ->setDefinition($options)
102 1
            ->setDescription('Start up a job in queue');
103 1
    }
104
105 1
    public function setRunLoop($runLoop)
106
    {
107 1
        $this->runLoop = $runLoop;
108 1
    }
109
110
    public function setLogger(LoggerInterface $logger)
111
    {
112
        $this->logger = $logger;
113
    }
114
115
    public function setContainer($container)
116
    {
117
        $this->container = $container;
118
    }
119
120 1
    protected function execute(InputInterface $input, OutputInterface $output): int
121
    {
122 1
        $start = microtime(true);
123
        // @TODO: move this to dependency injection.
124 1
        $this->runLoop->setOutput($output);
125 1
        $workerName = $input->getArgument('worker-name');
126 1
        $methodName = $input->getArgument('method');
127 1
        $maxCount = $input->getOption('max-count');
128 1
        $duration = $input->getOption('duration');
129 1
        $processTimeout = $input->getOption('timeout');
130 1
        $nanoSleep = $input->getOption('nano-sleep');
131 1
        $loggerService = !$this->loggerPrivate ? $input->getOption('logger', null) : null;
132 1
        $disableGc = $input->getOption('disable-gc', false);
133 1
        $this->setGc($disableGc);
134
135 1
        $this->setLoggerService($this->runLoop, $loggerService);
136
137 1
        $maxCount = Util::validateIntNull('max_count', $maxCount, 32);
138 1
        $duration = Util::validateIntNull('duration', $duration, 32);
139 1
        $nanoSleep = Util::validateIntNull('nano_sleep', $nanoSleep, 63);
140 1
        $processTimeout = Util::validateIntNull('timeout', $processTimeout, 32);
141 1
        $this->runLoop->checkMaxCountDuration($maxCount, $duration, $processTimeout);
142
143
        // Check to see if there are other instances
144 1
        set_time_limit($processTimeout); // Set timeout on the process
145
146 1
        if ($jobId = $input->getOption('id')) {
147
            $this->runLoop->runJobById($start, $jobId); // Run a single job
0 ignored issues
show
It seems like $start can also be of type string; however, parameter $start of Dtc\QueueBundle\Run\Loop::runJobById() does only seem to accept double, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

147
            $this->runLoop->runJobById(/** @scrutinizer ignore-type */ $start, $jobId); // Run a single job
Loading history...
148
            return $this::SUCCESS;
149
        }
150 1
151
        $this->runLoop->runLoop($start, $workerName, $methodName, $maxCount, $duration, $nanoSleep);
0 ignored issues
show
It seems like $start can also be of type string; however, parameter $start of Dtc\QueueBundle\Run\Loop::runLoop() does only seem to accept double, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

151
        $this->runLoop->runLoop(/** @scrutinizer ignore-type */ $start, $workerName, $methodName, $maxCount, $duration, $nanoSleep);
Loading history...
152
        return $this::SUCCESS;
153
    }
154
155
    /**
156 1
     * @param bool $disableGc
157
     */
158 1
    protected function setGc($disableGc)
159
    {
160
        if ($disableGc) {
161
            if (gc_enabled()) {
162
                gc_disable();
163
            }
164
165
            return;
166 1
        }
167
168
        if (!gc_enabled()) {
169 1
            gc_enable();
170
        }
171 1
    }
172
173 1
    protected function setLoggerService(Loop $loop, $loggerService)
174 1
    {
175
        if (!$loggerService) {
176
            return;
177
        }
178
179
        $logger = $this->container->get($loggerService);
180
        if (!$logger instanceof LoggerInterface) {
181
            throw new ClassNotSubclassException("$loggerService must be instance of Psr\\Log\\LoggerInterface");
182
        }
183
        $loop->setLogger($logger);
184
    }
185
}
186