ProcessorCounter::isWindows()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 4
ccs 0
cts 2
cp 0
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 2
1
<?php
2
/**
3
 * File ProcessorCounter.php
4
 *
5
 * @author Edward Pfremmer <[email protected]>
6
 */
7
namespace Epfremme\ProcessQueue\System;
8
9
/**
10
 * Class ProcessorCounter
11
 *
12
 * @package Epfremme\ProcessQueue\Process
13
 */
14
class ProcessorCounter
15
{
16
    const DEFAULT_CPU_COUNT = 4;
17
18
    /**
19
     * @var int
20
     */
21
    private $cpuCount;
22
23
    /**
24
     * @return string
25
     */
26 1
    public function __toString()
27
    {
28 1
        return (string) $this->getCpuCount();
29
    }
30
31
    /**
32
     * @return int
33
     */
34 17
    public function getCpuCount()
35
    {
36 17
        if ($this->cpuCount) {
37
            return $this->cpuCount;
38
        }
39
40 17
        if ($this->hasProcInfo()) {
41 17
            return $this->getProcCount();
42
        }
43
44
        if ($this->isWindows()) {
45
            return $this->getWinCount();
46
        }
47
48
        return $this->getSysctlCount();
49
    }
50
51
    /**
52
     * @return bool
53
     */
54 17
    private function hasProcInfo()
55
    {
56 17
        return is_file('/proc/cpuinfo');
57
    }
58
59
    /**
60
     * @return bool
61
     */
62
    private function isWindows()
63
    {
64
        return 'WIN' == strtoupper(substr(PHP_OS, 0, 3));
65
    }
66
67
    /**
68
     * @return int
69
     */
70
    private function getSysctlCount()
71
    {
72
        $process = @popen('sysctl -a', 'rb');
73
74
        if (false !== $process) {
75
            $output = stream_get_contents($process);
76
77
            preg_match('/hw.ncpu: (\d+)/', $output, $matches);
78
            pclose($process);
79
        }
80
81
        return !empty($matches) ? intval($matches[1][0]) : self::DEFAULT_CPU_COUNT;
82
    }
83
84
    /**
85
     * @return int
86
     */
87 17
    private function getProcCount()
88
    {
89 17
        $cpuinfo = file_get_contents('/proc/cpuinfo');
90
91 17
        preg_match_all('/^processor/m', $cpuinfo, $matches);
92
93 17
        return !empty($matches[0]) ? count($matches[0]) : self::DEFAULT_CPU_COUNT;
94
    }
95
96
    /**
97
     * @return int
98
     */
99
    private function getWinCount()
100
    {
101
        $process = @popen('wmic cpu get NumberOfCores', 'rb');
102
103
        if (false !== $process) {
104
            fgets($process);
105
            $count = intval(fgets($process));
106
            pclose($process);
107
        }
108
109
        return !empty($count) ? $count : self::DEFAULT_CPU_COUNT;
110
    }
111
}
112