This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | namespace Laravoole\Commands; |
||
4 | |||
5 | use ReflectionClass; |
||
6 | |||
7 | use Illuminate\Console\Command; |
||
8 | use Symfony\Component\Console\Input\InputOption; |
||
9 | |||
10 | class LaravooleCommand extends Command |
||
11 | { |
||
12 | /** |
||
13 | * The name and signature of the console command. |
||
14 | * |
||
15 | * @var string |
||
16 | */ |
||
17 | protected $signature = 'laravoole {action : start | stop | reload | reload_task | restart | quit}'; |
||
18 | |||
19 | /** |
||
20 | * The console command description. |
||
21 | * |
||
22 | * @var string |
||
23 | */ |
||
24 | protected $description = 'Laravoole control utilities'; |
||
25 | |||
26 | /** |
||
27 | * Create a new command instance. |
||
28 | * |
||
29 | * @return void |
||
0 ignored issues
–
show
|
|||
30 | */ |
||
31 | public function __construct() |
||
32 | { |
||
33 | parent::__construct(); |
||
34 | } |
||
35 | |||
36 | /** |
||
37 | * Execute the console command before Laravel < 5.5. |
||
38 | * |
||
39 | * @return mixed |
||
40 | */ |
||
41 | public function fire() |
||
42 | { |
||
43 | $this->handle(); |
||
44 | } |
||
45 | |||
46 | /** |
||
47 | * Execute the console command. |
||
48 | * |
||
49 | * @return mixed |
||
50 | */ |
||
51 | public function handle() |
||
52 | { |
||
53 | switch ($action = $this->argument('action')) { |
||
54 | |||
55 | case 'start': |
||
56 | $this->start(); |
||
57 | break; |
||
58 | case 'restart': |
||
59 | $pid = $this->sendSignal(SIGTERM); |
||
0 ignored issues
–
show
Are you sure the assignment to
$pid is correct as $this->sendSignal(SIGTERM) (which targets Laravoole\Commands\LaravooleCommand::sendSignal() ) seems to always return null.
This check looks for function or method calls that always return null and whose return value is assigned to a variable. class A
{
function getObject()
{
return null;
}
}
$a = new A();
$object = $a->getObject();
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.
Loading history...
|
|||
60 | $time = 0; |
||
61 | while (posix_getpgid($pid) && $time <= 10) { |
||
62 | usleep(100000); |
||
63 | $time++; |
||
64 | } |
||
65 | if ($time > 100) { |
||
66 | echo 'timeout' . PHP_EOL; |
||
67 | exit(1); |
||
0 ignored issues
–
show
The method
handle() contains an exit expression.
An exit expression should only be used in rare cases. For example, if you write a short command line script. In most cases however, using an
Loading history...
|
|||
68 | } |
||
69 | $this->start(); |
||
70 | break; |
||
71 | case 'stop': |
||
72 | case 'quit': |
||
73 | case 'reload': |
||
74 | case 'reload_task': |
||
0 ignored issues
–
show
The case body in a switch statement must start on the line following the statement.
According to the PSR-2, the body of a case statement must start on the line immediately following the case statement. switch ($expr) {
case "A":
doSomething(); //right
break;
case "B":
doSomethingElse(); //wrong
break;
} To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.
Loading history...
|
|||
75 | |||
76 | $map = [ |
||
77 | 'stop' => SIGTERM, |
||
78 | 'quit' => SIGQUIT, |
||
79 | 'reload' => SIGUSR1, |
||
80 | 'reload_task' => SIGUSR2, |
||
81 | ]; |
||
82 | $this->sendSignal($map[$action]); |
||
83 | break; |
||
84 | |||
85 | } |
||
86 | } |
||
87 | |||
88 | protected function sendSignal($sig) |
||
89 | { |
||
90 | if ($pid = $this->getPid()) { |
||
91 | |||
92 | posix_kill($pid, $sig); |
||
93 | } else { |
||
94 | |||
95 | echo "not running!" . PHP_EOL; |
||
96 | exit(1); |
||
0 ignored issues
–
show
The method
sendSignal() contains an exit expression.
An exit expression should only be used in rare cases. For example, if you write a short command line script. In most cases however, using an
Loading history...
|
|||
97 | } |
||
98 | } |
||
99 | |||
100 | protected function start() |
||
101 | { |
||
102 | if ($this->getPid()) { |
||
0 ignored issues
–
show
The expression
$this->getPid() of type string|false is loosely compared to true ; this is ambiguous if the string can be empty. You might want to explicitly use !== false instead.
In PHP, under loose comparison (like For '' == false // true
'' == null // true
'ab' == false // false
'ab' == null // false
// It is often better to use strict comparison
'' === false // false
'' === null // false
Loading history...
|
|||
103 | echo 'already running' . PHP_EOL; |
||
104 | exit(1); |
||
0 ignored issues
–
show
The method
start() contains an exit expression.
An exit expression should only be used in rare cases. For example, if you write a short command line script. In most cases however, using an
Loading history...
|
|||
105 | } |
||
106 | |||
107 | $mode = config('laravoole.base_config.mode'); |
||
108 | if (!$mode) { |
||
109 | echo "Laravoole needs Swoole or Workerman." . PHP_EOL . |
||
110 | "You can install Swoole by command:" . PHP_EOL . |
||
111 | " pecl install swoole" . PHP_EOL . |
||
112 | "Or you can install Workerman by command:" . PHP_EOL . |
||
113 | " composer require workerman/workerman" . PHP_EOL; |
||
114 | exit; |
||
0 ignored issues
–
show
The method
start() contains an exit expression.
An exit expression should only be used in rare cases. For example, if you write a short command line script. In most cases however, using an
Loading history...
|
|||
115 | } |
||
116 | |||
117 | if(!class_exists($wrapper = "Laravoole\\Wrapper\\{$mode}Wrapper")) { |
||
118 | $wrapper = $mode; |
||
119 | } |
||
120 | $ref = new ReflectionClass($wrapper); |
||
121 | $wrapper_file = $ref->getFileName(); |
||
122 | |||
123 | $handler_config = []; |
||
124 | $params = $wrapper::getParams(); |
||
125 | foreach ($params as $paramName => $default) { |
||
126 | if (is_int($paramName)) { |
||
127 | $paramName = $default; |
||
128 | $default = null; |
||
129 | } |
||
130 | $key = $paramName; |
||
131 | $value = config("laravoole.handler_config.{$key}", function () use ($key, $default) { |
||
132 | return env("LARAVOOLE_" . strtoupper($key), $default); |
||
133 | }); |
||
134 | if ($value !== null) { |
||
135 | if ((is_array($value) || is_object($value)) && is_callable($value)) { |
||
136 | $value = $value(); |
||
137 | } |
||
138 | $handler_config[$paramName] = $value; |
||
139 | } |
||
140 | |||
141 | } |
||
142 | |||
143 | $host = config('laravoole.base_config.host'); |
||
144 | $port = config('laravoole.base_config.port'); |
||
145 | $socket = @stream_socket_server("tcp://{$host}:{$port}"); |
||
146 | if(!$socket) { |
||
147 | throw new \Exception("Address {$host}:{$port} already in use", 1); |
||
148 | } else { |
||
149 | fclose($socket); |
||
150 | } |
||
151 | |||
152 | $configs = [ |
||
153 | 'host' => $host, |
||
154 | 'port' => $port, |
||
155 | 'wrapper_file' => $wrapper_file, |
||
156 | 'wrapper' => $wrapper, |
||
157 | 'pid_file' => config('laravoole.base_config.pid_file'), |
||
158 | 'root_dir' => base_path(), |
||
159 | 'callbacks' => config('laravoole.base_config.callbacks'), |
||
160 | // for swoole / workerman |
||
161 | 'handler_config' => $handler_config, |
||
162 | // for wrapper, like http / fastcgi / websocket |
||
163 | 'wrapper_config' => config('laravoole.wrapper_config'), |
||
164 | 'base_config' => config('laravoole.base_config'), |
||
165 | ]; |
||
166 | |||
167 | $handle = popen(PHP_BINARY . ' ' . __DIR__ . '/../../src/Entry.php', 'w'); |
||
168 | fwrite($handle, serialize($configs)); |
||
169 | fclose($handle); |
||
170 | } |
||
171 | |||
172 | protected function getPid() |
||
173 | { |
||
174 | |||
175 | $pid_file = config('laravoole.base_config.pid_file'); |
||
176 | if (file_exists($pid_file)) { |
||
177 | $pid = file_get_contents($pid_file); |
||
178 | if (posix_getpgid($pid)) { |
||
179 | return $pid; |
||
180 | } else { |
||
181 | unlink($pid_file); |
||
182 | } |
||
183 | } |
||
184 | return false; |
||
185 | } |
||
186 | |||
187 | } |
||
188 |
Adding a
@return
annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.Please refer to the PHP core documentation on constructors.