Есть ли разница между компиляцией php с параметром:
--with-[extension name]
а не просто компилировать его как общий модуль и включать его таким образом? Есть ли какое-либо преимущество в производительности? Если нет, зачем вам это делать?
Любое пособие по производительности будет незначительным. Это просто еще один вариант для упаковки вашей сборки PHP.
На моем Mac я использую PHP-версию Marc Liyange , которая включает, помимо прочего, встроенную поддержку PostgreSQL. Он был построен с флагом --with-pdo-pgsql
. В результате его не нужно распространять вместе с общей библиотекой pdo-pgsql.
Если он не построил с помощью --with-pdo-pgsql
, ему понадобилось бы распространять общую библиотеку pdo-pgsql и включить директиву в php.ini
для ее загрузки. Несомненно, это всего лишь незначительная разница, но если вы знаете, что собираетесь использовать эту функциональность, прекрасно ее встроить в сам PHP.
Может быть, разница в памяти?
Исправьте меня, если я ошибаюсь, но встроенный модуль будет дублироваться в каждом процессе, загруженном в память (потому что он статически связан), тогда как общий модуль будет загружаться только один раз и делиться всем процессом php.
Возможно, это не будет полным ответом на ваш вопрос, но вот что мне удалось найти до сих пор: в книге « Расширение и внедрение PHP », написанной Сарой Големон ( Amazon), есть какой-то частичный ответ , некоторые части также доступны в книгах Google).
Соответствующая часть (примечание в верхней части страницы 56) :
Вы когда-нибудь задавались вопросом, почему некоторые расширения настроены с использованием
--enable-extname
а некоторые настроены с использованием--with-extename
? Функциональность, между ними нет никакой разницы. На практике, однако,--enable
предназначен для функций, которые могут быть включены без каких-либо сторонних библиотек. – в отличие от этого, предназначен для функций, которые имеют такие предварительные условия.
Итак, ни слова о производительности (я думаю, если есть разница, это всего лишь вопрос « загрузка еще одного файла » и « загрузка одного большего файла »); но есть техническая причина этой возможности.
Я предполагаю, что это сделано, поэтому сам PHP не требует дополнительной внешней библиотеки из-за некоторого расширения; использование правой опции позволяет пользователям включать или отключать само расширение, в зависимости от того, есть ли у них уже эта внешняя библиотека.
Я заметил, что когда все функции загружаются как общие модули, страницы php загружаются быстрее, а использование процессора меньше, однако некоторые функции php командной строки не работают должным образом. Логично предположить, что настройка общего модуля более эффективна, чем большой статический двоичный файл, так как модули будут загружаться только при необходимости.
Я думаю, что Нейт прав насчет производительности и что эти варианты помогают только для упаковки.
В основном с помощью скомпилированного модуля PHP может напрямую обращаться к функциям модуля, но после компиляции эти вызовы транслируются в адреса памяти, которые нужно вызывать.
В загружаемой версии модуля PHP вызовет dl_open для загрузки библиотеки, а затем вызовет функции там, где есть адреса, как показано в компиляции. Я предполагаю, что этот вызов dl_open выполняется только один раз, когда веб-сервер запущен, поэтому вы можете его игнорировать.