Подсчет времени выполнения php. Время выполнения PHP скрипта

Технологии продаж 17.06.2019

Приветствую Вас, уважаемые читатели блога webcodius! Итак, сразу к делу. Сначала отвечу на вторую часть вопроса: зачем же может понадобиться измерить время выполнения скрипта ?.При работе над отладкой веб-проектов важным фактором, который следует обязательно учитывать, является время выполнения скриптов. Этот параметр необходим чтобы понять насколько быстро и производительно работает тот или иной кусок кода. Определив время потраченное сервером на выполнение php скрипта, вы сможете сделать вывод: требуется ли оптимизация кода или нет. Далее рассмотрим как это сделать.

Файл доступен только для чтения, а указатель устанавливается в начале файла. Как вы можете видеть, проблема тривиальна. Эта библиотека работает несколько иначе, чем описанная выше - функция, возвращающая данные, которые отправляются клиенту, добавляется к функции возврата, в которой мы устанавливаем наши ограничения и ограничения.

Как ограничения размера отправляются на файловый сервер?

Например, чтобы установить ограничение на загрузку, вам нужен только этот код. Как вы можете видеть, оба решения легко реализовать. С другой стороны, как часто вы перемещаете страницы между разными серверами? Размеры, отправленные на файловый сервер, ограничены несколькими факторами, которые в свою очередь ограничивают этот размер.

Для анализа производительности php-скриптов существуют различные расширения и библиотеки, например XDebug, которое может выполнять отладку скриптов и профилировать их по времени выполнения. Но для использования таких расширений требуется потратить время на их установку и настройку. Конечно для оптимизации работы крупных проектов со соложной архитектурой, большим количеством скриптов и миллионами строк кода лучше воспользоваться такими расширениями. Но если необходимо оптимизировать 3-4 скрипта с одной или двумя сотнями строк кода, то для измерения времени работы скрипта можно воспользоваться только средствами php.

Учителя могут установить предел для своих курсов в соответствующих настройках курса. Некоторые действия имеют индивидуально установленные ограничения размера файла, которые устанавливаются при их создании. Очень легко изменить все эти настройки на окнах.

Как изменить максимальное время выполнения скрипта?

После сохранения этого файла перезапустите сервер. Побочным эффектом увеличения файлов, которые принимает сервер, является увеличение времени выполнения операций над ними. Значение по умолчанию для тайм-аута, в котором должен выполняться сценарий, составляет 300 секунд. Строка с этой переменной должна выглядеть примерно так. Конечно, значение, которое вы хотите изменить здесь, равно 300.

Как в php определить время выполнения скрипта

Научись создавать профессиональные движки на PHP и MySQL

Данная задача легко решается с помощью функций для работы с датой и временем, а именно встроенной функции microtime() , которая возвращает число секунд, прошедших с полуночи 01.01.1970. Вызвав эту функцию дважды, мы можем вычислить время прошедшее в период между вызовами:

После внесения этих изменений перезапустите сервер, чтобы изменения вступили в силу. Если это не удается, вам придется вручную изменить свой пароль в базе данных. Скопируйте и вставьте пароль в свой собственный и сохраните изменения. Затем войдите в свою учетную запись, используя свой гостевой пароль. Наверное, он был поврежден.

Мои изменения в таблице стилей не отображаются

Вы должны использовать принудительное обновление страницы для перезагрузки всех файлов.

Весы доступны по всему сайту

Чтобы добавить шкалу, доступную во всех курсах, перейдите в раздел шкалы из блока администрирования и используйте клавиши со стрелками, чтобы переместить выбранные шкалы в стандартные шкалы.

Если запустить скрипт, то результат будет примерно таким:

Время выполнения скрипта: 0,00059400000000001

Кратко, как это работает. С помощью функции microtime(true) запоминаем метку времени начала работы скрипта в переменную $start . Далее идет рабочий код, который выполняет какие-то действия. В данном примере просто вызывается функция usleep() , которая замедляет работу скрипта на задданное количество микросекунд. И затем получаем время окончания работы скрипта, запоминаем ее в переменную $end и вычисляем время выполнения кода путем вычитания $start из $end . В итоге получили время выполнения скрипта.

Пользователи не подписаны с курсов без какой-либо разумной причины!

Вы можете распечатать пользователя с курса в следующих случаях. Если указанное время прошло с тех пор, как пользователь зачислил курс, он автоматически будет удален из курса. Вы можете изменить эту переменную в настройках курса. . Это происходит, если в вашем языковом пакете нет строк символов, которые должны теперь отображаться.

Коррупция базы данных чаще всего возникает в результате физических ошибок, которые могли произойти на сервере. Ниже приведена типичная ошибка, которая может указывать на повреждение базы данных. Помните, что ремонт больших таблиц может занять много времени. Обычно это вызвано неправильной работой не стандартных модулей, которые вы установили. Чтобы удалить недопустимый рабочий модуль.

Теперь зная как определить в php время выполнения скрипта , вы можете приступать к оптимизации различных блоков кода. Желаю удачи и до встречи в следующих постах!

Сколько бы мы не использовали PHP, всё равно всплывают некоторые функции, о которых мы даже не слышали. Некоторые из них были бы нам очень полезны. Я создал небольшой список полезных функций, которые должны быть в арсенале каждого PHP программиста.

Это сообщение иногда генерируется, если есть попытка отправить файл больше, чем разрешено. В настройках курса можно выбрать только «интерактивные» методы сохранения. Прочтите документацию о них: плагины для регистрации. Форум «Новости» удален, установив количество показанных ему сообщений.

После регистрации он перемещается в нижней части этой страницы. Он остается на странице, чтобы вы могли обновить свою регистрацию. Для более глубокого обсуждения идеи этой кнопки читайте. Программа была создана для удаления ненужных элементов, таких как комментарии и пустые пробелы из кода. Результатом программы является файл результатов, который характеризуется значительно меньшим весом и коротким временем выполнения. К сожалению, такая оптимизация связана также с частичной реорганизацией кода и ухудшением его удобочитаемости.

1. Создание функций с переменным числом аргументов

Скорее всего, вы уже знаете, что PHP позволяет нам создавать функции с необязательными аргументами. Сейчас я покажу функцию, в которой число аргументов может меняться от случая к случаю.

Но для начала, вспомним как мы создаём функции обычным образом:

// функция с двумя необязательными параметрами function foo($arg1 = "", $arg2 = "") { echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; } foo("hello","world"); /* выведет: arg1: hello arg2: world */ foo(); /* выведет: arg1: arg2: */

Интерфейс программы понятен и предлагает все необходимые функции, в том числе. Удаление пробелов - удаление пустого пространства из кода, обфускация - экстремальная оптимизация, использование опций приведет к дополнительному уменьшению размера файла, но приведет к дальнейшему снижению четкости кода. Также могут быть ошибки в выходных файлах. . В этом месте будет создана оптимизированная версия файла. Создание резервной копии перед началом оптимизации является ключевым элементом. Кроме того, если мы заботимся о надежности сайта, перед развертыванием какого-либо нового файла, вы должны сначала протестировать операцию на локальном сервере или, например, в тестовом домене.

Теперь посмотрим на то, как можно написать функцию с неограниченным количеством аргументов. Для этого будет использовать метод func_get_args() :

// не указываем аргументы function foo() { // возвращает массив, переданных аргументов $args = func_get_args(); foreach ($args as $k => $v) { echo "arg".($k+1).": $v\n"; } } foo(); /* ничего не выведет */ foo("hello"); /* выведет arg1: hello */ foo("hello", "world", "again"); /* выведет arg1: hello arg2: world arg3: again */

Не экспериментируйте с живыми организмами! Во втором варианте пустые комментарии пространства были удалены, код был сведен к максимуму. При такой договоренности сокращение количества переданных данных и сокращение времени выполнения может быть недостижимым, хотя после того, как эталон будет показывать различия.

Здесь следует упомянуть второй негативный фактор, а именно из-за незначительной разборчивости кода, всегда иметь под рукой исходные файлы, которые в случае вложенной ситуации мы сможем использовать. Поэтому по соображениям безопасности мы должны хранить две версии файла на сервере, что приводит к дополнительному дисковым пространствам.

2. Используем Glob() для поиска файлов

Часто названия функций говорят сами за себя. Такого нельзя сказать о функции glob() .

Если не вдаваться в подробности, её функциональность схожа с методом scandir() . Она позволяет найти необходимый файл по шаблону:

Обратите внимание, что во избежание проблем с сбросом пароля всегда держите свой текущий адрес электронной почты на панели «Контактная информация» вашей учетной записи хостинга. Нажмите кнопку: Сбросьте пароль под кнопкой: Логин. Войдите в учетную запись хостинга и нажмите кнопку «Сбросить пароль». Введите адрес электронной почты, указанный на панели управления учетной записью, и нажмите кнопку «Отправить защитный код». Проверьте почту, чтобы прочитать код безопасности, отправленный по электронной почте.

Введите полученный код и нажмите кнопку: Отослать Двойной, чтобы избежать ошибок, ввести новый пароль и подтвердить операцию, нажав кнопку: Установить пароль. Система информирует пользователя хоста о каждом изменении пароля, отправив соответствующее электронное письмо с подтверждением на адрес электронной почты.

// найти все php файлы $files = glob("*.php"); print_r($files); /* выведет: Array ( => phptest.php => pi.php => post_output.php => test.php) */

Для нахождения файлов нескольких типов надо писать так:

// найти все php и txt файлы $files = glob("*.{php,txt}", GLOB_BRACE); print_r($files); /* на выходе: Array ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

Так же можно в шаблоне указать путь:

$files = glob("../images/a*.jpg"); print_r($files); /* на выходе: Array ( => ../images/apple.jpg => ../images/art.jpg) */

Вы должны подтвердить свои изменения, нажав кнопку «Сохранить» под списком расширений. Дополнительная информация в разделе: хостинг - помощь. На хостинге - правила продвижения. Вы можете заказать услуги и перечислить счета. Мы особенно поощряем владельцев интернет-магазинов. Акции не связывают друг с другом и скидочные коды для хостинга.

Обратите внимание, что каждый, кто покупает хостинг в нашей компании и отправляет электронный документ, подтверждающий наличие платной учетной записи хостинга у другого поставщика услуг, получит шесть дополнительных месяцев бесплатной подписки. Время вызова скрипта может быть строго определено следующими диапазонами.

Для того чтобы получить полный путь к документу используйте метод realpath() :

$files = glob("../images/a*.jpg"); // Применить функцию "realpath" к каждому элементу массива $files = array_map("realpath",$files); print_r($files); /* выведет: Array ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. Информация об используемой памяти

Если вы будете отслеживать количество памяти, которое съедается на работу ваших скриптов то, наверное, чаще будете их оптимизировать.

Каждые пять минут, каждый час, каждый день, каждую неделю, каждый месяц в определенное время. Это пространство на сервере, которое работает в оптимальной среде, созданной в центре обработки данных. Это где каждая машина подключена к инфраструктуре, которая обеспечивает несколько интернет-соединений и аварийное питание, поэтому ваш сервис доступен 24 часа в сутки.

Хотите узнать, как выбрать лучший хостинг? Эти вопросы - мечта многих людей, и ответ прост. Если вы только начинаете приключение со своим собственным сайтом в Интернете, вам просто нужно получить самый маленький веб-хостинг. Хорошая идея для всех начинающих веб-мастеров.

В PHP существует мощный инструмент отслеживания используемой памяти. В разных частях скрипта нагрузки могут быть разные. Для того чтобы получить значение используемой памяти в данный момент, нам следует использовать метод memory_get_usage() . Для фиксации максимального количества используемой памяти используем memory_get_peak_usage()

В стартовом пакете вы получите в 2 раза больше! Неограниченная передача данных не будет упоминаться, поскольку она является стандартной для ведущих хостинг-провайдеров. Что делать, если ваш проект окажется равным 10? Во время подписки вы можете легко перейти на более высокое предложение, заплатив только разницу, которую вы делаете.

Гибкий хостинг «растет» с вашим сайтом

Отдельные языки программирования также имеют требования, например, для атрибутов, прав доступа или имен расширений файлов. В следующей статье представлена ​​основная информация о каждом языке программирования. Директивы, обрабатываемые расширениями, перечислены и подробно указаны на страницах документации по расширению; Например, информацию о директивах сеанса можно найти на странице сеансов.

Echo "Initial: ".memory_get_usage()." bytes \n"; /* Initial: 361400 bytes */ // дадим небольшую нагрузку for ($i = 0; $i < 100000; $i++) { $array = md5($i); } // и ещё for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* Peak: 13687072 bytes */

4. Информация о процессоре

Для этого необходимо использовать метод getrusage() . Но учтите, что на Windows эта функция работать не будет.

Пунктуальность и безопасность - это уникальная статья, в которой рассказывается о том, как бороться с наркотиками. Задает имя файла, который будет автоматически анализироваться и выполняться перед основным файлом. Задает имя файла, который будет автоматически анализироваться и выполняться после основного файла.

Специальное значение не отменяет автоматического выполнения. Чтобы отключить это, установите для этого параметра пустое значение. Ниже приводится краткое описание директив конфигурации. Он проверит первый путь, и если вы не можете найти его, проверьте следующий путь, пока файл не находится, или возвращается с предупреждением или ошибки.

Print_r(getrusage()); /* prints Array ( => 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0) */

Картина, изложенная выше, будет понятно тем, у кого есть опыт в системном администрировании. Для всех остальных предлагаем расшифровку:

Все символические ссылки разрешены, поэтому избежать этого ограничения с помощью символической ссылки невозможно. Особое значение. указывает, что рабочий каталог скрипта будет использоваться в качестве базового каталога. В других системах имена каталогов должны быть разделены двумя точками. Если вы хотите ограничить доступ только к одному каталогу, добавьте косую черту в конце. Режим по умолчанию - разрешить открытие всех файлов.

Он используется только в том случае, если он не является вакуумом. Измените значение 0, только если вы знаете, что делаете. Подписано протоколирование. Если включено, функции входа в базу данных, которые используют значения по умолчанию, будут использовать их вместо аргументов, предоставленных пользователем. Чтобы узнать о значениях по умолчанию, перейдите к документации по функциям входа в эту базу данных.

  • ru_oublock: количество операций блочной записи
  • ru_inblock: количество операций блочного чтения
  • ru_msgsnd: количество отправленных сообщений
  • ru_msgrcv: количество принятых сообщений
  • ru_maxrss: максимальный размер невыгружаемого набора
  • ru_ixrss: общий объем разделяемой памяти
  • ru_idrss: общий объем неразделяемых данных
  • ru_minflt: количество используемых страниц памяти
  • ru_majflt: количество ошибок отсутствия страниц
  • ru_nsignals: количество принятых сигналов
  • ru_nvcsw: количество переключений контекста процессом
  • ru_nivcsw: количество принудительных переключений контекста
  • ru_nswap: количество обращений к диску при подкачке страниц
  • ru_utime.tv_usec: время работы в пользовательском режиме (микросекунды)
  • ru_utime.tv_sec: время работы в пользовательском режиме (секунды)
  • ru_stime.tv_usec: время работы в привилегированном режиме (микросекунды)
  • ru_stime.tv_sec: время работы в привилегированном режиме (секунды)

Для того чтобы узнать какие ресурсы вашего процессора используются скриптом, вам необходимо значение ‘user time’ (время работы в пользовательском режиме) и ’system time’ (время работы в привилегированном режиме). Вы можете получить результат как в секундах, так и в микросекундах. Для того чтобы превратить общее количество секунд в десятичное число, вам необходимо разделить значение микросекунд на 1 миллион и добавить к значению секунд.

С развитием человека его проблемы эволюционировали, решением этого было изобретение вычислительной машины, которая радикально изменила бы его образ жизни. Быстрое развитие программных и аппаратных ресурсов в информационных технологиях имеет большую ценность для обеспечения лучшей связи и более быстрого доступа ко всем категориям информации. Эта статья содержит довольно подробные теоретические и практические аспекты способов понимания и реализации приложения. Документ структурирован в 5 главах, каждая глава, в свою очередь, имеет несколько подшаблонов.

Запутанно как-то. Вот пример:

// отдыхаем 3 секунды sleep(3); $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 0.011552 System time: 0 */

Хотя выполнение скрипта заняло около 3-х секунд, процессор не был сильно нагружен. Дело в том, что при вызове (sleep) скрипт практически не потребляет ресурсов процессора. Вообще существует множество задач, которые занимают значительное время, но при этом не используют процессор. К примеру, ожидание операций связанных с диском. Так что вы не всегда используете процессорное время в своих скриптах.

Вот ещё пример:

// пройтись 10 миллионов раз for($i=0;$i<10000000;$i++) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.424592 System time: 0.004204 */

Работа скрипта заняла 1.4 секунды процессорного времени. В данном случае, время системных вызовов вообще низкое.

Время работы в привилегированном режиме (System Time) - это время, которое процессор затрачивает на выполнение системных запросов к ядру от имени программы. Пример:

$start = microtime(true); // вызываем microtime каждые 3 секунды while(microtime(true) - $start < 3) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.088171 System time: 1.675315 */

Теперь системного времени затратилось намного больше, чем в прошлом примере. Всё благодаря методу microtime(), который использует ресурсы системы.

Однако следует отметить, что выведенное время может быть не точным, т.к. в данный момент времени ресурсы процессора используются и другими программами, что в результате может дать небольшую погрешность.

5. Магические константы

В PHP существует множество магических констант, таких как номер текущей строки (__LINE__), путь к файлу (__FILE__), путь к каталогу (__DIR__), имя функции (__FUNCTION__), имя класса (__CLASS__), имя метода (__METHOD__) и пространства имён (__NAMESPACE__).

Все мы их рассматривать не будем. Посмотрим только лишь парочку:

// этот скрипт зависит от текущего расположения файла и // может вызвать проблемы, если его использовать из разных дирректорий require_once("config/database.php"); // этот скрипт не вызовет проблем require_once(dirname(__FILE__) . "/config/database.php");

Используйте __LINE__ при отладке скриптов:

// код // ... my_debug("some debug message", __LINE__); /* выведет Line 4: some debug message */ // ещё код // ... my_debug("another debug message", __LINE__); /* выведет Line 11: another debug message */ function my_debug($msg, $line) { echo "Line $line: $msg\n"; }

6. Генерирование уникальных ID

Бывают такие моменты, когда вам надо сгенерировать уникальную строку. Множество раз я видел, что для решения этой задачи используют функцию md5():

// генерируем случайную строку echo md5(time() . mt_rand(1,1000000));

Но на самом деле для этих целей в PHP есть специальная функция uniqid()

// генерируем случайную строку echo uniqid(); /* выведет 4bd67c947233e */ // ещё разок echo uniqid(); /* выведет 4bd67c9472340 */

Невооружённым взглядом можно заметить, что первые символы мягко говоря схожи… Так происходит из-за того, что данный метод использует время сервера для генерации символов. Это даже полезно, т.к. все сгенерированные значения получаются в алфавитном порядке, что даёт возможность быстро их сортировать.

Для того чтобы уменьшить шансы получения дубликата, мы можем добавить префикс или использовать второй параметр (увеличит количество символов):

// с префиксом echo uniqid("foo_"); /* выведет foo_4bd67d6cd8b8f */ // со вторым параметром echo uniqid("",true); /* выведет 4bd67d6cd8b926.12135106 */ // оба echo uniqid("bar_",true); /* выведет bar_4bd67da367b650.43684647 */

Этот метод генерирует строки размером меньше, чем md5, тем самым вы сможете сэкономить место.

7. Сериализация

Вам когда-нибудь приходилось хранить комплексные данные в базе или в файле? Для того чтобы сконвертировать объект в строку в PHP предусмотрена специальная функция.

Вообще говоря, этих методов 2: serialize() и unserialize()

// сложный массив $myvar = array("hello", 42, array(1,"two"), "apple"); // конвертируем в строку $string = serialize($myvar); echo $string; /* выведет a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";} */ // получаем исходное значение $newvar = unserialize($string); print_r($newvar); /* выведет Array ( => hello => 42 => Array ( => 1 => two) => apple) */

Вот так вот работают эти функции. Однако из-за бурного роста популярности JSON, в PHP 5.2 были добавлены 2 метода json_encode() и json_decode(). Их работа схожа с serialize():

// сложные массив $myvar = array("hello", 42, array(1,"two"), "apple"); // конвертируем в строку $string = json_encode($myvar); echo $string; /* выведет ["hello",42,,"apple"] */ // восстанавливаем исходное значение $newvar = json_decode($string); print_r($newvar); /* prints Array ( => hello => 42 => Array ( => 1 => two) => apple) */

Этот вариант более компактный и совместимый с другими языками, такими как JavaScript. Однако при работе с очень навороченными объектами может возникнуть потеря данных.

8. Сжатие строк

Кода мы говорим о сжатии, то на ум сразу же приходят архивные файлы в формате ZIP. PHP предоставляет возможность сжатия длинных строк без всяких файлов.

В следующем примере продемонстрируем работу функций gzcompress() и gzuncompress() :

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elit lacus quis ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesque tellus posuere adipiscing. Sed non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales. "; $compressed = gzcompress($string); echo "Original size: ". strlen($string)."\n"; /* выведет Original size: 800 */ echo "Compressed size: ". strlen($compressed)."\n"; /* выведет Compressed size: 418 */ // возвращаем $original = gzuncompress($compressed);

В наших силах уменьшить объём текста на 50%. В этих же целях можно использовать методы gzencode() и gzdecode(), которые используют другой алгоритм сжатия.

9. Выполнить перед завершением

В PHP существует функция register_shutdown_function() , которая позволит вам выполнить какой-то код перед завершением работы скрипта.

Допустим, вы хотите узнать какую-то информацию… Время работы скрипта:

// получаем время начала $start_time = microtime(true); // какие-то операции // ... // выводим время работы echo "execution took: ". (microtime(true) - $start_time). " seconds.";

На первый взгляд это может показаться тривиальной задачей. Для этих целей, вы можете поместить код в конце файла. Однако если перед этим где-то сработает функция exit(), этот код никогда не сработает. Так же, он не сработает если на странице будет ошибка или пользователь прервёт загрузку страницы (нажав на соответствующую кнопку в своём браузере);

При использовании метода register_shutdown_function() код выполнится в любом случае:

$start_time = microtime(true); register_shutdown_function("my_shutdown"); function my_shutdown() { global $start_time; echo "execution took: ". (microtime(true) - $start_time). " seconds."; }

Вывод

PHP это целая планета, которая не перестаёт нас удивлять своим содержимым. А что думаете вы о данных функциях?

Рекомендуем почитать

Наверх