Добавление к имени переменной 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.
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
PHP. Эффективность и отладка. Часть Девятая.
14-07-2015
<< Предыдущая статья | Следующая статья >> |
PHP. Эффективность и отладка. Часть Восьмая. | PHP. Эффективность и отладка. Часть Десятая. |