Passed
Push — master ( 4d03e1...2b3360 )
by Biao
04:05
created

Server::onWorkerStart()   A

Complexity

Conditions 5
Paths 12

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 12
nc 12
nop 2
dl 0
loc 20
rs 9.5555
c 0
b 0
f 0
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
    protected function __construct(array $conf)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function __construct()
Loading history...
34
    {
35
        $this->conf = $conf;
36
        $this->enableWebSocket = !empty($this->conf['websocket']['enable']);
37
38
        $ip = isset($conf['listen_ip']) ? $conf['listen_ip'] : '127.0.0.1';
39
        $port = isset($conf['listen_port']) ? $conf['listen_port'] : 5200;
40
        $socketType = isset($conf['socket_type']) ? (int)$conf['socket_type'] : SWOOLE_SOCK_TCP;
41
42
        if ($socketType === SWOOLE_SOCK_UNIX_STREAM) {
43
            $socketDir = dirname($ip);
44
            if (!file_exists($socketDir) && !mkdir($socketDir) && !is_dir($socketDir)) {
45
                throw new \RuntimeException(sprintf('Directory "%s" was not created', $socketDir));
46
            }
47
        }
48
49
        $settings = isset($conf['swoole']) ? $conf['swoole'] : [];
50
        $settings['enable_static_handler'] = !empty($conf['handle_static']);
51
52
        $serverClass = $this->enableWebSocket ? WebSocketServer::class : HttpServer::class;
53
        if (isset($settings['ssl_cert_file'], $settings['ssl_key_file'])) {
54
            $this->swoole = new $serverClass($ip, $port, SWOOLE_PROCESS, $socketType | SWOOLE_SSL);
55
        } else {
56
            $this->swoole = new $serverClass($ip, $port, SWOOLE_PROCESS, $socketType);
57
        }
58
59
        $this->swoole->set($settings);
60
61
        $this->bindBaseEvents();
62
        $this->bindHttpEvents();
63
        $this->bindTaskEvents();
64
        $this->bindWebSocketEvents();
65
        $this->bindPortEvents();
66
        $this->bindSwooleTables();
67
    }
68
69
    protected function bindBaseEvents()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindBaseEvents()
Loading history...
70
    {
71
        $this->swoole->on('Start', [$this, 'onStart']);
72
        $this->swoole->on('Shutdown', [$this, 'onShutdown']);
73
        $this->swoole->on('ManagerStart', [$this, 'onManagerStart']);
74
        $this->swoole->on('ManagerStop', [$this, 'onManagerStop']);
75
        $this->swoole->on('WorkerStart', [$this, 'onWorkerStart']);
76
        $this->swoole->on('WorkerStop', [$this, 'onWorkerStop']);
77
        $this->swoole->on('WorkerError', [$this, 'onWorkerError']);
78
        $this->swoole->on('PipeMessage', [$this, 'onPipeMessage']);
79
    }
80
81
    protected function bindHttpEvents()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindHttpEvents()
Loading history...
82
    {
83
        $this->swoole->on('Request', [$this, 'onRequest']);
84
    }
85
86
    protected function bindTaskEvents()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindTaskEvents()
Loading history...
87
    {
88
        if (!empty($this->conf['swoole']['task_worker_num'])) {
89
            $this->swoole->on('Task', [$this, 'onTask']);
90
            $this->swoole->on('Finish', [$this, 'onFinish']);
91
        }
92
    }
93
94
    protected function triggerWebSocketEvent($event, array $params)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function triggerWebSocketEvent()
Loading history...
95
    {
96
        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...
97
            $handler = $this->getWebSocketHandler();
98
99
            if (method_exists($handler, $event)) {
100
                call_user_func_array([$handler, $event], $params);
101
            } elseif ($event === 'onHandShake') {
102
                // Set default HandShake
103
                call_user_func_array([$this, 'onHandShake'], $params);
104
            }
105
        });
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...
106
    }
107
108
    protected function bindWebSocketEvents()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindWebSocketEvents()
Loading history...
109
    {
110
        if ($this->enableWebSocket) {
111
            $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...
112
                return $this->triggerWebSocketEvent('onHandShake', func_get_args());
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
            $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...
116
                $this->triggerWebSocketEvent('onOpen', 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('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...
120
                $this->triggerWebSocketEvent('onMessage', 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('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...
124
                $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...
125
                if (isset($clientInfo['websocket_status']) && $clientInfo['websocket_status'] === \WEBSOCKET_STATUS_FRAME) {
126
                    $this->triggerWebSocketEvent('onClose', func_get_args());
127
                }
128
                // else ignore the close event for http server
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
    }
132
133
    protected function triggerPortEvent(Port $port, $handlerClass, $event, array $params)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function triggerPortEvent()
Loading history...
134
    {
135
        return $this->callWithCatchException(function () use ($port, $handlerClass, $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...
136
            $handler = $this->getSocketHandler($port, $handlerClass);
137
138
            if (method_exists($handler, $event)) {
139
                call_user_func_array([$handler, $event], $params);
140
            } elseif ($event === 'onHandShake') {
141
                // Set default HandShake
142
                call_user_func_array([$this, 'onHandShake'], $params);
143
            }
144
        });
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...
145
    }
146
147
    protected function bindPortEvents()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindPortEvents()
Loading history...
148
    {
149
        $sockets = empty($this->conf['sockets']) ? [] : $this->conf['sockets'];
150
        foreach ($sockets as $socket) {
151
            if (isset($socket['enable']) && !$socket['enable']) {
152
                continue;
153
            }
154
155
            $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...
156
            if (!($port instanceof Port)) {
157
                $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...
158
                $errstr = sprintf('listen %s:%s failed: errno=%s', $socket['host'], $socket['port'], $errno);
159
                $this->error($errstr);
160
                continue;
161
            }
162
163
            $port->set(empty($socket['settings']) ? [] : $socket['settings']);
164
165
            $handlerClass = $socket['handler'];
166
167
            $events = [
168
                'Open',
169
                'HandShake',
170
                'Request',
171
                'Message',
172
                'Connect',
173
                'Close',
174
                'Receive',
175
                'Packet',
176
                'BufferFull',
177
                'BufferEmpty',
178
            ];
179
            foreach ($events as $event) {
180
                $port->on($event, function () use ($port, $handlerClass, $event) {
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...
181
                    $this->triggerPortEvent($port, $handlerClass, 'on' . $event, func_get_args());
182
                });
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...
183
            }
184
        }
185
    }
186
187
    protected function startHandleHttp(SwooleRequest $request)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function startHandleHttp()
Loading history...
188
    {
189
        // Implement in subclass
190
    }
191
192
    protected function endHandleHttp(SwooleRequest $request)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function endHandleHttp()
Loading history...
193
    {
194
        // Implement in subclass
195
    }
196
197
    protected function getWebSocketHandler()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function getWebSocketHandler()
Loading history...
198
    {
199
        static $handler = null;
200
        if ($handler !== null) {
201
            return $handler;
202
        }
203
204
        $handlerClass = $this->conf['websocket']['handler'];
205
        $t = new $handlerClass();
206
        if (!($t instanceof WebSocketHandlerInterface)) {
207
            throw new \InvalidArgumentException(sprintf('%s must implement the interface %s', get_class($t), WebSocketHandlerInterface::class));
208
        }
209
        $handler = $t;
210
        return $handler;
211
    }
212
213
    protected function getSocketHandler(Port $port, $handlerClass)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function getSocketHandler()
Loading history...
214
    {
215
        static $handlers = [];
216
        $portHash = spl_object_hash($port);
217
        if (isset($handlers[$portHash])) {
218
            return $handlers[$portHash];
219
        }
220
        $t = new $handlerClass($port);
221
        if (!($t instanceof PortInterface)) {
222
            throw new \InvalidArgumentException(sprintf('%s must extend the abstract class TcpSocket/UdpSocket', get_class($t)));
223
        }
224
        $handlers[$portHash] = $t;
225
        return $handlers[$portHash];
226
    }
227
228
    protected function bindSwooleTables()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function bindSwooleTables()
Loading history...
229
    {
230
        $tables = isset($this->conf['swoole_tables']) ? (array)$this->conf['swoole_tables'] : [];
231
        foreach ($tables as $name => $table) {
232
            $t = new Table($table['size']);
233
            foreach ($table['column'] as $column) {
234
                if (isset($column['size'])) {
235
                    $t->column($column['name'], $column['type'], $column['size']);
236
                } else {
237
                    $t->column($column['name'], $column['type']);
238
                }
239
            }
240
            $t->create();
241
            $name .= 'Table'; // Avoid naming conflicts
242
            $this->swoole->{$name} = $t;
243
        }
244
    }
245
246
    public function onStart(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onStart()
Loading history...
247
    {
248
        $this->setProcessTitle(sprintf('%s laravels: master process', $this->conf['process_prefix']));
249
250
        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...
251
            file_put_contents($this->conf['swoole']['pid_file'], $server->master_pid);
252
        }
253
    }
254
255
    public function onShutdown(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onShutdown()
Loading history...
256
    {
257
    }
258
259
    public function onManagerStart(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onManagerStart()
Loading history...
260
    {
261
        $this->setProcessTitle(sprintf('%s laravels: manager process', $this->conf['process_prefix']));
262
    }
263
264
    public function onManagerStop(HttpServer $server)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onManagerStop()
Loading history...
265
    {
266
    }
267
268
    public function onWorkerStart(HttpServer $server, $workerId)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onWorkerStart()
Loading history...
269
    {
270
        if ($workerId >= $server->setting['worker_num']) {
271
            $process = 'task worker';
272
        } else {
273
            $process = 'worker';
274
            if (!empty($this->conf['enable_coroutine_runtime'])) {
275
                \Swoole\Runtime::enableCoroutine();
276
            }
277
        }
278
        $this->setProcessTitle(sprintf('%s laravels: %s process %d', $this->conf['process_prefix'], $process, $workerId));
279
280
        if (function_exists('opcache_reset')) {
281
            opcache_reset();
282
        }
283
        if (function_exists('apc_clear_cache')) {
284
            apc_clear_cache();
285
        }
286
287
        clearstatcache();
288
    }
289
290
    public function onWorkerStop(HttpServer $server, $workerId)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onWorkerStop()
Loading history...
291
    {
292
    }
293
294
    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...
295
    {
296
        $this->error(sprintf('worker[%d] error: exitCode=%s, signal=%s', $workerId, $exitCode, $signal));
297
    }
298
299
    public function onPipeMessage(HttpServer $server, $srcWorkerId, $message)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onPipeMessage()
Loading history...
300
    {
301
        if ($message instanceof BaseTask) {
302
            $this->onTask($server, null, $srcWorkerId, $message);
303
        }
304
    }
305
306
    public function onRequest(SwooleRequest $swooleRequest, SwooleResponse $swooleResponse)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onRequest()
Loading history...
307
    {
308
    }
309
310
    public function onHandShake(SwooleRequest $request, SwooleResponse $response)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onHandShake()
Loading history...
311
    {
312
        if (!isset($request->header['sec-websocket-key'])) {
313
            // Bad protocol implementation: it is not RFC6455.
314
            $response->end();
315
            return;
316
        }
317
        $secKey = $request->header['sec-websocket-key'];
318
        if (!preg_match('#^[+/0-9A-Za-z]{21}[AQgw]==$#', $secKey) || 16 !== strlen(base64_decode($secKey))) {
319
            // Header Sec-WebSocket-Key is illegal;
320
            $response->end();
321
            return;
322
        }
323
324
        $headers = [
325
            'Upgrade'               => 'websocket',
326
            'Connection'            => 'Upgrade',
327
            'Sec-WebSocket-Accept'  => base64_encode(sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)),
328
            'Sec-WebSocket-Version' => '13',
329
        ];
330
331
        // WebSocket connection to 'ws://127.0.0.1:5200/'
332
        // failed: Error during WebSocket handshake:
333
        // Response must not include 'Sec-WebSocket-Protocol' header if not present in request: websocket
334
        if (isset($request->header['sec-websocket-protocol'])) {
335
            $headers['Sec-WebSocket-Protocol'] = $request->header['sec-websocket-protocol'];
336
        }
337
338
        foreach ($headers as $key => $value) {
339
            $response->header($key, $value);
340
        }
341
342
        $response->status(101);
343
        $response->end();
344
    }
345
346
    public function onTask(HttpServer $server, $taskId, $srcWorkerId, $data)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onTask()
Loading history...
347
    {
348
        if ($data instanceof Event) {
349
            $this->handleEvent($data);
350
        } elseif ($data instanceof Task) {
351
            if ($this->handleTask($data) && method_exists($data, 'finish')) {
352
                return $data;
353
            }
354
        }
355
    }
356
357
    public function onFinish(HttpServer $server, $taskId, $data)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function onFinish()
Loading history...
358
    {
359
        if ($data instanceof Task) {
360
            $data->finish();
361
        }
362
    }
363
364
    protected function handleEvent(Event $event)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function handleEvent()
Loading history...
365
    {
366
        $listenerClasses = $event->getListeners();
367
        foreach ($listenerClasses as $listenerClass) {
368
            /**@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...
369
            $listener = new $listenerClass($event);
370
            if (!($listener instanceof Listener)) {
371
                throw new \InvalidArgumentException(sprintf('%s must extend the abstract class %s', $listenerClass, Listener::class));
372
            }
373
            $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...
374
                $listener->handle();
375
            }, [], $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...
376
        }
377
        return true;
378
    }
379
380
    protected function handleTask(Task $task)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function handleTask()
Loading history...
381
    {
382
        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...
383
            $task->handle();
384
            return true;
385
        }, [], $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...
386
    }
387
388
    protected function fireEvent($event, $interface, array $arguments)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function fireEvent()
Loading history...
389
    {
390
        if (isset($this->conf['event_handlers'][$event])) {
391
            $eventHandlers = (array)$this->conf['event_handlers'][$event];
392
            foreach ($eventHandlers as $eventHandler) {
393
                if (!isset(class_implements($eventHandler)[$interface])) {
394
                    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...
395
                            '%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...
396
                            $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...
397
                            $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...
398
                        )
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...
399
                    );
400
                }
401
                $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...
402
                    call_user_func_array([(new $eventHandler), 'handle'], $arguments);
403
                });
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...
404
            }
405
        }
406
    }
407
408
    public function run()
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function run()
Loading history...
409
    {
410
        $this->swoole->start();
411
    }
412
}
413