9 полезных функций PHP и особенностей, которые нужно знать

php функции

От Автора:

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

1. Функции с произвольным количеством параметров

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

Для начала, вот пример исключительно с необязательными параметрами:

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

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

У многих функций PHP длинные и содержательные имена. Однако будет трудно сказать, что делает функция с именем glob(), если вы уже откуда-то не знакомы с этим термином.

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

Вы можете задавать несколько видов файлов, как здесь:

Обратите внимание, что файлы в действительности будут возвращаться с путями, зависящими от вашего запроса:

Если вам нужен полный путь к каждому файлу, просто вызовите функцию realpath() для массива возвращенных значений:

3. Сведения об использовании памяти

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

PHP есть «сборщик мусора» (программа очистки памяти) и довольно сложный диспетчер памяти. Количество памяти, используемой вашим скриптом, может увеличиваться и уменьшаться в процессе его выполнения. Получить сведения о текущем использовании памяти можно, используя функцию memory_get_usage(), а чтобы узнать о наибольшем объеме памяти в любой точке, можно воспользоваться функцией memory_get_peak_usage().

4. Сведения об использовании CPU

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

Может выглядеть таинственно, пока у вас не будет навыков в администрировании системы. Вот объяснение каждого значения (учить это наизусть не нужно):

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: время работы в привилегированном режиме (секунды)

Чтобы узнать, какие ресурсы CPU потребляет скрипт, нам нужно посмотреть на значения ‘user time’ (время работы в пользовательском режиме) и ‘system time’ (время работы в привилегированном режиме). По умолчанию величины секунд и миллисекунд представляются раздельно. Таким образом, вы можете разделить значение микросекунд на 1 миллион и добавить к значению секунд, чтобы вычислить общее количество секунд как десятичное число.

Рассмотрим пример:

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

Вот другой пример:

Этот скрипт использовал примерно 1,4 секунды времени CPU, и почти все время в пользовательском режиме, так как системных вызовов не было.

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

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

Еще вы можете заметить, что цифры соответствуют 3 секундам неточно. Это потому что на сервере также, возможно, выполнялись и другие процессы, так что скрипт не использовал 100% CPU в течение всех 3 секунд.

5. Предопределенные, или «волшебные» константы

PHP предусматривает полезные «волшебные» константы для выборки текущего номера строки (__LINE__), пути файла (__FILE__), пути каталога (__DIR__), имени функции (__FUNCTION__), имени класса (__CLASS__), имени метода (__METHOD__) и пространства имен (__NAMESPACE__).

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

Когда в дело включаются другие скрипты, хорошая идея — использование константы __FILE__ (или __DIR__ в версии PHP 5.3):

Использование __LINE__ облегчает отладку программы. Можно отследить номера строк:

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

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

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

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

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

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

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

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

Есть два популярных метода сериализации переменных. В этом примере употребляются serialize() и unserialize():

Это стандартный метод сериализации PHP. Однако с тех пор, как в последние годы стал так популярен JSON, в PHP 5.2 решили добавить поддержку и для него. Теперь, кроме прочего, можно использовать функции json_encode() и json_decode():

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

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

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

В следующем примере мы использовали функции gzcompress() и gzuncompress():

Мы в состоянии достичь уменьшения размера почти на 50%. Функции gzencode() и gzdecode() выдают схожие результаты, используя другим алгоритмом сжатия.

9. Функция Register Shutdown

Функция с названием register_shutdown_function() позволит вам выполнить какой-нибудь код прямо перед окончанием работы скрипта.

Представьте себе, что вы хотите в конце выполнения своего скрипта собрать некоторую эталонную статистику, скажем, сколько времени ушло на его выполнение:

Сначала это может показаться тривиальным. Вы просто добавляете код в самый конец скрипта, и он выполняется до окончания работы скрипта. Однако, если вы вызовете функцию exit(), этот код никогда не выполнится. Также, если возникнет фатальная ошибка (fatal error) или если скрипт будет завершен пользователем (нажатием клавиши Stop в браузере), он снова может не выполниться.

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

Заключение

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

Автор: Burak Guzel

Перевод и редакция: Рог Виктор и Андрей Бернацкий. Команда webformyself.

Источник: //net.tutsplus.com

E-mail: contact@webformyself.com

Проект webformyself.com — Как создать свой сайт. Основы самостоятельного сайтостроения

P.S. Хотите опубликовать интересный тематический материал и заработать? Если ответ «Да», то жмите сюда.

Метки: , ,

Похожие статьи:

Комментарии Вконтакте:

Комментарии (1)