Добавление к имени переменной 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.