Passed
Pull Request — master (#81)
by Šimon
04:58
created

CurlerRolling::getInfo()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 3
rs 10
ccs 0
cts 2
cp 0
cc 1
eloc 1
nc 1
nop 0
crap 2
1
<?php
0 ignored issues
show
introduced by
Missing declare(strict_types = 1).
Loading history...
2
3
namespace ClickHouseDB\Transport;
4
5
use ClickHouseDB\Exception\TransportException;
6
7
class CurlerRolling
8
{
9
    /**
10
     * @var int
11
     *
12
     * Max number of simultaneous requests.
13
     */
14
    private $simultaneousLimit = 10;
15
16
    /**
17
     * @var array
0 ignored issues
show
introduced by
@var annotation of property \ClickHouseDB\Transport\CurlerRolling::$activeRequests does not specify type hint for its items.
Loading history...
18
     *
19
     * Requests currently being processed by curl
20
     */
21
    private $activeRequests = [];
22
23
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\CurlerRolling::$runningRequests with single line content, use one-line comment instead.
Loading history...
24
     * @var int
25
     */
26
    private $runningRequests = 0;
27
28
    /**
29
     * @var CurlerRequest[]
30
     *
31
     * Requests queued to be processed
32
     */
33
    private $pendingRequests = [];
34
35
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\CurlerRolling::$completedRequestCount with single line content, use one-line comment instead.
Loading history...
36
     * @return int
37
     */
38
    private $completedRequestCount = 0;
0 ignored issues
show
introduced by
Property \ClickHouseDB\Transport\CurlerRolling::$completedRequestCount does not have @var annotation.
Loading history...
39
40
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\CurlerRolling::$_pool_master with single line content, use one-line comment instead.
Loading history...
41
     * @var null|resource
42
     */
43
    private $_pool_master = null;
44
45
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\CurlerRolling::$waitRequests with single line content, use one-line comment instead.
Loading history...
46
     * @var int
47
     */
48
    private $waitRequests = 0;
49
50
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\CurlerRolling::$handleMapTasks with single line content, use one-line comment instead.
Loading history...
51
     * @var array
0 ignored issues
show
introduced by
@var annotation of property \ClickHouseDB\Transport\CurlerRolling::$handleMapTasks does not specify type hint for its items.
Loading history...
52
     */
53
    private $handleMapTasks = [];
54
55
    /**
0 ignored issues
show
introduced by
Empty comment
Loading history...
56
     *
57
     */
58
    public function __destructor()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::__destructor() does not have void return type hint.
Loading history...
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::__destructor() does not need documentation comment.
Loading history...
59
    {
60
        $this->close();
61
    }
62
63
64
    /**
65
     * @return resource
66
     */
67 9
    private function handlerMulti()
68
    {
69 9
        if (!$this->_pool_master) {
0 ignored issues
show
Coding Style introduced by
There must be a single space after a NOT operator; 0 found
Loading history...
70 9
            $this->_pool_master = curl_multi_init();
0 ignored issues
show
introduced by
Function curl_multi_init() should not be referenced via a fallback global name, but via a use statement.
Loading history...
71
72 9
            if (function_exists('curl_multi_setopt')) {
0 ignored issues
show
introduced by
Function function_exists() should not be referenced via a fallback global name, but via a use statement.
Loading history...
73 9
                curl_multi_setopt($this->_pool_master, CURLMOPT_MAXCONNECTS, $this->simultaneousLimit);
0 ignored issues
show
introduced by
Function curl_multi_setopt() should not be referenced via a fallback global name, but via a use statement.
Loading history...
introduced by
Constant CURLMOPT_MAXCONNECTS should not be referenced via a fallback global name, but via a use statement.
Loading history...
74
            }
75
        }
76
77 9
        return $this->_pool_master;
78
    }
79
80
    /**
0 ignored issues
show
introduced by
Empty comment
Loading history...
81
     *
82
     */
83
    public function close()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::close() does not have void return type hint.
Loading history...
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::close() does not need documentation comment.
Loading history...
84
    {
85
        if ($this->_pool_master) {
0 ignored issues
show
introduced by
Use early exit to reduce code nesting.
Loading history...
86
            curl_multi_close($this->handlerMulti());
0 ignored issues
show
introduced by
Function curl_multi_close() should not be referenced via a fallback global name, but via a use statement.
Loading history...
87
        }
88
    }
89
90
91
    /**
92
     * @param CurlerRequest $req
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::addQueLoop() has useless @param annotation for parameter $req.
Loading history...
93
     * @param bool $checkMultiAdd
0 ignored issues
show
Coding Style introduced by
Expected 10 spaces after parameter type; 1 found
Loading history...
94
     * @param bool $force
0 ignored issues
show
Coding Style introduced by
Expected 10 spaces after parameter type; 1 found
Loading history...
95
     * @return bool
96
     * @throws TransportException
97
     */
98 12
    public function addQueLoop(CurlerRequest $req, $checkMultiAdd = true, $force = false)
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::addQueLoop() does not have parameter type hint for its parameter $checkMultiAdd but it should be possible to add it based on @param annotation "bool".
Loading history...
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::addQueLoop() does not have parameter type hint for its parameter $force but it should be possible to add it based on @param annotation "bool".
Loading history...
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::addQueLoop() does not have return type hint for its return value but it should be possible to add it based on @return annotation "bool".
Loading history...
99
    {
100 12
        $id = $req->getId();
101
102 12
        if (!$id) {
0 ignored issues
show
Coding Style introduced by
There must be a single space after a NOT operator; 0 found
Loading history...
103 12
            $id = $req->getUniqHash($this->completedRequestCount);
104
        }
105
106 12
        if (!$force && isset($this->pendingRequests[$id])) {
0 ignored issues
show
Coding Style introduced by
There must be a single space after a NOT operator; 0 found
Loading history...
107
            if (!$checkMultiAdd) {
0 ignored issues
show
Coding Style introduced by
There must be a single space after a NOT operator; 0 found
Loading history...
108
                return false;
109
            }
110
111
            throw new TransportException("Cant add exists que - cant overwrite : $id!\n");
0 ignored issues
show
Coding Style Best Practice introduced by
Variable "%s" not allowed in double quoted string; use sprintf() or concatenation instead

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
112
        }
113
114 12
        $this->pendingRequests[$id] = $req;
115 12
        return true;
116
    }
117
118
    /**
119
     * @param resource $oneHandle
120
     * @return CurlerResponse
121
     */
122 42
    private function makeResponse($oneHandle)
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::makeResponse() does not have return type hint for its return value but it should be possible to add it based on @return annotation "CurlerResponse".
Loading history...
123
    {
124 42
        $response = curl_multi_getcontent($oneHandle);
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 4 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
introduced by
Function curl_multi_getcontent() should not be referenced via a fallback global name, but via a use statement.
Loading history...
125 42
        $header_size = curl_getinfo($oneHandle, CURLINFO_HEADER_SIZE);
0 ignored issues
show
introduced by
Function curl_getinfo() should not be referenced via a fallback global name, but via a use statement.
Loading history...
introduced by
Constant CURLINFO_HEADER_SIZE should not be referenced via a fallback global name, but via a use statement.
Loading history...
126 42
        $header = substr($response, 0, $header_size);
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 6 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
introduced by
Function substr() should not be referenced via a fallback global name, but via a use statement.
Loading history...
127 42
        $body = substr($response, $header_size);
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 8 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
introduced by
Function substr() should not be referenced via a fallback global name, but via a use statement.
Loading history...
128
129 42
        $n = new CurlerResponse();
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 11 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
130 42
        $n->_headers = $this->parse_headers_from_curl_response($header);
131 42
        $n->_body = $body;
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 4 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
132 42
        $n->_info = curl_getinfo($oneHandle);
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 4 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
introduced by
Function curl_getinfo() should not be referenced via a fallback global name, but via a use statement.
Loading history...
133 42
        $n->_error = curl_error($oneHandle);
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 3 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
introduced by
Function curl_error() should not be referenced via a fallback global name, but via a use statement.
Loading history...
134 42
        $n->_errorNo = curl_errno($oneHandle);
0 ignored issues
show
introduced by
Function curl_errno() should not be referenced via a fallback global name, but via a use statement.
Loading history...
135 42
        $n->_useTime = 0;
136
137 42
        return $n;
138
    }
139
140
    /**
141
     * @return bool
142
     * @throws TransportException
143
     */
144 9
    public function execLoopWait()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::execLoopWait() does not have return type hint for its return value but it should be possible to add it based on @return annotation "bool".
Loading history...
145
    {
146 9
        $c = 0;
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 5 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
147 9
        $count=0;
0 ignored issues
show
Unused Code introduced by
The assignment to $count is dead and can be removed.
Loading history...
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 1 space but found 0 spaces

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
148
        // add all tasks
149
        do {
150 9
            $this->exec();
151
152 9
            $loop = $this->countActive();
153 9
            $pend = $this->countPending();
154
155 9
            $count=$loop+$pend;
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned correctly; expected 1 space but found 0 spaces
Loading history...
156 9
            $c++;
157
158 9
            if ($c > 20000) {
159
                break;
160
            }
161 9
            usleep(500);
0 ignored issues
show
introduced by
Function usleep() should not be referenced via a fallback global name, but via a use statement.
Loading history...
162 9
        } while ($count);
163
164 9
        return true;
165
    }
166
167
    /**
168
     * @param string $response
169
     * @return array
0 ignored issues
show
introduced by
@return annotation of method \ClickHouseDB\Transport\CurlerRolling::parse_headers_from_curl_response() does not specify type hint for items of its traversable return value.
Loading history...
170
     */
171 42
    private function parse_headers_from_curl_response($response)
0 ignored issues
show
Coding Style introduced by
Method name "CurlerRolling::parse_headers_from_curl_response" is not in camel caps format
Loading history...
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::parse_headers_from_curl_response() does not have parameter type hint for its parameter $response but it should be possible to add it based on @param annotation "string".
Loading history...
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::parse_headers_from_curl_response() does not have return type hint for its return value but it should be possible to add it based on @return annotation "array".
Loading history...
172
    {
173 42
        $headers = [];
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 5 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
174 42
        $header_text = $response;
175
176 42
        foreach (explode("\r\n", $header_text) as $i => $line) {
0 ignored issues
show
introduced by
Function explode() should not be referenced via a fallback global name, but via a use statement.
Loading history...
177 42
            if ($i === 0) {
178 42
                $headers['http_code'] = $line;
179
            } else {
180 41
                $r = explode(': ', $line);
0 ignored issues
show
introduced by
Function explode() should not be referenced via a fallback global name, but via a use statement.
Loading history...
181 41
                if (sizeof($r) == 2) {
0 ignored issues
show
introduced by
Function sizeof() should not be referenced via a fallback global name, but via a use statement.
Loading history...
Coding Style introduced by
The use of function sizeof() is forbidden; use count() instead
Loading history...
introduced by
Operator == is disallowed, use === instead.
Loading history...
182 42
                    $headers[$r[0]] = $r[1];
183
                }
184
            }
185
        }
186
187 42
        return $headers;
188
    }
189
190
    /**
191
     * @return int
192
     */
193 13
    public function countPending()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::countPending() does not have return type hint for its return value but it should be possible to add it based on @return annotation "int".
Loading history...
194
    {
195 13
        return sizeof($this->pendingRequests);
0 ignored issues
show
introduced by
Function sizeof() should not be referenced via a fallback global name, but via a use statement.
Loading history...
Coding Style introduced by
The use of function sizeof() is forbidden; use count() instead
Loading history...
196
    }
197
198
    /**
199
     * @return int
200
     */
201 9
    public function countActive()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::countActive() does not have return type hint for its return value but it should be possible to add it based on @return annotation "int".
Loading history...
202
    {
203 9
        return count($this->activeRequests);
0 ignored issues
show
introduced by
Function count() should not be referenced via a fallback global name, but via a use statement.
Loading history...
204
    }
205
206
    /**
207
     * @return int
208
     */
209
    public function countCompleted()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::countCompleted() does not have return type hint for its return value but it should be possible to add it based on @return annotation "int".
Loading history...
210
    {
211
        return $this->completedRequestCount;
212
    }
213
214
    /**
215
     * Set the limit for how many cURL requests will be execute simultaneously.
216
     *
217
     * Please be mindful that if you set this too high, requests are likely to fail
218
     * more frequently or automated software may perceive you as a DOS attack and
219
     * automatically block further requests.
220
     *
221
     * @param int $count
222
     * @throws \InvalidArgumentException
223
     * @return $this
224
     */
225
    public function setSimultaneousLimit($count)
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::setSimultaneousLimit() does not have parameter type hint for its parameter $count but it should be possible to add it based on @param annotation "int".
Loading history...
226
    {
227
        if (!is_int($count) || $count < 2) {
0 ignored issues
show
introduced by
The condition is_int($count) is always true.
Loading history...
Coding Style introduced by
There must be a single space after a NOT operator; 0 found
Loading history...
introduced by
Function is_int() should not be referenced via a fallback global name, but via a use statement.
Loading history...
228
            throw new \InvalidArgumentException("setSimultaneousLimit count must be an int >= 2");
0 ignored issues
show
Coding Style Comprehensibility introduced by
The string literal setSimultaneousLimit count must be an int >= 2 does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
229
        }
230
231
        $this->simultaneousLimit = $count;
232
        return $this;
233
    }
234
235
    /**
236
     * @return int
237
     */
238 9
    public function getSimultaneousLimit()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::getSimultaneousLimit() does not have return type hint for its return value but it should be possible to add it based on @return annotation "int".
Loading history...
239
    {
240 9
        return $this->simultaneousLimit;
241
    }
242
243
    /**
244
     * @return int
245
     */
246
    public function getRunningRequests()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::getRunningRequests() does not have return type hint for its return value but it should be possible to add it based on @return annotation "int".
Loading history...
247
    {
248
        return $this->runningRequests;
249
    }
250
251
    /**
252
     * @param CurlerRequest $request
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::execOne() has useless @param annotation for parameter $request.
Loading history...
253
     * @param bool $auto_close
0 ignored issues
show
Coding Style introduced by
Expected 10 spaces after parameter type; 1 found
Loading history...
254
     * @return mixed
255
     * @throws TransportException
256
     */
257 41
    public function execOne(CurlerRequest $request, $auto_close = false)
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::execOne() does not have parameter type hint for its parameter $auto_close but it should be possible to add it based on @param annotation "bool".
Loading history...
258
    {
259 41
        $h = $request->handle();
260 41
        curl_exec($h);
0 ignored issues
show
introduced by
Function curl_exec() should not be referenced via a fallback global name, but via a use statement.
Loading history...
261
262 41
        $request->setResponse($this->makeResponse($h));
263
264 41
        if ($auto_close) {
265 4
            $request->close();
266
        }
267
268 41
        return $request->response()->http_code();
269
    }
270
271
    /**
272
     * @return string
273
     */
274
    public function getInfo()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::getInfo() does not have return type hint for its return value but it should be possible to add it based on @return annotation "string".
Loading history...
275
    {
276
        return "runningRequests = {$this->runningRequests} , pending=" . sizeof($this->pendingRequests) . " ";
0 ignored issues
show
Coding Style Best Practice introduced by
Variable "%s" not allowed in double quoted string; use sprintf() or concatenation instead

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
introduced by
Function sizeof() should not be referenced via a fallback global name, but via a use statement.
Loading history...
Coding Style introduced by
The use of function sizeof() is forbidden; use count() instead
Loading history...
Coding Style Comprehensibility introduced by
The string literal does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
277
    }
278
279
    /**
280
     * @throws TransportException
281
     */
282 9
    public function exec()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::exec() does not have return type hint nor @return annotation for its return value.
Loading history...
283
    {
284 9
        $this->makePendingRequestsQue();
285
286
        // ensure we're running
287
        // a request was just completed -- find out which one
288
289 9
        while (($execrun = curl_multi_exec($this->handlerMulti(), $running)) == CURLM_CALL_MULTI_PERFORM);
0 ignored issues
show
Coding Style Best Practice introduced by
It is generally a best practice to always use braces with control structures.

Adding braces to control structures avoids accidental mistakes as your code changes:

// Without braces (not recommended)
if (true)
    doSomething();

// Recommended
if (true) {
    doSomething();
}
Loading history...
introduced by
Function curl_multi_exec() should not be referenced via a fallback global name, but via a use statement.
Loading history...
introduced by
Operator == is disallowed, use === instead.
Loading history...
introduced by
Constant CURLM_CALL_MULTI_PERFORM should not be referenced via a fallback global name, but via a use statement.
Loading history...
290
291 9
        if ($execrun != CURLM_OK) {
0 ignored issues
show
introduced by
Operator != is disallowed, use !== instead.
Loading history...
introduced by
Constant CURLM_OK should not be referenced via a fallback global name, but via a use statement.
Loading history...
292
            throw new TransportException("[ NOT CURLM_OK ]");
0 ignored issues
show
Coding Style Comprehensibility introduced by
The string literal [ NOT CURLM_OK ] does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
293
        }
294
295 9
        $this->runningRequests = $running;
296
297 9
        while ($done = curl_multi_info_read($this->handlerMulti())) {
0 ignored issues
show
introduced by
Function curl_multi_info_read() should not be referenced via a fallback global name, but via a use statement.
Loading history...
298 9
            $response = $this->makeResponse($done['handle']);
299
300
            // send the return values to the callback function.
301
302 9
            $key = (string) $done['handle'];
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 5 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
303 9
            $task_id = $this->handleMapTasks[$key];
304 9
            $request = $this->pendingRequests[$this->handleMapTasks[$key]];
305
306 9
            unset($this->handleMapTasks[$key]);
307 9
            unset($this->activeRequests[$task_id]);
308
309 9
            $this->pendingRequests[$task_id]->setResponse($response);
310 9
            $this->pendingRequests[$task_id]->onCallback();
311
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
312
313 9
            if (!$request->isPersistent()) {
0 ignored issues
show
Coding Style introduced by
There must be a single space after a NOT operator; 0 found
Loading history...
314 9
                unset($this->pendingRequests[$task_id]);
315
            }
316
317 9
            $this->completedRequestCount++;
318
319
            // remove the curl handle that just completed
320 9
            curl_multi_remove_handle($this->handlerMulti(), $done['handle']);
0 ignored issues
show
introduced by
Function curl_multi_remove_handle() should not be referenced via a fallback global name, but via a use statement.
Loading history...
321
322
            // if something was requeued, this will get it running/update our loop check values
323 9
            $status = curl_multi_exec($this->handlerMulti(), $active);
0 ignored issues
show
Unused Code introduced by
The assignment to $status is dead and can be removed.
Loading history...
introduced by
Function curl_multi_exec() should not be referenced via a fallback global name, but via a use statement.
Loading history...
324
        }
325
326
        // see if there is anything to read
327 9
        curl_multi_select($this->handlerMulti(), 0.01);
0 ignored issues
show
introduced by
Function curl_multi_select() should not be referenced via a fallback global name, but via a use statement.
Loading history...
328 9
        return $this->countActive();
329
    }
330
331 9
    public function makePendingRequestsQue()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::makePendingRequestsQue() does not have void return type hint.
Loading history...
332
    {
0 ignored issues
show
Coding Style introduced by
Expected 0 blank lines after opening function brace; 1 found
Loading history...
333
334 9
        $max = $this->getSimultaneousLimit();
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 4 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
335 9
        $active = $this->countActive();
336
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
337
338 9
        if ($active < $max) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
339
340 9
            $canAdd = $max - $active;
341
//            $pending = sizeof($this->pendingRequests);
342
343 9
            $add = [];
344
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
345
346 9
            foreach ($this->pendingRequests as $task_id => $params) {
347 9
                if (empty($this->activeRequests[$task_id])) {
0 ignored issues
show
introduced by
Use early exit to reduce code nesting.
Loading history...
348 9
                    $add[$task_id] = $task_id;
349
                }
350
            }
351
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
352
353 9
            if (sizeof($add)) {
0 ignored issues
show
introduced by
Function sizeof() should not be referenced via a fallback global name, but via a use statement.
Loading history...
Coding Style introduced by
The use of function sizeof() is forbidden; use count() instead
Loading history...
354 9
                if ($canAdd >= sizeof($add)) {
0 ignored issues
show
introduced by
Function sizeof() should not be referenced via a fallback global name, but via a use statement.
Loading history...
Coding Style introduced by
The use of function sizeof() is forbidden; use count() instead
Loading history...
355 9
                    $ll = $add;
356
                } else {
357 1
                    $ll = array_rand($add, $canAdd);
0 ignored issues
show
introduced by
Function array_rand() should not be referenced via a fallback global name, but via a use statement.
Loading history...
358 1
                    if (!is_array($ll)) {
0 ignored issues
show
Coding Style introduced by
There must be a single space after a NOT operator; 0 found
Loading history...
introduced by
Function is_array() should not be referenced via a fallback global name, but via a use statement.
Loading history...
359 1
                        $ll = array($ll => $ll);
0 ignored issues
show
Coding Style introduced by
Short array syntax must be used to define arrays
Loading history...
360
                    }
361
                }
362
363 9
                foreach ($ll as $task_id) {
364 9
                    $this->_prepareLoopQue($task_id);
365
                }
366
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
367
            }// if add
368
        }// if can add
369 9
    }
370
371
    /**
372
     * @param string $task_id
373
     */
374 9
    private function _prepareLoopQue($task_id)
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::_prepareLoopQue() does not have parameter type hint for its parameter $task_id but it should be possible to add it based on @param annotation "string".
Loading history...
introduced by
Method \ClickHouseDB\Transport\CurlerRolling::_prepareLoopQue() does not have void return type hint.
Loading history...
375
    {
376 9
        $this->activeRequests[$task_id] = 1;
377 9
        $this->waitRequests++;
378
379 9
        $h = $this->pendingRequests[$task_id]->handle();
380
381
        // pool
382 9
        curl_multi_add_handle($this->handlerMulti(), $h);
0 ignored issues
show
introduced by
Function curl_multi_add_handle() should not be referenced via a fallback global name, but via a use statement.
Loading history...
383
384 9
        $key = (string) $h;
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 24 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
385 9
        $this->handleMapTasks[$key] = $task_id;
386 9
    }
387
}
388