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

SignalHandler::getInstance()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 7
rs 9.4285
cc 2
eloc 4
nc 2
nop 0
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
}