Как мне сказать Apache, какой PHP использовать?

34

Я использую 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

Но я не знаю, что или где это.

Это то, что я должен изменить?

Сэм Макафи
источник
Когда вы компилировали php, вы использовали make install? Если вы нашли путь, по которому он установил ваш модуль, и измените конфигурацию apache, чтобы он указывал на него. Mac уже имеет собственную версию apache и php5, поэтому вы видите другую версию.
Раггс
Доморощенные пользователи, см. @Mick комментарий
BatteryAcid
1
Вы решили свою проблему? ВСЕ ответы - просто безумная вещь
Pmpr
Ни один из этих ответов не отвечает на вопрос. Это странно ...
Квант

Ответы:

14

Я думаю, что все эти ответы на самом деле не отвечают на вопрос. Корневой уровень можно определить, выполнив команду 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.

ОДС
источник
ОДС , как я сказал в предыдущем посте, то ServerRoot определяется в директиве ServerRoot и не имеет ничего общего с HTTPD_ROOTкоторый отображаетсяпомощью «HTTPD -V.» Пожалуйста, обратитесь к веб-страницам Apache, на которые есть ссылки в моем предыдущем посте, или, если вы хотите изменить директиву ServerRoot вфайле httpd.conf, и убедитесь сами.
Биллиноа
ServerRoot - это способ переопределить HTTPD_ROOT. HTTPD_ROOT устанавливается во время компиляции с помощью параметра конфигурации --prefix. Ваш пост отличал разные ч / б ServerRoot и DocumentRoot. httpd.apache.org/docs/current/mod/core.html#serverroot . Рад видеть, что вы зарегистрировали имя в своей учетной записи SF!
Slm
Действительно ли это отвечает на вопрос: «Как мне сказать Apache, какой PHP использовать?» ?
Pmpr
Трикс ОП приняла это так, да.
SLM
@slm Это не отвечает на вопрос.
Quant
4

Вы можете найти файлы в вашей системе с помощью locateкоманды:

# locate libphp5.so

Он напечатает полные пути всех файлов с этим именем. У меня есть один на /usr/libexec/apache2/libphp5.so.

Роб Кеннеди
источник
1
Ну и что? это ответ на вопрос? Или способ найти файл?
Pmpr
1
@ Трикс, спрашивающий сказал: «Я не знаю, что и где это». Я показал, как найти, где это. Я предположил, что как только просящий увидит все другие местоположения указанного файла, о котором идет речь, станет очевидным, как изменить настройку, чтобы использовать другую.
Роб Кеннеди
4

Родительский каталог модулей, загруженных в httpd.conf (например,:), libexec/apache2/libphp5.soопределяется ServerRootдирективой, которая по умолчанию обычно устанавливается в /usr. Я бы не рекомендовал менять это, но кому-то может быть полезно знать, где именно этот путь определен.

На веб-сайте Apache говорится о ServerRoot :

Относительные пути в других директивах конфигурации (например, таких как Include или LoadModule) берутся относительно этого каталога.

дополнительно по умолчанию комментарии к файлу httpd.conf гласят:

ServerRoot: верхняя часть дерева каталогов, в которой хранятся файлы конфигурации, ошибок и журналов сервера.

billynoah
источник
2
OP не после определения ServerRoot. Вместо этого он задал вопрос «Как мне сказать Apache, какой PHP использовать?». Если вы действительно хотите , чтобы ответить на него, так что ответить на него
PMPR
3

Apache должен искать модули в "/ usr / libexec / httpd /". Там вы найдете файл или символическую ссылку с именем "libphp5.so". Если это символическая ссылка, вам нужно будет вернуться к новой версии 5.2.8 libphp5.so, в противном случае просто скопируйте 5.2.8 libphp5.so в «/ usr / libexec / httpd /» и перезапустите apache с помощью «sudo apachectl restart» ,


источник
0

У меня был установлен 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.

user2935688
источник
1
Пожалуйста, не публикуйте один и тот же ответ дважды. Вместо этого ссылка на первый ответ.
Свен