Вопрос или проблема
Я запускаю Apache2 на Mac OS X (10.5). Я только что скомпилировал PHP 5.2.8 и наконец получил pdo-mysql
в рабочем состоянии (или так я думаю).
Эта команда в терминале:
php --version
показывает 5.2.8, и у меня установлены правильные модули.
Но когда я выполняю phpinfo()
, Apache сообщает PHP 5.2.6 (моя старая версия, без pdo_mysql
).
Как указать Apache, какую версию PHP загружать? В файле httpd.conf
есть строка:
LoadModule php5_module libexec/apache2/libphp5.so
Но я не знаю, что это такое и где это находится.
Это то, что мне нужно изменить?
Я думаю, что все эти ответы не совсем отвечают на вопрос. Уровень корневого каталога можно определить, выполнив команду httpd -V
. Это покажет, с какими опциями был скомпилирован демон Apache. Это управляет тем, где httpd
будет искать свои конфигурационные файлы и .so модули по умолчанию.
Например:
% httpd -V
Server version: Apache/2.2.17 (Unix)
Server built: Dec 17 2010 11:58:24
Server's Module Magic Number: 20051115:25
Server loaded: APR 1.3.12, APR-Util 1.3.9
Compiled using: APR 1.3.12, APR-Util 1.3.9
Architecture: 32-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
Ключевая строка в этом выводе – это HTTPD_ROOT
. Она определяет, где находится каталог ROOT
Apache, с которого начинается поиск конфигурационных файлов и модулей, в моем случае это /etc/httpd
.
ПРИМЕЧАНИЕ: Этот ROOT
не является тем же, что и DocumentRoot
. Этот ROOT
касается того, как был скомпилирован демон httpd
, а DocumentRoot
используется для указания, где демон httpd
должен начинать поиск фактического веб-контента (.html файлов и т.п.).
Для моего файла httpd.conf
у меня есть следующие строки загрузки:
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
Учитывая это, полный путь к вашим модулям будет, например:
/etc/httpd/modules/mod_auth_basic.so
Это с системы CentOS 5.x, но техника всё ещё подходит.
Кстати, это может быть немного запутанным, потому что в случае CentOS’ файлы физически организованы здесь:
% ls /usr/lib/httpd/modules/
libphp5.so mod_authnz_ldap.so mod_dav_fs.so mod_headers.so mod_perl.so mod_speling.so
…а затем доступны для демона Apache, httpd
, через этот путь:
% ls -l /etc/httpd/
total 12
drwxr-xr-x 2 root root 4096 Apr 26 2011 conf
drwxr-xr-x 3 root root 4096 Apr 26 2011 conf.d
-rw-r--r-- 1 root root 18 Feb 24 2009 htpasswd
lrwxrwxrwx 1 root root 19 Apr 26 2011 logs -> ../../var/log/httpd
lrwxrwxrwx 1 root root 27 Apr 26 2011 modules -> ../../usr/lib/httpd/modules
lrwxrwxrwx 1 root root 13 Apr 26 2011 run -> ../../var/run
Ссылка modules
соединяет /etc/httpd
–> /usr/lib/httpd/modules
.
Вы можете найти файлы на своей системе с помощью команды locate
:
# locate libphp5.so
Она выведет полные пути всех файлов с таким именем. У меня один в /usr/libexec/apache2/libphp5.so
.
Родительская директория загруженных в httpd.conf модулей (таких как: libexec/apache2/libphp5.so
) определяется директивой ServerRoot
, которая по умолчанию обычно установлена на /usr
. Я бы не рекомендовал менять её, но это может быть полезно для кого-то, кто хочет знать, где именно определён этот путь.
Веб-сайт Apache говорит следующее о ServerRoot:
Относительные пути в других конфигурационных директивах (например, Include или
LoadModule) учитываются как относительные к этому каталогу.
кроме того, комментарии по умолчанию в файле httpd.conf гласят:
ServerRoot: Вершина иерархического дерева каталога, в котором хранятся файлы конфигурации, ошибок и логов сервера.
Apache должен искать модули в “/usr/libexec/httpd/”. Там вы найдете либо файл, либо ссылку под названием “libphp5.so”. Если это ссылка, вам нужно будет пересоединить её к новой 5.2.8 libphp5.so, в противном случае просто скопируйте 5.2.8 libphp5.so в “/usr/libexec/httpd/” и перезапустите apache командой “sudo apachectl restart”.
У меня были установлены Apache и PHP на одном из серверов. Это было установлено предыдущим системным администратором. Оба, и Apache, и PHP, были скомпилированы из исходников. Кроме этого, была установлена версия PHP по умолчанию. Чтобы узнать, какая версия PHP используется Apache, я выполнил следующую команду:
<Install Dir of PHP>/bin/php -i | grep apxs
Это дало мне путь к apache apxs
APACHE_HOME/bin/apxs
Это дало мне информацию о том, какая версия Apache используется этим php. Версия PHP по умолчанию выдавала ошибку, когда я ввел
#php -i | grep apxs
Failed loading opcache.so: opcache.so: cannot open shared object file: No such file or directory PHP Warning: PHP Startup: Unable to load dynamic library '<PHP_HOME>/lib/php/extensions/debug-non-zts-20121212/memcached.so' - <PHP_HOME>/lib/php/extensions/debug-non-zts-20121212/memcached.so: undefined symbol: OnUpdateLongGEZero in Unknown on line 0
Таким образом, я смог определить, какая версия php используется Apache.
Это довольно просто, просто сделайте следующее:
1) Остановите Apache;
2) В нижней части файла, как
C:\Apache24\conf\httpd.conf
добавьте или измените эти строки:
# PHP8 module
PHPIniDir "C:/php"
LoadModule php_module "C:/php/php8apache2_4.dll"
AddType application/x-httpd-php .php
Сохраните файл и проверьте его, запустив
httpd -t
Теперь запустите Apache с
httpd -k start
Ответ или решение
Чтобы правильно указать Apache, какую версию PHP использовать, важно учитывать несколько шагов и деталей, которые войдут в процесс настройки. Рассмотрим последовательно, как это сделать.
Теория
Apache использует модуль libphp5.so
для интеграции PHP с сервером. По умолчанию Apache будет загружать этот модуль из директории, указанной в файле конфигурации httpd.conf
. Если вы недавно скомпилировали новую версию PHP, но Apache все еще использует старую версию (как в вашем случае: версия 5.2.6 вместо 5.2.8), проблема может заключаться в том, что Apache использует старую копию libphp5.so
.
Основная задача — определить местоположение файла libphp5.so
, соответствующего вашей новой версии PHP, и обновить файл конфигурации Apache, чтобы он использовал именно эту версию.
Пример
-
Проверка текущей загрузки модуля PHP:
Через терминал выполните команду:
locate libphp5.so
Эта команда покажет все местоположения файлов с именем
libphp5.so
на системе. Среди них вы должны найти файл, соответствующий недавно установленной версии PHP. -
Обновление конфигурации Apache:
Откройте файл
httpd.conf
, обычно расположенный в директории/etc/httpd/conf/
или/usr/local/apache2/conf/
. Найдите строку:LoadModule php5_module libexec/apache2/libphp5.so
Обновите путь к
libphp5.so
на путь, найденный для вашей новой версии PHP. Например:LoadModule php5_module /path/to/new/libphp5.so
-
Проверка корневой директории Apache:
Выполните команду:
httpd -V
Обратите внимание на параметр
HTTPD_ROOT
, чтобы подтвердить, где Apache ожидает найти свои файлы конфигурации и модули. -
Проверка соответствия версии PHP:
Выполните команду:
php -i | grep apxs
Эта команда подскажет вам, какой сервер Apache был использован для компиляции PHP. Убедитесь, что путь к
apxs
соответствует вашей конфигурации.
Применение
-
При изменении версии PHP в Apache:
-
Остановите сервис Apache:
sudo apachectl stop
-
Откорректируйте файл
httpd.conf
, чтобы гарантировать правильную загрузку модуля PHP из нового местонахождения. -
Перезагрузите конфигурацию Apache, чтобы проверить наличие ошибок:
apachectl configtest
-
Если все в порядке, перезапустите Apache:
sudo apachectl start
-
-
Подтверждение версии PHP через Apache:
Создайте PHP-файл на вашем сервере, например,
info.php
с содержимым:<?php phpinfo(); ?>
Перейдя в браузере по URL к этому файлу, вы должны увидеть обновленную версию PHP, подключенную через Apache.
Заключение
Настройка правильной версии PHP в Apache требует уделить внимание пути, по которому загружается модуль libphp5.so
. Используя команды locate
и httpd -V
, вы сможете определить точное местоположение файлов, связанных с вашими версиями PHP и Apache, и произвести коррекцию конфигурации соответственно. Это обеспечит работу Apache с нужной версией PHP и позволит использовать все нововведения и модули, доступные в новой версии. Соблюдение этих шагов гарантирует, что ваши настройки Apache оптимизированы для работы с недавно скомпилированным PHP, принимая во внимание все конфигурационные тонкости, представленные в системе.