check_the_ping()   B
last analyzed

Complexity

Conditions 8
Paths 10

Size

Total Lines 52
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 30
nc 10
nop 1
dl 0
loc 52
rs 8.1954
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
function ping($ip, $port)
3
{
4
    $it = microtime(true);
5
    $check = @fsockopen($ip, $port, $errno, $errstr, 0.2);
6
    $ft = microtime(true);
7
    $militime = round(($ft - $it) * 1e3, 2);
8
    if ($check) {
0 ignored issues
show
introduced by
$check is of type false|resource, thus it always evaluated to false.
Loading history...
9
        fclose($check);
10
        return $militime;
11
    } else {
12
        return "unavailable";
13
    }
14
}
15
16
function check_the_host($host)
17
{
18
    if (empty($host)) {
19
        return null;
20
    }
21
22
    $url = "https://check-host.net/check-ping";
23
    $nodes = ["ir3.node.check-host.net", "ir4.node.check-host.net", "ir1.node.check-host.net"];
24
    $params = http_build_query([
25
        'host' => $host,
26
        'node' => $nodes,
27
    ]);
28
29
    $ch = curl_init();
30
    curl_setopt_array($ch, [
31
        CURLOPT_URL => $url . '?' . $params,
32
        CURLOPT_RETURNTRANSFER => true,
33
        CURLOPT_HTTPHEADER => ["Accept: application/json"],
34
    ]);
35
36
    $response = curl_exec($ch);
37
38
    if (curl_errno($ch)) {
39
        echo "cURL error: " . curl_error($ch);
40
        return null;
41
    }
42
43
    $request_id = json_decode($response, true)["request_id"];
0 ignored issues
show
Bug introduced by
It seems like $response can also be of type true; however, parameter $json of json_decode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

43
    $request_id = json_decode(/** @scrutinizer ignore-type */ $response, true)["request_id"];
Loading history...
44
    curl_close($ch);
45
46
    return $request_id;
47
}
48
49
function check_the_ping($request_id)
50
{
51
    if (empty($request_id)) {
52
        return "Request ID not found!";
53
    }
54
55
    $url = "https://check-host.net/check-result/" . $request_id;
56
57
    $ch = curl_init();
58
    curl_setopt_array($ch, [
59
        CURLOPT_URL => $url,
60
        CURLOPT_RETURNTRANSFER => true,
61
        CURLOPT_HTTPHEADER => ["Accept: application/json"],
62
    ]);
63
64
    $response = curl_exec($ch);
65
66
    if (curl_errno($ch)) {
67
        echo "cURL error: " . curl_error($ch);
68
        return null;
69
    }
70
71
    $decoded_response = json_decode($response, true);
0 ignored issues
show
Bug introduced by
It seems like $response can also be of type true; however, parameter $json of json_decode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

71
    $decoded_response = json_decode(/** @scrutinizer ignore-type */ $response, true);
Loading history...
72
73
    $pings = [];
74
    $nodes = ["ir1.node.check-host.net", "ir3.node.check-host.net", "ir4.node.check-host.net"];
75
76
    foreach ($nodes as $node) {
77
        if (empty($decoded_response[$node])) {
78
            continue;
79
        }
80
81
        $count = 0;
82
        $ping_sum = 0;
83
        foreach ($decoded_response[$node][0] as $value) {
84
            if (@$value[0] == "OK") {
85
                $count++;
86
                $ping_sum += $value[1];
87
            }
88
        }
89
90
        if ($count !== 0) {
91
            $ping_avg = (@$ping_sum / $count) * 1000;
92
            $pings[$node] = $ping_avg;
93
        }
94
    }
95
96
    $json_pings = json_encode($pings, JSON_PRETTY_PRINT);
97
98
    curl_close($ch);
99
100
    return $json_pings;
101
}
102
103
function accuracy($accuracy)
104
{
105
    $accuracy = (int) $accuracy;
106
107
    if ($accuracy < 0) {
108
        $accuracy = 0;
109
    } elseif ($accuracy > 10) {
110
        $accuracy = 10;
111
    }
112
113
    sleep($accuracy);
114
}
115
116
function filtered_or_not($input, $accuracy = 3){
117
    $request_id = check_the_host($input);
118
    accuracy($accuracy);
119
    $pings = check_the_ping($request_id);
120
    $check_host_data = json_decode($pings, true);
0 ignored issues
show
Bug introduced by
It seems like $pings can also be of type null; however, parameter $json of json_decode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

120
    $check_host_data = json_decode(/** @scrutinizer ignore-type */ $pings, true);
Loading history...
121
    $ping_count = 0;
0 ignored issues
show
Unused Code introduced by
The assignment to $ping_count is dead and can be removed.
Loading history...
122
    $precent = [100, 66, 33, 0];
123
    if (!is_null($check_host_data)){
124
        $ping_count = count($check_host_data);
125
        $output = $precent[$ping_count] >= 66 ? true : false ;
126
    }
127
    return $output;
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $output does not seem to be defined for all execution paths leading up to this point.
Loading history...
128
}
129
130