Passed
Push — master ( 24dafe...4d03e1 )
by Biao
04:40
created

Server::startHandleHttp()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
cc 1
eloc 0
c 1
b 1
f 0
nc 1
nop 1
dl 0
loc 2
rs 10
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($event, array $params)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function triggerWebSocketEvent()
Loading history...
99
    {
100
        return $this->callWithCatchException(function () use ($event, $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, $event)) {
104
                return call_user_func_array([$handler, $event], $params);
105
            }
106
107
            // Set default HandShake
108
            if ($event === 'onHandShake') {
109
                return call_user_func_array([$this, 'onHandShake'], $params);
110
            }
111
112
            return null;
113
        });
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...
114
    }
115
116
    protected function bindWebSocketEvents()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindWebSocketEvents()
Loading history...
117
    {
118
        if ($this->enableWebSocket) {
119
            $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...
120
                return $this->triggerWebSocketEvent('onHandShake', 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('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...
124
                $this->triggerWebSocketEvent('onOpen', 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('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...
128
                $this->triggerWebSocketEvent('onMessage', func_get_args());
129
            });
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...
130
131
            $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...
132
                $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...
133
                if (isset($clientInfo['websocket_status']) && $clientInfo['websocket_status'] === \WEBSOCKET_STATUS_FRAME) {
134
                    $this->triggerWebSocketEvent('onClose', func_get_args());
135
                }
136
                // else ignore the close event for http server
137
            });
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...
138
        }
139
    }
140
141
    protected function bindAttachedSockets()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindAttachedSockets()
Loading history...
142
    {
143
        foreach ($this->attachedSockets as $socket) {
144
            if (isset($socket['enable']) && !$socket['enable']) {
145
                continue;
146
            }
147
148
            $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...
149
            if (!($port instanceof Port)) {
150
                $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...
151
                $errstr = sprintf('listen %s:%s failed: errno=%s', $socket['host'], $socket['port'], $errno);
152
                $this->error($errstr);
153
                continue;
154
            }
155
156
            $port->set(empty($socket['settings']) ? [] : $socket['settings']);
157
158
            $handlerClass = $socket['handler'];
159
            $eventHandler = function ($event, array $params) use ($port, $handlerClass) {
160
                $handler = $this->getSocketHandler($port, $handlerClass);
161
                return $this->callWithCatchException(function () use ($handler, $event, $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...
162
                    if (method_exists($handler, $event)) {
163
                        if ($event === 'onHandShake' || $event === 'onRequest') {
164
                            $this->startHandleHttp($params[0]);
165
                        }
166
                        if ($event === 'onOpen' && !method_exists($handler, 'onHandShake')) {
167
                            $this->startHandleHttp($params[1]);
168
                        }
169
170
                        $result = call_user_func_array([$handler, $event], $params);
171
172
                        if ($event === 'onHandShake') {
173
                            if ($result === true) {
174
                                $result = $handler->onOpen($this->swoole, $params[0]);
175
                            }
176
                            $this->endHandleHttp($params[0]);
177
                        }
178
                        if ($event === 'onOpen') {
179
                            $this->endHandleHttp($params[1]);
180
                        }
181
                        return $result;
182
                    }
183
184
                    // Set default HandShake
185
                    if ($event === 'onHandShake' && method_exists($handler, 'onOpen')) {
186
                        $this->startHandleHttp($params[0]);
187
                        $params[] = function () use ($handler, $params) {
188
                            call_user_func_array([$handler, 'onOpen'], func_get_args());
189
                            $this->endHandleHttp($params[0]);
190
                        };
191
                        return call_user_func_array([$this, 'onHandShake'], $params);
192
                    }
193
194
                    return null;
195
                });
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...
196
            };
197
198
            $events = [
199
                'Open',
200
                'HandShake',
201
                'Request',
202
                'Message',
203
                'Connect',
204
                'Close',
205
                'Receive',
206
                'Packet',
207
                'BufferFull',
208
                'BufferEmpty',
209
            ];
210
            foreach ($events as $event) {
211
                $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...
212
                    return $eventHandler('on' . $event, func_get_args());
213
                });
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...
214
            }
215
        }
216
    }
217
218
    protected function startHandleHttp(SwooleRequest $request)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function startHandleHttp()
Loading history...
219
    {
220
        // Implement in subclass
221
    }
222
223
    protected function endHandleHttp(SwooleRequest $request)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function endHandleHttp()
Loading history...
224
    {
225
        // Implement in subclass
226
    }
227
228
    protected function getWebSocketHandler()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function getWebSocketHandler()
Loading history...
229
    {
230
        static $handler = null;
231
        if ($handler !== null) {
232
            return $handler;
233
        }
234
235
        $handlerClass = $this->conf['websocket']['handler'];
236
        $t = new $handlerClass();
237
        if (!($t instanceof WebSocketHandlerInterface)) {
238
            throw new \InvalidArgumentException(sprintf('%s must implement the interface %s', get_class($t), WebSocketHandlerInterface::class));
239
        }
240
        $handler = $t;
241
        return $handler;
242
    }
243
244
    protected function getSocketHandler(Port $port, $handlerClass)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function getSocketHandler()
Loading history...
245
    {
246
        static $handlers = [];
247
        $portHash = spl_object_hash($port);
248
        if (isset($handlers[$portHash])) {
249
            return $handlers[$portHash];
250
        }
251
        $t = new $handlerClass($port);
252
        if (!($t instanceof PortInterface)) {
253
            throw new \InvalidArgumentException(sprintf('%s must extend the abstract class TcpSocket/UdpSocket', get_class($t)));
254
        }
255
        $handlers[$portHash] = $t;
256
        return $handlers[$portHash];
257
    }
258
259
    protected function bindSwooleTables()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindSwooleTables()
Loading history...
260
    {
261
        $tables = isset($this->conf['swoole_tables']) ? (array)$this->conf['swoole_tables'] : [];
262
        foreach ($tables as $name => $table) {
263
            $t = new Table($table['size']);
264
            foreach ($table['column'] as $column) {
265
                if (isset($column['size'])) {
266
                    $t->column($column['name'], $column['type'], $column['size']);
267
                } else {
268
                    $t->column($column['name'], $column['type']);
269
                }
270
            }
271
            $t->create();
272
            $name .= 'Table'; // Avoid naming conflicts
273
            $this->swoole->{$name} = $t;
274
        }
275
    }
276
277
    public function onStart(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onStart()
Loading history...
278
    {
279
        $this->setProcessTitle(sprintf('%s laravels: master process', $this->conf['process_prefix']));
280
281
        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...
282
            file_put_contents($this->conf['swoole']['pid_file'], $server->master_pid);
283
        }
284
    }
285
286
    public function onShutdown(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onShutdown()
Loading history...
287
    {
288
    }
289
290
    public function onManagerStart(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onManagerStart()
Loading history...
291
    {
292
        $this->setProcessTitle(sprintf('%s laravels: manager process', $this->conf['process_prefix']));
293
    }
294
295
    public function onManagerStop(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onManagerStop()
Loading history...
296
    {
297
    }
298
299
    public function onWorkerStart(HttpServer $server, $workerId)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onWorkerStart()
Loading history...
300
    {
301
        if ($workerId >= $server->setting['worker_num']) {
302
            $process = 'task worker';
303
        } else {
304
            $process = 'worker';
305
            if (!empty($this->conf['enable_coroutine_runtime'])) {
306
                \Swoole\Runtime::enableCoroutine();
307
            }
308
        }
309
        $this->setProcessTitle(sprintf('%s laravels: %s process %d', $this->conf['process_prefix'], $process, $workerId));
310
311
        if (function_exists('opcache_reset')) {
312
            opcache_reset();
313
        }
314
        if (function_exists('apc_clear_cache')) {
315
            apc_clear_cache();
316
        }
317
318
        clearstatcache();
319
    }
320
321
    public function onWorkerStop(HttpServer $server, $workerId)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onWorkerStop()
Loading history...
322
    {
323
    }
324
325
    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...
326
    {
327
        $this->error(sprintf('worker[%d] error: exitCode=%s, signal=%s', $workerId, $exitCode, $signal));
328
    }
329
330
    public function onPipeMessage(HttpServer $server, $srcWorkerId, $message)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onPipeMessage()
Loading history...
331
    {
332
        if ($message instanceof BaseTask) {
333
            $this->onTask($server, null, $srcWorkerId, $message);
334
        }
335
    }
336
337
    public function onRequest(SwooleRequest $swooleRequest, SwooleResponse $swooleResponse)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onRequest()
Loading history...
338
    {
339
    }
340
341
    public function onHandShake(SwooleRequest $request, SwooleResponse $response, callable $onOpen = null)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onHandShake()
Loading history...
342
    {
343
        if (!isset($request->header['sec-websocket-key'])) {
344
            // Bad protocol implementation: it is not RFC6455.
345
            $response->end();
346
            return false;
347
        }
348
        $secKey = $request->header['sec-websocket-key'];
349
        if (!preg_match('#^[+/0-9A-Za-z]{21}[AQgw]==$#', $secKey) || 16 !== strlen(base64_decode($secKey))) {
350
            // Header Sec-WebSocket-Key is illegal;
351
            $response->end();
352
            return false;
353
        }
354
355
        $headers = [
356
            'Upgrade'               => 'websocket',
357
            'Connection'            => 'Upgrade',
358
            'Sec-WebSocket-Accept'  => base64_encode(sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)),
359
            'Sec-WebSocket-Version' => '13',
360
        ];
361
362
        // WebSocket connection to 'ws://127.0.0.1:5200/'
363
        // failed: Error during WebSocket handshake:
364
        // Response must not include 'Sec-WebSocket-Protocol' header if not present in request: websocket
365
        if (isset($request->header['sec-websocket-protocol'])) {
366
            $headers['Sec-WebSocket-Protocol'] = $request->header['sec-websocket-protocol'];
367
        }
368
369
        foreach ($headers as $key => $value) {
370
            $response->header($key, $value);
371
        }
372
373
        $response->status(101);
374
        $response->end();
375
376
        if (is_callable($onOpen)) {
377
            if (method_exists($this->swoole, 'defer')) {
378
                $this->swoole->defer(function () use ($onOpen, $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...
379
                    call_user_func($onOpen, $this->swoole, $request);
380
                });
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...
381
            } else {
382
                call_user_func($onOpen, $this->swoole, $request);
383
            }
384
        }
385
        return true;
386
    }
387
388
    public function onTask(HttpServer $server, $taskId, $srcWorkerId, $data)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onTask()
Loading history...
389
    {
390
        if ($data instanceof Event) {
391
            $this->handleEvent($data);
392
        } elseif ($data instanceof Task) {
393
            if ($this->handleTask($data) && method_exists($data, 'finish')) {
394
                return $data;
395
            }
396
        }
397
    }
398
399
    public function onFinish(HttpServer $server, $taskId, $data)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onFinish()
Loading history...
400
    {
401
        if ($data instanceof Task) {
402
            $data->finish();
403
        }
404
    }
405
406
    protected function handleEvent(Event $event)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function handleEvent()
Loading history...
407
    {
408
        $listenerClasses = $event->getListeners();
409
        foreach ($listenerClasses as $listenerClass) {
410
            /**@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...
411
            $listener = new $listenerClass($event);
412
            if (!($listener instanceof Listener)) {
413
                throw new \InvalidArgumentException(sprintf('%s must extend the abstract class %s', $listenerClass, Listener::class));
414
            }
415
            $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...
416
                $listener->handle();
417
            }, [], $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...
418
        }
419
        return true;
420
    }
421
422
    protected function handleTask(Task $task)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function handleTask()
Loading history...
423
    {
424
        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...
425
            $task->handle();
426
            return true;
427
        }, [], $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...
428
    }
429
430
    protected function fireEvent($event, $interface, array $arguments)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function fireEvent()
Loading history...
431
    {
432
        if (isset($this->conf['event_handlers'][$event])) {
433
            $eventHandlers = (array)$this->conf['event_handlers'][$event];
434
            foreach ($eventHandlers as $eventHandler) {
435
                if (!isset(class_implements($eventHandler)[$interface])) {
436
                    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...
437
                            '%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...
438
                            $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...
439
                            $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...
440
                        )
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...
441
                    );
442
                }
443
                $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...
444
                    call_user_func_array([(new $eventHandler), 'handle'], $arguments);
445
                });
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...
446
            }
447
        }
448
    }
449
450
    public function run()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function run()
Loading history...
451
    {
452
        $this->swoole->start();
453
    }
454
}
455