Completed
Push — master ( 9cd689...a6092f )
by Taosikai
15:30
created

SignalHandler   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 77
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 13
c 2
b 0
f 0
lcom 2
cbo 1
dl 0
loc 77
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 2
A register() 0 10 3
A setSignalHandler() 0 8 3
A getHandler() 0 7 3
A getInstance() 0 7 2
1
<?php
2
/**
3
 * Process Library
4
 * @author Tao <[email protected]>
5
 */
6
namespace Slince\Process;
7
8
use Slince\Process\Exception\InvalidArgumentException;
9
10
class SignalHandler
11
{
12
    /**
13
     * @var SignalHandler
14
     */
15
    protected static $instance;
16
17
    /**
18
     * The handlers
19
     * @var array
20
     */
21
    protected $handlers = [];
22
23
    public function __construct()
24
    {
25
        if (function_exists('pcntl_async_signals')) {
26
            pcntl_async_signals(true);
27
        }
28
    }
29
30
    /**
31
     * Registers a callback for some signals
32
     * @param int|array $signals a signal or an array of signals
33
     * @param callable|int $handler
34
     * @return SignalHandler
35
     */
36
    public function register($signals, $handler)
37
    {
38
        if (!is_array($signals)) {
39
            $signals = [$signals];
40
        }
41
        foreach ($signals as $signal) {
42
            $this->setSignalHandler($signal, $handler);
43
        }
44
        return $this;
45
    }
46
47
    /**
48
     * Register a callback for
49
     * @param $signal
50
     * @param int|callable $handler
51
     */
52
    protected function setSignalHandler($signal, $handler)
53
    {
54
        if (!is_int($handler) && !is_callable($handler)) {
55
            throw new InvalidArgumentException('The signal handler should be called or a number');
56
        }
57
        $this->handlers[$signal] = $handler;
58
        pcntl_signal($signal, $handler);
59
    }
60
61
    /**
62
     * Gets the handler for a signal
63
     * @param $signal
64
     * @return int|string
65
     */
66
    public function getHandler($signal)
67
    {
68
        if (function_exists('pcntl_signal_get_handler')) {
69
            return pcntl_signal_get_handler($signal);
70
        }
71
        return isset($this->handlers[$signal]) ? $this->handlers[$signal] : null;
72
    }
73
74
75
    /**
76
     * Gets a handler
77
     * @return SignalHandler
78
     */
79
    public static function getInstance()
80
    {
81
        if (is_null(static::$instance)) {
82
            static::$instance = new static();
83
        }
84
        return static::$instance;
85
    }
86
}