Компиляция PHP с модулями против использования общих модулей? - PullRequest
8 голосов
/ 10 августа 2009

Есть ли разница между компиляцией php с параметром:

--with-[extension name]

вместо того, чтобы просто скомпилировать его как общий модуль и включить его таким образом? Есть ли какой-то выигрыш в производительности? Если нет, зачем вам это делать?

Ответы [ 5 ]

2 голосов
/ 29 января 2011

Может быть, разница в объеме памяти?

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

2 голосов
/ 10 августа 2009

Возможно, это не будет полным ответом на ваш вопрос, но вот что я смог найти до сих пор: в книге есть некий частичный ответ " Расширение и встраивание PHP", написанное Сарой Големон ( amazon ; некоторые части также доступны в книгах Google).

Соответствующая часть (примечание вверху страницы 56) :

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

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

Я полагаю, это сделано, поэтому сам PHP не требует дополнительной внешней библиотеки из-за некоторого расширения; использование правильного параметра позволяет пользователям самостоятельно включать или отключать расширение в зависимости от того, имеется ли у него уже эта внешняя библиотека.

1 голос
/ 31 июля 2011

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

0 голосов
/ 11 августа 2009

Полагаю, что Нейт прав насчет производительности и что эти опции помогают только для упаковки.

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

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

0 голосов
/ 10 августа 2009

Любой выигрыш в производительности будет незначительным. Это просто еще один вариант для упаковки вашей сборки PHP.

На моем Mac я использую сборку PHP от Marc Liyange , которая включает, помимо прочего, встроенную поддержку PostgreSQL. Он был построен с флагом --with-pdo-pgsql. В результате его не нужно распространять совместно с общей библиотекой pdo-pgsql.

Если бы он не собирался с --with-pdo-pgsql, ему нужно было бы распространить разделяемую библиотеку pdo-pgsql и включить в php.ini директиву для ее загрузки. Конечно, это всего лишь небольшая разница, но если вы знаете, что собираетесь использовать эту функциональность, хорошо встроить ее в сам PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...