Jak mam powiedzieć Apache, którego PHP użyć?

34

Używam Apache2 na Mac OS X (10.5) . Właśnie skompilowałem PHP 5.2.8 i wreszcie pdo-mysqlzacząłem działać ( a przynajmniej tak mi się wydaje).

To polecenie terminala:

php --version

pokazuje 5.2.8 i mam zainstalowane odpowiednie moduły.

Ale kiedy to zrobię phpinfo(), Apache zrzuca PHP 5.2.6 (moja wcześniejsza wersja, bez pdo_mysql).

Jak powiedzieć Apache, który PHP załadować? httpd.confMa linię:

LoadModule php5_module        libexec/apache2/libphp5.so

Ale nie wiem co i gdzie to jest.

Czy to muszę zmienić?

Sam McAfee
źródło
Kiedy skompilowałeś PHP czy używałeś make install? Jeśli znalazłeś ścieżkę, do której zainstalował moduł, i zmień konfigurację apache, aby wskazywała na to. Mac ma już własną wersję apache i php5, dlatego widzisz inną wersję.
Ruggs
Użytkownicy Homebrew, patrz komentarz
@Mick
1
Czy rozwiązałeś swój problem? Wszystkie odpowiedzi są po prostu szalone
Pmpr
Żadna z tych odpowiedzi nie odpowiada na pytanie. To dziwne ...
Quant

Odpowiedzi:

14

Myślę, że wszystkie te odpowiedzi tak naprawdę nie odpowiadają na pytanie. Poziom główny można ustalić, uruchamiając polecenie httpd -V. To pokaże, z jakimi opcjami zbudowano demona Apache podczas kompilacji. To właśnie kontroluje, gdzie httpdokreśla, gdzie szukać jego konfiguracji. pliki i moduły .so domyślnie.

Na przykład:

% 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"

Kluczową linią w tym wyjściu jest HTTPD_ROOT. To określa, gdzie ROOTkatalog Apache ma się zacząć, /etc/httpdw moim przypadku, podczas szukania konfiguracji. pliki i moduły.

UWAGA: To ROOTnie to samo, co DocumentRoot. Jest ROOTto specyficzne dla sposobu, w jaki httpddemon został skompilowany, DocumentRootsłuży do określania, gdzie httpddemon powinien zacząć szukać rzeczywistej zawartości internetowej (pliki .html i tym podobne).

Do mojego httpd.confpliku mam następujące linie ładowania:

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

Biorąc to pod uwagę, pełna ścieżka do modułów będzie na przykład:

/etc/httpd/modules/mod_auth_basic.so

To jest z CentOS 5.x systemu, ale technika ta jest nadal apt.

BTW, może to być trochę mylące, ponieważ w przypadku CentOS pliki są tutaj uporządkowane fizycznie:

% ls /usr/lib/httpd/modules/
libphp5.so            mod_authnz_ldap.so      mod_dav_fs.so      mod_headers.so       mod_perl.so            mod_speling.so

... a następnie dostępne dla demona Apache httpd, poprzez tę ścieżkę:

% 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

Na modulesłączy łącznik /etc/httpd-> /usr/lib/httpd/modules.

slm
źródło
slm, jak napisałem w poprzednim poście, ServerRoot jest zdefiniowany w dyrektywie ServerRoot i nie ma nic wspólnego z HTTPD_ROOT, który jest wyświetlany za pomocą „httpd -V”. Zapoznaj się ze stronami Apache wymienionymi w poprzednim poście lub jeśli chcesz zmienić dyrektywę ServerRoot wpliku httpd.conf i przekonaj się sam.
billynoah
ServerRoot to sposób na zastąpienie HTTPD_ROOT. HTTPD_ROOT jest ustawiany w czasie kompilacji za pomocą przełącznika --prefix config. Twój post wyróżniał różne b / w ServerRoot i DocumentRoot. httpd.apache.org/docs/current/mod/core.html#serverroot . Miło widzieć, że zarejestrowałeś nazwisko na koncie SF!
slm
Czy to naprawdę odpowiada na pytanie: „Jak powiedzieć Apache, którego PHP użyć?” ?
Pmpr
Trix OP zaakceptował to, więc tak.
slm
@slm To nie odpowiada na pytanie.
ilościowo
4

Możesz znaleźć pliki w swoim systemie za pomocą locatepolecenia:

# zlokalizuj libphp5.so

Wyświetli pełne ścieżki wszystkich plików o tej nazwie. Mam jeden na /usr/libexec/apache2/libphp5.so.

Rob Kennedy
źródło
1
Więc co? czy to odpowiedź na pytanie? Lub sposób na znalezienie pliku?
Pprpr
1
@Trix, pytający powiedział: „Nie wiem co i gdzie to jest”. Pokazałem, jak to znaleźć. Założyłem, że gdy pytający zobaczy wszystkie inne lokalizacje nazwanego pliku, będzie oczywiste, jak zmienić ustawienie, aby użyć innego.
Rob Kennedy
4

Katalog macierzysty modułów załadowanych do httpd.conf (takich jak:) libexec/apache2/libphp5.sojest zdefiniowany przez ServerRootdyrektywę, która domyślnie jest ustawiona na /usr. Nie polecałbym tego zmieniać, ale może być przydatne, aby ktoś wiedział dokładnie, gdzie dokładnie ta ścieżka jest zdefiniowana.

Witryna Apache mówi o ServerRoot :

Ścieżki względne w innych dyrektywach konfiguracyjnych (takich jak na przykład Include lub LoadModule) są traktowane jako względne w stosunku do tego katalogu.

dodatkowo domyślny komentarz do pliku httpd.conf brzmi:

ServerRoot: górna część drzewa katalogów, w której przechowywane są pliki konfiguracji, błędów i dzienników serwera.

billynoah
źródło
2
OP nie jest po definicji ServerRoot. Zamiast tego zadał pytanie „Jak powiedzieć Apache, którego PHP użyć?”. Jeśli naprawdę chcesz na nie odpowiedzieć, odpowiedz na to pytanie
Pprpr
3

Apache powinien szukać modułów w „/ usr / libexec / httpd /”. Znajdziesz tam plik lub dowiązanie symboliczne o nazwie „libphp5.so”. Jeśli jest to dowiązanie symboliczne, musisz połączyć się ponownie z nowym libphp5.so w wersji 5.2.8, w przeciwnym razie po prostu skopiuj plik libphp5.so w wersji 5.2.8 do „/ usr / libexec / httpd /” i zrestartuj apache za pomocą „sudo apachectl restart” .


źródło
0

Miałem Apache i PHP zainstalowane na jednym z serwerów. Zostało to zainstalowane przez poprzedniego administratora sys. Zarówno Apache, jak i PHP były zgodne ze źródła. Oprócz tego zainstalowano domyślny PHP. Aby wiedzieć, który PHP jest używany przez Apache. Uruchomiam poniższe polecenie

   <Install Dir of PHP>/bin/php -i | grep apxs

To dało mi ścieżkę do apache apxs

  APACHE_HOME/bin/apxs

To dało mi informacje, na których Apache jest używany przez tego php. Domyślny php podał błąd podczas pisania

#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

W ten sposób udało mi się zorientować, jakiego php używa Apache.

użytkownik2935688
źródło
1
Proszę nie zamieszczać tej samej odpowiedzi dwa razy. Zamiast tego link do pierwszej odpowiedzi.
Sven