ТОП-10 популярных


НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...


Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...

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

БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...

Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...


Какую только информацию мы не помещаем на компакт-диски: резервные копии важных данных, музыку, фильмы... Многие полагают, что главное - «купить...

Размер объему не помеха.
С тех пор как компания Fujitsu отказалась от производства жестких дисков для настольных компьютеров, многие пользователи начали забывать о том,...

Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...

ПОД ЛИТЕРОЙ «N»
Aтаку LCD-мониторов не остановить, а масштабы этого наступления даже немного пугают. Судите сами — многие пользователи только начинают приглядываться к новому для...

Internet2, или cтарые песни о новом
Когда-то на заре Интернета, тогдаеще военно-научной сетиAPRAnet, были заложены основныепринципы функционирования«Сети сетей». В их числе — использованиепротокола, называемого сейчасIPv4. В...

PHP. Эффективность и отладка. Часть Девятая.


14-07-2015

Добавление к имени переменной varname дополнительного символа $ сообщает PHP о том, что надо выбрать переменную, имя которой является значением переменной var. Этот прием называется косвенной ссылкой. В нашем случае значением переменной является foo, поэтому переменная foo становится глобальной, и ей присваивается значение. Поскольку для этого нет необходимости вызывать компилятор исполняемого кода, эта новая версия сможет обрабатывать приблизительно в два раза больше запросов в секунду, чем версия eval!
Другим способом ограничить повторяющиеся вызовы функции eval является создание динамической функции. Предположим, что в переменной code хранится несколько строк кода, выбранных из базы данных, или переданных из различных частей программы, или созданных локально. В листинге 28.4 представлена простейшая реализация этого принципа.

| Листинг 28.4. Вызов динамического кода с помощью функции eval
<?php
//создать пример программного кода $code = "sqrt(pow(543, 12));";
for($i=0; $i<100; $i++)
{
eval($code);
}
?>

Как подчеркивалось выше, такая программная конструкция работает исключительно медленно. PHP активизирует компилятор исполняемого кода процессора Zend Engine при каждой итерации. Метод решения этой проблемы, представленный в листинге 28.5, предлагает более экономичное решение.

I Листинг 28.5. Использование динамической функции для ограничения функции eval
<?php
//создать пример программного кода
$code = "sqrt(pow(543, 12));";
//создать функцию, которая будет включать //загруженный код
$func = create_function('', $code); for($i=0; $i<100; $i++)
{
$func();
}
?>

 Функция create_function создает новую функцию из кода, переданного ей. И если результаты работы программы в листингах 28.4 и 28.5 идентичны, то программа из листинга 28.5 работает в несколько раз быстрее. Причина проста: в листинге 28.4 показано, что компилятор исполняемого кода 100 вызывается раз, т.е. каждый раз, когда код обрабатывает функция eval. При использовании функции create_function сценарий вызывает компилятор исполняемого кода только однажды и объявляет анонимную функцию, которую он вызывает 100 раз. Это сэкономит нам 99 вызовов компилятора исполняемого кода и увеличит производительность.
28.10. Не загружайте расширения динамически
Функция dl позволяет приложениям выполнить динамическую загрузку расширений PHP, создавая тем самым дополнительную функциональность механизму PHP. Это является эквивалентом на фазе выполнения приложения директиве extension=/ path/to/extension.so конфигурационного файла php.ini. Однако использование функции dl имеет множество недостатков по сравнению с использованием директивы файла php.ini, поэтому хочется настоятельно потребовать от разработчиков не использовать ее.
Динамическая загрузка библиотек замедляет выполнение сценария по сравнению с одноразовым использованием этого приема при запуске сервера. Благодаря использованию директивы extension в файле php.ini она загружается один раз для всех процессов Web-сервера.
Благодаря природе управления памятью в ОС Unix загрузка расширения один раз во время старта эффективнее ее загрузки на более позднем этапе. Расширение, загруженное при запуске сервера родительским процессом Web-сервера Apache, разделяется между порожденными процессами. Иная картина получается при загрузке расширения во время выполнения отдельных процессов Web-сервера, так как каждая копия будет потреблять свою часть памяти, которая не разделяется между другими процессами, что вызовет потребление значительно большего объема памяти.
Но читатель вполне резонно может задать вопрос: "А что если я закоренелый пользователь Windows и не слишком много знаю о Web-сервере Apache и Unix?" В этом случае мотивация не пользоваться функцией dl еще проще - dl не поддерживается версией PHP, защищенной от использования потоков. Так как фактически все построения PHP для ОС Windows рассчитаны на защищенный от потоков режим, функция dl не входит в перечень проблем выбора, встающих перед пользователями Windows.

Понравился материал? Поделитесь с друзьями!



<< Предыдущая статьяСледующая статья >>
PHP. Эффективность и отладка. Часть Восьмая. PHP. Эффективность и отладка. Часть Десятая.