Passed
Push — master ( 9df607...1628c2 )
by Biao
04:03
created

Server::onHandShake()   B

Complexity

Conditions 7
Paths 10

Size

Total Lines 41
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 7
eloc 23
c 1
b 0
f 1
nc 10
nop 2
dl 0
loc 41
rs 8.6186
1
<?php
2
0 ignored issues
show
Coding Style introduced by
Missing file doc comment
Loading history...
3
namespace Hhxsv5\LaravelS\Swoole;
4
5
use Hhxsv5\LaravelS\Illuminate\LogTrait;
6
use Hhxsv5\LaravelS\Swoole\Process\ProcessTitleTrait;
7
use Hhxsv5\LaravelS\Swoole\Socket\PortInterface;
8
use Hhxsv5\LaravelS\Swoole\Task\BaseTask;
9
use Hhxsv5\LaravelS\Swoole\Task\Event;
10
use Hhxsv5\LaravelS\Swoole\Task\Listener;
11
use Hhxsv5\LaravelS\Swoole\Task\Task;
12
use Swoole\Http\Request as SwooleRequest;
13
use Swoole\Http\Response as SwooleResponse;
14
use Swoole\Http\Server as HttpServer;
15
use Swoole\Server\Port;
16
use Swoole\Table;
17
use Swoole\WebSocket\Server as WebSocketServer;
18
19
class Server
0 ignored issues
show
Coding Style introduced by
Missing doc comment for class Server
Loading history...
20
{
21
    use LogTrait;
22
    use ProcessTitleTrait;
23
24
    /**@var array */
0 ignored issues
show
Coding Style introduced by
The open comment tag must be the only content on the line
Loading history...
Coding Style introduced by
Missing short description in doc comment
Loading history...
Coding Style introduced by
The close comment tag must be the only content on the line
Loading history...
25
    protected $conf;
26
27
    /**@var HttpServer|WebSocketServer */
0 ignored issues
show
Coding Style introduced by
The open comment tag must be the only content on the line
Loading history...
Coding Style introduced by
Missing short description in doc comment
Loading history...
Coding Style introduced by
The close comment tag must be the only content on the line
Loading history...
28
    protected $swoole;
29
30
    /**@var bool */
0 ignored issues
show
Coding Style introduced by
The open comment tag must be the only content on the line
Loading history...
Coding Style introduced by
Missing short description in doc comment
Loading history...
Coding Style introduced by
The close comment tag must be the only content on the line
Loading history...
31
    protected $enableWebSocket = false;
32
33
    /**@var array */
0 ignored issues
show
Coding Style introduced by
The open comment tag must be the only content on the line
Loading history...
Coding Style introduced by
Missing short description in doc comment
Loading history...
Coding Style introduced by
The close comment tag must be the only content on the line
Loading history...
34
    protected $attachedSockets = [];
35
36
    protected function __construct(array $conf)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function __construct()
Loading history...
37
    {
38
        $this->conf = $conf;
39
        $this->enableWebSocket = !empty($this->conf['websocket']['enable']);
40
        $this->attachedSockets = empty($this->conf['sockets']) ? [] : $this->conf['sockets'];
41
42
        $ip = isset($conf['listen_ip']) ? $conf['listen_ip'] : '127.0.0.1';
43
        $port = isset($conf['listen_port']) ? $conf['listen_port'] : 5200;
44
        $socketType = isset($conf['socket_type']) ? (int)$conf['socket_type'] : SWOOLE_SOCK_TCP;
45
46
        if ($socketType === SWOOLE_SOCK_UNIX_STREAM) {
47
            $socketDir = dirname($ip);
48
            if (!file_exists($socketDir) && !mkdir($socketDir) && !is_dir($socketDir)) {
49
                throw new \RuntimeException(sprintf('Directory "%s" was not created', $socketDir));
50
            }
51
        }
52
53
        $settings = isset($conf['swoole']) ? $conf['swoole'] : [];
54
        $settings['enable_static_handler'] = !empty($conf['handle_static']);
55
56
        $serverClass = $this->enableWebSocket ? WebSocketServer::class : HttpServer::class;
57
        if (isset($settings['ssl_cert_file'], $settings['ssl_key_file'])) {
58
            $this->swoole = new $serverClass($ip, $port, SWOOLE_PROCESS, $socketType | SWOOLE_SSL);
59
        } else {
60
            $this->swoole = new $serverClass($ip, $port, SWOOLE_PROCESS, $socketType);
61
        }
62
63
        $this->swoole->set($settings);
64
65
        $this->bindBaseEvents();
66
        $this->bindHttpEvents();
67
        $this->bindTaskEvents();
68
        $this->bindWebSocketEvents();
69
        $this->bindAttachedSockets();
70
        $this->bindSwooleTables();
71
    }
72
73
    protected function bindBaseEvents()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindBaseEvents()
Loading history...
74
    {
75
        $this->swoole->on('Start', [$this, 'onStart']);
76
        $this->swoole->on('Shutdown', [$this, 'onShutdown']);
77
        $this->swoole->on('ManagerStart', [$this, 'onManagerStart']);
78
        $this->swoole->on('ManagerStop', [$this, 'onManagerStop']);
79
        $this->swoole->on('WorkerStart', [$this, 'onWorkerStart']);
80
        $this->swoole->on('WorkerStop', [$this, 'onWorkerStop']);
81
        $this->swoole->on('WorkerError', [$this, 'onWorkerError']);
82
        $this->swoole->on('PipeMessage', [$this, 'onPipeMessage']);
83
    }
84
85
    protected function bindHttpEvents()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindHttpEvents()
Loading history...
86
    {
87
        $this->swoole->on('Request', [$this, 'onRequest']);
88
    }
89
90
    protected function bindTaskEvents()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindTaskEvents()
Loading history...
91
    {
92
        if (!empty($this->conf['swoole']['task_worker_num'])) {
93
            $this->swoole->on('Task', [$this, 'onTask']);
94
            $this->swoole->on('Finish', [$this, 'onFinish']);
95
        }
96
    }
97
98
    protected function triggerWebSocketEvent($method, array $params)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function triggerWebSocketEvent()
Loading history...
99
    {
100
        $this->callWithCatchException(function () use ($method, $params) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
101
            $handler = $this->getWebSocketHandler();
102
103
            if (method_exists($handler, $method)) {
104
                call_user_func_array([$handler, $method], $params);
105
            } elseif ($method === 'onHandShake') {
106
                // Set default HandShake
107
                call_user_func_array([$this, 'onHandShake'], $params);
108
            }
109
        });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
110
    }
111
112
    protected function bindWebSocketEvents()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindWebSocketEvents()
Loading history...
113
    {
114
        if ($this->enableWebSocket) {
115
            $this->swoole->on('HandShake', function () {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
116
                $this->triggerWebSocketEvent('onHandShake', func_get_args());
117
            });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
118
119
            $this->swoole->on('Open', function () {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
120
                $this->triggerWebSocketEvent('onOpen', func_get_args());
121
            });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
122
123
            $this->swoole->on('Message', function () {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
124
                $this->triggerWebSocketEvent('onMessage', func_get_args());
125
            });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
126
127
            $this->swoole->on('Close', function (WebSocketServer $server, $fd, $reactorId) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
128
                $clientInfo = $server->getClientInfo($fd);
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $clientInfo is correct as $server->getClientInfo($fd) targeting Swoole\Server::getClientInfo() 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 getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
129
                if (isset($clientInfo['websocket_status']) && $clientInfo['websocket_status'] === \WEBSOCKET_STATUS_FRAME) {
130
                    $this->triggerWebSocketEvent('onClose', func_get_args());
131
                }
132
                // else ignore the close event for http server
133
            });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
134
        }
135
    }
136
137
    protected function bindAttachedSockets()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindAttachedSockets()
Loading history...
138
    {
139
        foreach ($this->attachedSockets as $socket) {
140
            if (isset($socket['enable']) && !$socket['enable']) {
141
                continue;
142
            }
143
144
            $port = $this->swoole->addListener($socket['host'], $socket['port'], $socket['type']);
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $port is correct as $this->swoole->addListen...ort'], $socket['type']) targeting Swoole\Server::addlistener() 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 getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
145
            if (!($port instanceof Port)) {
146
                $errno = method_exists($this->swoole, 'getLastError') ? $this->swoole->getLastError() : 'unknown';
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->swoole->getLastError() targeting Swoole\Server::getLastError() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
147
                $errstr = sprintf('listen %s:%s failed: errno=%s', $socket['host'], $socket['port'], $errno);
148
                $this->error($errstr);
149
                continue;
150
            }
151
152
            $port->set(empty($socket['settings']) ? [] : $socket['settings']);
153
154
            $handlerClass = $socket['handler'];
155
            $eventHandler = function ($method, array $params) use ($port, $handlerClass) {
156
                $handler = $this->getSocketHandler($port, $handlerClass);
157
                if (method_exists($handler, $method)) {
158
                    $this->callWithCatchException(function () use ($handler, $method, $params) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
159
                        call_user_func_array([$handler, $method], $params);
160
                    });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
161
                }
162
            };
163
            static $events = [
164
                'Open',
165
                'HandShake',
166
                'Request',
167
                'Message',
168
                'Connect',
169
                'Close',
170
                'Receive',
171
                'Packet',
172
                'BufferFull',
173
                'BufferEmpty',
174
            ];
175
            foreach ($events as $event) {
176
                $port->on($event, function () use ($event, $eventHandler) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
177
                    $eventHandler('on' . $event, func_get_args());
178
                });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
179
            }
180
        }
181
    }
182
183
    protected function getWebSocketHandler()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function getWebSocketHandler()
Loading history...
184
    {
185
        static $handler = null;
186
        if ($handler !== null) {
187
            return $handler;
188
        }
189
190
        $handlerClass = $this->conf['websocket']['handler'];
191
        $t = new $handlerClass();
192
        if (!($t instanceof WebSocketHandlerInterface)) {
193
            throw new \InvalidArgumentException(sprintf('%s must implement the interface %s', get_class($t), WebSocketHandlerInterface::class));
194
        }
195
        $handler = $t;
196
        return $handler;
197
    }
198
199
    protected function getSocketHandler(Port $port, $handlerClass)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function getSocketHandler()
Loading history...
200
    {
201
        static $handlers = [];
202
        $portHash = spl_object_hash($port);
203
        if (isset($handlers[$portHash])) {
204
            return $handlers[$portHash];
205
        }
206
        $t = new $handlerClass($port);
207
        if (!($t instanceof PortInterface)) {
208
            throw new \InvalidArgumentException(sprintf('%s must extend the abstract class TcpSocket/UdpSocket', get_class($t)));
209
        }
210
        $handlers[$portHash] = $t;
211
        return $handlers[$portHash];
212
    }
213
214
    protected function bindSwooleTables()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindSwooleTables()
Loading history...
215
    {
216
        $tables = isset($this->conf['swoole_tables']) ? (array)$this->conf['swoole_tables'] : [];
217
        foreach ($tables as $name => $table) {
218
            $t = new Table($table['size']);
219
            foreach ($table['column'] as $column) {
220
                if (isset($column['size'])) {
221
                    $t->column($column['name'], $column['type'], $column['size']);
222
                } else {
223
                    $t->column($column['name'], $column['type']);
224
                }
225
            }
226
            $t->create();
227
            $name .= 'Table'; // Avoid naming conflicts
228
            $this->swoole->{$name} = $t;
229
        }
230
    }
231
232
    public function onStart(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onStart()
Loading history...
233
    {
234
        $this->setProcessTitle(sprintf('%s laravels: master process', $this->conf['process_prefix']));
235
236
        if (version_compare(swoole_version(), '1.9.5', '<')) {
0 ignored issues
show
Bug introduced by
Are you sure the usage of swoole_version() is correct as it seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
237
            file_put_contents($this->conf['swoole']['pid_file'], $server->master_pid);
238
        }
239
    }
240
241
    public function onShutdown(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onShutdown()
Loading history...
242
    {
243
    }
244
245
    public function onManagerStart(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onManagerStart()
Loading history...
246
    {
247
        $this->setProcessTitle(sprintf('%s laravels: manager process', $this->conf['process_prefix']));
248
    }
249
250
    public function onManagerStop(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onManagerStop()
Loading history...
251
    {
252
    }
253
254
    public function onWorkerStart(HttpServer $server, $workerId)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onWorkerStart()
Loading history...
255
    {
256
        if ($workerId >= $server->setting['worker_num']) {
257
            $process = 'task worker';
258
        } else {
259
            $process = 'worker';
260
            if (!empty($this->conf['enable_coroutine_runtime'])) {
261
                \Swoole\Runtime::enableCoroutine();
262
            }
263
        }
264
        $this->setProcessTitle(sprintf('%s laravels: %s process %d', $this->conf['process_prefix'], $process, $workerId));
265
266
        if (function_exists('opcache_reset')) {
267
            opcache_reset();
268
        }
269
        if (function_exists('apc_clear_cache')) {
270
            apc_clear_cache();
271
        }
272
273
        clearstatcache();
274
    }
275
276
    public function onWorkerStop(HttpServer $server, $workerId)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onWorkerStop()
Loading history...
277
    {
278
    }
279
280
    public function onWorkerError(HttpServer $server, $workerId, $workerPId, $exitCode, $signal)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onWorkerError()
Loading history...
281
    {
282
        $this->error(sprintf('worker[%d] error: exitCode=%s, signal=%s', $workerId, $exitCode, $signal));
283
    }
284
285
    public function onPipeMessage(HttpServer $server, $srcWorkerId, $message)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onPipeMessage()
Loading history...
286
    {
287
        if ($message instanceof BaseTask) {
288
            $this->onTask($server, null, $srcWorkerId, $message);
289
        }
290
    }
291
292
    public function onRequest(SwooleRequest $swooleRequest, SwooleResponse $swooleResponse)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onRequest()
Loading history...
293
    {
294
    }
295
296
    public function onHandShake(SwooleRequest $request, SwooleResponse $response)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onHandShake()
Loading history...
297
    {
298
        if (!isset($request->header['sec-websocket-key'])) {
299
            // Bad protocol implementation: it is not RFC6455.
300
            $response->end();
301
            return;
302
        }
303
        $key = $request->header['sec-websocket-key'];
304
        if (0 === preg_match('#^[+/0-9A-Za-z]{21}[AQgw]==$#', $key) || 16 !== strlen(base64_decode($key))) {
305
            // Header Sec-WebSocket-Key is illegal;
306
            $response->end();
307
            return;
308
        }
309
310
        $headers = [
311
            'Upgrade'               => 'websocket',
312
            'Connection'            => 'Upgrade',
313
            'Sec-WebSocket-Accept'  => base64_encode(sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)),
314
            'Sec-WebSocket-Version' => '13',
315
        ];
316
317
        // WebSocket connection to 'ws://127.0.0.1:5200/'
318
        // failed: Error during WebSocket handshake:
319
        // Response must not include 'Sec-WebSocket-Protocol' header if not present in request: websocket
320
        if (isset($request->header['sec-websocket-protocol'])) {
321
            $headers['Sec-WebSocket-Protocol'] = $request->header['sec-websocket-protocol'];
322
        }
323
324
        foreach ($headers as $key => $val) {
325
            $response->header($key, $val);
326
        }
327
328
        $response->status(101);
329
        $response->end();
330
331
        if (method_exists($this->swoole, 'defer')) {
332
            $this->swoole->defer(function () use ($request) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
333
                $this->triggerWebSocketEvent('onOpen', [$this->swoole, $request]);
334
            });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
335
        } else {
336
            $this->triggerWebSocketEvent('onOpen', [$this->swoole, $request]);
337
        }
338
    }
339
340
    public function onTask(HttpServer $server, $taskId, $srcWorkerId, $data)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onTask()
Loading history...
341
    {
342
        if ($data instanceof Event) {
343
            $this->handleEvent($data);
344
        } elseif ($data instanceof Task) {
345
            if ($this->handleTask($data) && method_exists($data, 'finish')) {
346
                return $data;
347
            }
348
        }
349
    }
350
351
    public function onFinish(HttpServer $server, $taskId, $data)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onFinish()
Loading history...
352
    {
353
        if ($data instanceof Task) {
354
            $data->finish();
355
        }
356
    }
357
358
    protected function handleEvent(Event $event)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function handleEvent()
Loading history...
359
    {
360
        $listenerClasses = $event->getListeners();
361
        foreach ($listenerClasses as $listenerClass) {
362
            /**@var Listener $listener */
0 ignored issues
show
Coding Style introduced by
The open comment tag must be the only content on the line
Loading history...
Coding Style introduced by
Missing short description in doc comment
Loading history...
Coding Style introduced by
The close comment tag must be the only content on the line
Loading history...
363
            $listener = new $listenerClass($event);
364
            if (!($listener instanceof Listener)) {
365
                throw new \InvalidArgumentException(sprintf('%s must extend the abstract class %s', $listenerClass, Listener::class));
366
            }
367
            $this->callWithCatchException(function () use ($listener) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
368
                $listener->handle();
369
            }, [], $event->getTries());
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
370
        }
371
        return true;
372
    }
373
374
    protected function handleTask(Task $task)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function handleTask()
Loading history...
375
    {
376
        return $this->callWithCatchException(function () use ($task) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
377
            $task->handle();
378
            return true;
379
        }, [], $task->getTries());
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
380
    }
381
382
    protected function fireEvent($event, $interface, array $arguments)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function fireEvent()
Loading history...
383
    {
384
        if (isset($this->conf['event_handlers'][$event])) {
385
            $eventHandlers = (array)$this->conf['event_handlers'][$event];
386
            foreach ($eventHandlers as $eventHandler) {
387
                if (!isset(class_implements($eventHandler)[$interface])) {
388
                    throw new \InvalidArgumentException(sprintf(
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
389
                            '%s must implement the interface %s',
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 24 spaces, but found 28.
Loading history...
390
                            $eventHandler,
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 24 spaces, but found 28.
Loading history...
391
                            $interface
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 24 spaces, but found 28.
Loading history...
392
                        )
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 20 spaces, but found 24.
Loading history...
393
                    );
394
                }
395
                $this->callWithCatchException(function () use ($eventHandler, $arguments) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
396
                    call_user_func_array([(new $eventHandler), 'handle'], $arguments);
397
                });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
398
            }
399
        }
400
    }
401
402
    public function run()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function run()
Loading history...
403
    {
404
        $this->swoole->start();
405
    }
406
}
407