1 | <?php |
||||
2 | if (! function_exists('supports_ansi_colors')) { |
||||
3 | /** |
||||
4 | * Функция позволяет узнать, поддерживает ли консоль цвета и другое форматирование. |
||||
5 | * @see: https://gostash.it/ru/stashes/1601-podderzivaet-li-konsol-cveta |
||||
6 | * @return bool Результат проверки |
||||
7 | * |
||||
8 | * DIRECTORY_SEPARATOR === '\\' — проверка на Windows. |
||||
9 | * getenv('ANSICON') !== false — проверка запуска через ANSICON. |
||||
10 | * getenv('ConEmuANSI') === 'ON' — проверка запуска через ConEmu. |
||||
11 | * function_exists('posix_isatty') && @posix_isatty(\STDOUT) — проверка на интерактивный терминал UNIX. |
||||
12 | */ |
||||
13 | function supports_ansi_colors() |
||||
14 | { |
||||
15 | return DIRECTORY_SEPARATOR === '\\' |
||||
16 | ? getenv('ANSICON') !== false || getenv('ConEmuANSI') === 'ON' |
||||
17 | : function_exists('posix_isatty') && @posix_isatty(\STDOUT); |
||||
18 | } |
||||
19 | } |
||||
20 | |||||
21 | if (! function_exists('check_email')) { |
||||
22 | /** |
||||
23 | * Проверка строки с email на наличие ошибок |
||||
24 | * Если e-mail валидный, то в ответ будет получено false |
||||
25 | * В противном случае имя ошибки |
||||
26 | * dns - ошибка проверки MX и A записи почтового домена |
||||
27 | * format - ошибка формата email |
||||
28 | * |
||||
29 | * @param string $email проверяемый email |
||||
30 | * @param bool $dns проверять ли DNS записи |
||||
31 | * @return false|string Результат проверки почтового ящика |
||||
32 | */ |
||||
33 | function check_email($email, $dns = true) |
||||
34 | { |
||||
35 | 7 | if (filter_var($email, FILTER_VALIDATE_EMAIL)) { |
|||
36 | 2 | list(, $domain) = explode("@", $email, 2); |
|||
37 | 2 | if (! $dns || ($dns && checkdnsrr($domain, "MX") && checkdnsrr($domain, "A"))) { |
|||
38 | 1 | $error = false; |
|||
39 | } else { |
||||
40 | 2 | $error = 'dns'; |
|||
41 | } |
||||
42 | } else { |
||||
43 | 5 | $error = 'format'; |
|||
44 | } |
||||
45 | |||||
46 | 7 | return $error; |
|||
47 | } |
||||
48 | } |
||||
49 | |||||
50 | if (! function_exists('generate_password')) { |
||||
51 | /** |
||||
52 | * Генерация пароля |
||||
53 | * |
||||
54 | * @param string $len длина пароля |
||||
55 | * @param string $data правила генерации пароля |
||||
56 | * @return string Строка с паролем |
||||
57 | * |
||||
58 | * Расшифровка значений $data |
||||
59 | * "A": A-Z буквы |
||||
60 | * "a": a-z буквы |
||||
61 | * "0": цифры |
||||
62 | * ".": все печатные символы |
||||
63 | * |
||||
64 | * @example |
||||
65 | * generate_password(10,"Aa"); //nwlTVzFdIt |
||||
66 | * generate_password(8,"0"); //71813728 |
||||
67 | * generate_password(11,"A"); //VOLRTMEFAEV |
||||
68 | * generate_password(5,"a0"); //4hqi7 |
||||
69 | * generate_password(5,"."); //2_Vt} |
||||
70 | * generate_password(20,"."); //AMV,>&?J)v55,(^g}Z06 |
||||
71 | * generate_password(20,"aaa0aaa.A"); //rtvKja5xb0\KpdiRR1if |
||||
72 | */ |
||||
73 | function generate_password($len, $data = '') |
||||
74 | { |
||||
75 | 3 | if ($data == '') { |
|||
76 | $data = 'Aa0.'; |
||||
77 | } |
||||
78 | 3 | $opt = strlen($data); |
|||
79 | 3 | $pass = []; |
|||
80 | 3 | for ($i = $len; $i > 0; $i--) { |
|||
81 | 3 | switch ($data[rand(0, ($opt - 1))]) { |
|||
82 | 3 | case 'A': |
|||
83 | 1 | $tmp = rand(65, 90); |
|||
84 | 1 | break; |
|||
85 | 3 | case 'a': |
|||
86 | 1 | $tmp = rand(97, 122); |
|||
87 | 1 | break; |
|||
88 | 2 | case '0': |
|||
89 | 1 | $tmp = rand(48, 57); |
|||
90 | 1 | break; |
|||
91 | default: |
||||
92 | 1 | $tmp = rand(33, 126); |
|||
93 | } |
||||
94 | 3 | $pass[] = chr($tmp); |
|||
95 | } |
||||
96 | 3 | $pass = implode("", $pass); |
|||
97 | |||||
98 | 3 | return $pass; |
|||
99 | } |
||||
100 | } |
||||
101 | |||||
102 | if (! function_exists('get_gravatar')) { |
||||
103 | /** |
||||
104 | * Получение ссылки на аватарку с gravatar |
||||
105 | * |
||||
106 | * @param string $email Почта |
||||
107 | * @param integer $size Размер аватарки |
||||
108 | * @return string |
||||
109 | */ |
||||
110 | function get_gravatar($email, $size = 32) |
||||
111 | { |
||||
112 | 2 | $url = '//www.gravatar.com/avatar/' . md5(is_scalar($email) ? $email : '') . '?s=' . (int)abs($size); |
|||
113 | |||||
114 | 2 | return $url; |
|||
115 | } |
||||
116 | } |
||||
117 | |||||
118 | if (! function_exists('share_vk')) { |
||||
119 | /** |
||||
120 | * Получение ссылки поделиться для "Вконтакте" |
||||
121 | * |
||||
122 | * @param string $url Страница которой следует поделиться |
||||
123 | * @param string $title Заголовок |
||||
124 | * @return string |
||||
125 | */ |
||||
126 | function share_vk($url, $title = '') |
||||
127 | { |
||||
128 | return 'http://vkontakte.ru/share.php?url=' . urlencode($url) . '&title=' . urlencode($title); |
||||
129 | } |
||||
130 | } |
||||
131 | |||||
132 | if (! function_exists('share_ok')) { |
||||
133 | /** |
||||
134 | * Получение ссылки поделиться для "Одноклассников" |
||||
135 | * |
||||
136 | * @param string $url Страница которой следует поделиться |
||||
137 | * @param string $title Заголовок |
||||
138 | * @return string |
||||
139 | */ |
||||
140 | function share_ok($url, $title = '') |
||||
141 | { |
||||
142 | return 'http://www.odnoklassniki.ru/dk?st.cmd=addShare' . |
||||
143 | '&st._surl=' . urlencode($url) . |
||||
144 | '&st.comments=' . urlencode($title); |
||||
145 | } |
||||
146 | } |
||||
147 | |||||
148 | if (! function_exists('share_google')) { |
||||
149 | /** |
||||
150 | * Получение ссылки поделиться для "Google+" |
||||
151 | * |
||||
152 | * @param string $url Страница которой следует поделиться |
||||
153 | * @return string |
||||
154 | */ |
||||
155 | function share_google($url) |
||||
156 | { |
||||
157 | return 'https://plus.google.com/share?url=' . urlencode($url); |
||||
158 | } |
||||
159 | } |
||||
160 | |||||
161 | if (! function_exists('share_facebook')) { |
||||
162 | /** |
||||
163 | * Получение ссылки поделиться для "Facebook" |
||||
164 | * |
||||
165 | * @param string $url Страница которой следует поделиться |
||||
166 | * @param string $title Заголовок |
||||
167 | * @return string |
||||
168 | */ |
||||
169 | function share_facebook($url, $title = '') |
||||
170 | { |
||||
171 | return 'http://www.facebook.com/sharer/sharer.php?s=100' . |
||||
172 | '&p[url]=' . urlencode($url) . |
||||
173 | '&p[title]=' . urlencode($title); |
||||
174 | } |
||||
175 | } |
||||
176 | |||||
177 | if (! function_exists('share_twitter')) { |
||||
178 | /** |
||||
179 | * Получение ссылки поделиться для "Twitter" |
||||
180 | * |
||||
181 | * @param string $url Страница которой следует поделиться |
||||
182 | * @param string $title Заголовок |
||||
183 | * @return string |
||||
184 | */ |
||||
185 | function share_twitter($url, $title = '') |
||||
186 | { |
||||
187 | return 'https://twitter.com/intent/tweet?url=' . urlencode($url) . '&text=' . urlencode($title); |
||||
188 | } |
||||
189 | } |
||||
190 | |||||
191 | if (! function_exists('share_mail')) { |
||||
192 | /** |
||||
193 | * Получение ссылки поделиться для "Mail.ru" |
||||
194 | * |
||||
195 | * @param string $url Страница которой следует поделиться |
||||
196 | * @param string $title Заголовок |
||||
197 | * @return string |
||||
198 | */ |
||||
199 | function share_mail($url, $title = '') |
||||
200 | { |
||||
201 | return 'http://connect.mail.ru/share?share_url=' . urlencode($url) . '&title=' . urlencode($title); |
||||
202 | } |
||||
203 | } |
||||
204 | |||||
205 | if (! function_exists('share_linkedin')) { |
||||
206 | /** |
||||
207 | * Получение ссылки поделиться для "LinkedIN" |
||||
208 | * |
||||
209 | * @param string $url Страница которой следует поделиться |
||||
210 | * @param string $title Заголовок |
||||
211 | * @return string |
||||
212 | */ |
||||
213 | function share_linkedin($url, $title = '') |
||||
214 | { |
||||
215 | return 'http://www.linkedin.com/shareArticle?mini=true&url=' . urlencode($url) . '&title=' . urlencode($title); |
||||
216 | } |
||||
217 | } |
||||
218 | |||||
219 | if (! function_exists('qr_code')) { |
||||
220 | /** |
||||
221 | * Генерация QR-кода для строки |
||||
222 | * |
||||
223 | * @param string $str строка |
||||
224 | * @param int $size размер картинки |
||||
225 | * @return string |
||||
226 | */ |
||||
227 | function qr_code($str, $size = 230) |
||||
228 | { |
||||
229 | $size = (int)$size; |
||||
230 | $size = implode("x", [$size, $size]); |
||||
231 | |||||
232 | return '//chart.apis.google.com/chart?cht=qr&chs=' . $size . '&chl=' . (is_scalar($str) ? urlencode($str) : ''); |
||||
233 | } |
||||
234 | } |
||||
235 | |||||
236 | if (! function_exists('get_user_ip')) { |
||||
237 | /** |
||||
238 | * Получение реального ip текущего пользователя |
||||
239 | * |
||||
240 | * @param string $out IP адрес который будет отдан функцией, если больше ничего не обнаружено |
||||
241 | * @return string IP пользователя |
||||
242 | * |
||||
243 | * @see http://stackoverflow.com/questions/5036443/php-how-to-block-proxies-from-my-site |
||||
244 | */ |
||||
245 | function get_user_ip($out = '127.0.0.1') |
||||
246 | { |
||||
247 | $_getEnv = function ($data) { |
||||
248 | switch (true) { |
||||
249 | case (isset($_SERVER[$data])): |
||||
250 | $out = $_SERVER[$data]; |
||||
251 | break; |
||||
252 | case (isset($_ENV[$data])): |
||||
253 | $out = $_ENV[$data]; |
||||
254 | break; |
||||
255 | case ($tmp = getenv($data)): |
||||
256 | $out = $tmp; |
||||
257 | break; |
||||
258 | case (function_exists('apache_getenv') && $tmp = apache_getenv($data, true)): |
||||
259 | $out = $tmp; |
||||
260 | break; |
||||
261 | default: |
||||
262 | $out = false; |
||||
263 | } |
||||
264 | unset($tmp); |
||||
265 | |||||
266 | return $out; |
||||
267 | }; |
||||
268 | |||||
269 | //Порядок условий зависит от приоритетов |
||||
270 | switch (true === true) { |
||||
271 | case ($tmp = $_getEnv('HTTP_COMING_FROM')): |
||||
272 | $out = $tmp; |
||||
273 | break; |
||||
274 | case ($tmp = $_getEnv('HTTP_X_COMING_FROM')): |
||||
275 | $out = $tmp; |
||||
276 | break; |
||||
277 | case ($tmp = $_getEnv('HTTP_VIA')): |
||||
278 | $out = $tmp; |
||||
279 | break; |
||||
280 | case ($tmp = $_getEnv('HTTP_FORWARDED')): |
||||
281 | $out = $tmp; |
||||
282 | break; |
||||
283 | case ($tmp = $_getEnv('HTTP_FORWARDED_FOR')): |
||||
284 | $out = $tmp; |
||||
285 | break; |
||||
286 | case ($tmp = $_getEnv('HTTP_X_FORWARDED')): |
||||
287 | $out = $tmp; |
||||
288 | break; |
||||
289 | case ($tmp = $_getEnv('HTTP_X_FORWARDED_FOR')): |
||||
290 | $out = $tmp; |
||||
291 | break; |
||||
292 | case (! empty($_SERVER['REMOTE_ADDR'])): |
||||
293 | $out = $_SERVER['REMOTE_ADDR']; |
||||
294 | break; |
||||
295 | } |
||||
296 | unset($tmp); |
||||
297 | |||||
298 | return (is_scalar($out) && preg_match('|^(?:[0-9]{1,3}\.){3,3}[0-9]{1,3}$|', $out, $matches)) ? $out : false; |
||||
299 | } |
||||
300 | } |
||||
301 | |||||
302 | if (! function_exists('whois_query')) { |
||||
303 | /** |
||||
304 | * Получение whois информации о домене |
||||
305 | * @see http://www.jonasjohn.de/snippets/php/whois-query.htm |
||||
306 | * |
||||
307 | * @param string $domain домен |
||||
308 | * @return string |
||||
309 | */ |
||||
310 | function whois_query($domain) |
||||
311 | { |
||||
312 | |||||
313 | // fix the domain name: |
||||
314 | $domain = strtolower(trim($domain)); |
||||
315 | $domain = preg_replace('/^http:\/\//i', '', $domain); |
||||
316 | $domain = preg_replace('/^www\./i', '', $domain); |
||||
317 | $domain = explode('/', $domain); |
||||
318 | $domain = trim($domain[0]); |
||||
319 | |||||
320 | // split the TLD from domain name |
||||
321 | $_domain = explode('.', $domain); |
||||
322 | $lst = count($_domain) - 1; |
||||
323 | $ext = $_domain[$lst]; |
||||
324 | |||||
325 | // You find resources and lists |
||||
326 | // like these on wikipedia: |
||||
327 | // |
||||
328 | // <a href="http://de.wikipedia.org/wiki/Whois">http://de.wikipedia.org/wiki/Whois</a> |
||||
329 | // |
||||
330 | $servers = [ |
||||
331 | "biz" => "whois.neulevel.biz", |
||||
332 | "com" => "whois.internic.net", |
||||
333 | "us" => "whois.nic.us", |
||||
334 | "coop" => "whois.nic.coop", |
||||
335 | "info" => "whois.nic.info", |
||||
336 | "name" => "whois.nic.name", |
||||
337 | "net" => "whois.internic.net", |
||||
338 | "gov" => "whois.nic.gov", |
||||
339 | "edu" => "whois.internic.net", |
||||
340 | "mil" => "rs.internic.net", |
||||
341 | "int" => "whois.iana.org", |
||||
342 | "ac" => "whois.nic.ac", |
||||
343 | "ae" => "whois.uaenic.ae", |
||||
344 | "at" => "whois.ripe.net", |
||||
345 | "au" => "whois.aunic.net", |
||||
346 | "be" => "whois.dns.be", |
||||
347 | "bg" => "whois.ripe.net", |
||||
348 | "br" => "whois.registro.br", |
||||
349 | "bz" => "whois.belizenic.bz", |
||||
350 | "ca" => "whois.cira.ca", |
||||
351 | "cc" => "whois.nic.cc", |
||||
352 | "ch" => "whois.nic.ch", |
||||
353 | "cl" => "whois.nic.cl", |
||||
354 | "cn" => "whois.cnnic.net.cn", |
||||
355 | "cz" => "whois.nic.cz", |
||||
356 | "de" => "whois.nic.de", |
||||
357 | "fr" => "whois.nic.fr", |
||||
358 | "hu" => "whois.nic.hu", |
||||
359 | "ie" => "whois.domainregistry.ie", |
||||
360 | "il" => "whois.isoc.org.il", |
||||
361 | "in" => "whois.ncst.ernet.in", |
||||
362 | "ir" => "whois.nic.ir", |
||||
363 | "mc" => "whois.ripe.net", |
||||
364 | "to" => "whois.tonic.to", |
||||
365 | "tv" => "whois.tv", |
||||
366 | "ru" => "whois.ripn.net", |
||||
367 | "org" => "whois.pir.org", |
||||
368 | "aero" => "whois.information.aero", |
||||
369 | "nl" => "whois.domain-registry.nl" |
||||
370 | ]; |
||||
371 | |||||
372 | if (! isset($servers[$ext])) { |
||||
373 | throw new ErrorException('No matching nic server found!'); |
||||
374 | } |
||||
375 | |||||
376 | $nic_server = $servers[$ext]; |
||||
377 | |||||
378 | $output = ''; |
||||
379 | |||||
380 | // connect to whois server: |
||||
381 | if ($conn = fsockopen($nic_server, 43)) { |
||||
382 | fputs($conn, $domain . "\r\n"); |
||||
383 | while (! feof($conn)) { |
||||
384 | $output .= fgets($conn, 128); |
||||
385 | } |
||||
386 | fclose($conn); |
||||
387 | } else { |
||||
388 | throw new ErrorException('Could not connect to ' . $nic_server . '!'); |
||||
389 | } |
||||
390 | |||||
391 | return $output; |
||||
392 | } |
||||
393 | } |
||||
394 | |||||
395 | if (! function_exists('copyright')) { |
||||
396 | /** |
||||
397 | * Геренатор года для подстановки в копирайты |
||||
398 | * |
||||
399 | * @param string $year год запуска проекта |
||||
400 | * @param string $sep разделитель годов |
||||
401 | * @return string |
||||
402 | */ |
||||
403 | function copyright($year, $sep = ' - ') |
||||
404 | { |
||||
405 | $y = date('Y'); |
||||
406 | |||||
407 | return ($y != $year) ? ($year . $sep . $y) : $year; |
||||
408 | } |
||||
409 | } |
||||
410 | |||||
411 | if (! function_exists('mime_file')) { |
||||
412 | /** |
||||
413 | * Получение MIME типа файла |
||||
414 | * |
||||
415 | * @param string $fname путь к файлу |
||||
416 | * @return string |
||||
417 | */ |
||||
418 | function mime_file($fname) |
||||
419 | { |
||||
420 | $out = null; |
||||
421 | switch (true) { |
||||
422 | case class_exists('\finfo'): |
||||
423 | $fi = new \finfo(FILEINFO_MIME); |
||||
424 | $out = $fi->file($fname); |
||||
425 | break; |
||||
426 | case function_exists('mime_content_type'): |
||||
427 | list($out) = explode(';', @mime_content_type($fname)); |
||||
428 | break; |
||||
429 | default: |
||||
430 | /** |
||||
431 | * @see: http://www.php.net/manual/ru/function.finfo-open.php#112617 |
||||
432 | */ |
||||
433 | $fh = fopen($fname, 'rb'); |
||||
434 | if ($fh) { |
||||
435 | $bytes6 = fread($fh, 6); |
||||
436 | fclose($fh); |
||||
437 | switch (true) { |
||||
438 | case ($bytes6 === false): |
||||
439 | break; |
||||
440 | case (substr($bytes6, 0, 3) == "\xff\xd8\xff"): |
||||
441 | $out = 'image/jpeg'; |
||||
442 | break; |
||||
443 | case ($bytes6 == "\x89PNG\x0d\x0a"): |
||||
444 | $out = 'image/png'; |
||||
445 | break; |
||||
446 | case ($bytes6 == "GIF87a" || $bytes6 == "GIF89a"): |
||||
447 | $out = 'image/gif'; |
||||
448 | break; |
||||
449 | default: |
||||
450 | $out = 'application/octet-stream'; |
||||
451 | } |
||||
452 | } |
||||
453 | } |
||||
454 | |||||
455 | return $out; |
||||
456 | } |
||||
457 | } |
||||
458 | |||||
459 | if (! function_exists('image_size')) { |
||||
460 | /** |
||||
461 | * Определение размеров картинки |
||||
462 | * |
||||
463 | * @param string $image путь к картинке |
||||
464 | * @param string|null $mode какой размер ширину/высоту или все вместе |
||||
465 | * @return array|int |
||||
466 | */ |
||||
467 | function image_size($image, $mode = null) |
||||
468 | { |
||||
469 | $width = $height = 0; |
||||
470 | if (is_scalar($image) && is_file($image)) { |
||||
471 | $size = @getimagesize($image); |
||||
472 | $width = isset($size[0]) ? $size[0] : 0; |
||||
473 | $height = isset($size[1]) ? $size[1] : 0; |
||||
474 | } |
||||
475 | switch ($mode) { |
||||
476 | case 'w': |
||||
477 | case 'width': |
||||
478 | $out = $width; |
||||
479 | break; |
||||
480 | case 'h': |
||||
481 | case 'height': |
||||
482 | $out = $height; |
||||
483 | break; |
||||
484 | default: |
||||
485 | $out = [$width, $height]; |
||||
486 | } |
||||
487 | |||||
488 | return $out; |
||||
489 | } |
||||
490 | } |
||||
491 | |||||
492 | if (! function_exists('plural')) { |
||||
493 | /** |
||||
494 | * Определение падежа слова в зависимости от числового значения |
||||
495 | * |
||||
496 | * @param int|string $number число |
||||
497 | * @param array $titles массив слов в разных склонениях (1 яблоко, 2 яблока, 5 яблок) |
||||
498 | * @return string |
||||
499 | */ |
||||
500 | function plural($number, array $titles = []) |
||||
501 | { |
||||
502 | $cases = [2, 0, 1, 1, 1, 2]; |
||||
503 | $number = abs((int)$number); |
||||
504 | $position = ($number % 100 > 4 && $number % 100 < 20) ? 2 : $cases[($number % 10 < 5) ? $number % 10 : 5]; |
||||
505 | $out = isset($titles[$position]) ? $titles[$position] : ''; |
||||
506 | |||||
507 | return $out; |
||||
508 | } |
||||
509 | } |
||||
510 | |||||
511 | if (! function_exists('validate_date')) { |
||||
512 | /** |
||||
513 | * Проверка валидности даты |
||||
514 | * |
||||
515 | * Пример валидации даты через дополнительную проверку $validator |
||||
516 | * function($date, $iterval){ |
||||
517 | * return ($iterval->format('%R') == '+'); |
||||
518 | * } |
||||
519 | * Таким образом все даты которые уже прошли будут помечены как не валидные |
||||
520 | * |
||||
521 | * @param string $date проверяемая дата |
||||
522 | * @param string $fromFormat в каком формате записана исходная дата |
||||
523 | * @param string $toFormat в каком формате вернуть дату, если она валидна |
||||
524 | * @param Closure $validator метод для дополнительной проверки даты |
||||
525 | * @return null|string |
||||
526 | */ |
||||
527 | function validate_date($date, $fromFormat = 'Y-m-d', $toFormat = 'Y-m-d', Closure $validator = null) |
||||
528 | { |
||||
529 | $validTime = false; |
||||
530 | $datetime2 = null; |
||||
531 | if (is_scalar($date)) { |
||||
532 | $datetime1 = new \DateTime("NOW"); |
||||
533 | $datetime2 = \DateTime::createFromFormat($fromFormat, $date); |
||||
534 | if ($datetime2 instanceof \DateTime) { |
||||
535 | $interval = $datetime1->diff($datetime2); |
||||
536 | $validTime = is_callable($validator) ? (bool)$validator($datetime2, $interval) : true; |
||||
537 | } |
||||
538 | } |
||||
539 | |||||
540 | return $validTime ? $datetime2->format($toFormat) : null; |
||||
541 | } |
||||
542 | } |
||||
543 | if (! function_exists('format_bytes')) { |
||||
544 | /** |
||||
545 | * Преобразование из байт в другие порядки (кило, мега, гига) с добавлением префикса |
||||
546 | * |
||||
547 | * @param string $bytes Обрабатываемое число |
||||
548 | * @param integer $precision До какого числа после запятой округлять |
||||
549 | * @param array $suffixes Массив суффиксов |
||||
550 | * @return string |
||||
551 | */ |
||||
552 | function format_bytes($bytes, $precision = 2, $suffixes = ['Байт', 'Кбайт', 'Мбайт', 'Гбайт', 'Тбайт']) |
||||
553 | { |
||||
554 | $bytes = (float)$bytes; |
||||
555 | if (empty($bytes)) { |
||||
556 | return 0; |
||||
557 | } |
||||
558 | $base = log($bytes, 1024); |
||||
559 | |||||
560 | return trim( |
||||
561 | round(pow(1024, $base - floor($base)), $precision) . |
||||
562 | ' ' . |
||||
563 | get_key($suffixes, (int)$base, '', 'is_scalar') |
||||
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||||
564 | ); |
||||
565 | } |
||||
566 | } |
||||
567 | |||||
568 | if (! function_exists('format_microtime')) { |
||||
569 | /** |
||||
570 | * Форматирование microtime времени |
||||
571 | * @param string $time microtime время |
||||
572 | * @param int $len Кол-во символов после точки |
||||
573 | */ |
||||
574 | function format_microtime($time, $len = 4) |
||||
575 | { |
||||
576 | return sprintf("%." . (int)$len . "f", $time); |
||||
577 | } |
||||
578 | } |
||||
579 | if (! function_exists('ip_in_range')) { |
||||
580 | /** |
||||
581 | * Входит ли указанный IP в заданный диапазон |
||||
582 | * |
||||
583 | * @param string $ip IP клиента |
||||
584 | * @param string $lower Начальный IP диапазона |
||||
585 | * @param string $upper Конечный IP диапазона |
||||
586 | * @return bool |
||||
587 | */ |
||||
588 | function in_ip_range($ip, $lower, $upper) |
||||
589 | { |
||||
590 | return (ip2long($lower) <= ip2long($ip) && ip2long($upper) >= ip2long($ip)) ? true : false; |
||||
591 | } |
||||
592 | } |
||||
593 | |||||
594 | if (! function_exists('make_csv')) { |
||||
595 | /** |
||||
596 | * Формирование правильной CSV строки |
||||
597 | * |
||||
598 | * @see: https://stackoverflow.com/questions/3933668/convert-array-into-csv |
||||
599 | * @param array $data Массив с данными |
||||
600 | * @return string |
||||
601 | */ |
||||
602 | function make_csv($data, $separator = ",") |
||||
603 | { |
||||
604 | // Create a stream opening it with read / write mode |
||||
605 | $stream = fopen('data://text/plain,' . "", 'w+'); |
||||
606 | |||||
607 | // Iterate over the data, writting each line to the text stream |
||||
608 | fputcsv($stream, $data, $separator); |
||||
0 ignored issues
–
show
It seems like
$stream can also be of type false ; however, parameter $handle of fputcsv() does only seem to accept resource , 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
![]() |
|||||
609 | |||||
610 | // Rewind the stream |
||||
611 | rewind($stream); |
||||
0 ignored issues
–
show
It seems like
$stream can also be of type false ; however, parameter $handle of rewind() does only seem to accept resource , 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
![]() |
|||||
612 | |||||
613 | // You can now echo it's content |
||||
614 | $out = stream_get_contents($stream); |
||||
0 ignored issues
–
show
It seems like
$stream can also be of type false ; however, parameter $handle of stream_get_contents() does only seem to accept resource , 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
![]() |
|||||
615 | |||||
616 | // Close the stream |
||||
617 | fclose($stream); |
||||
0 ignored issues
–
show
It seems like
$stream can also be of type false ; however, parameter $handle of fclose() does only seem to accept resource , 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
![]() |
|||||
618 | |||||
619 | return $out; |
||||
620 | } |
||||
621 | } |
||||
622 |