Apache – How to Specify Which PHP Version to Use

apache-2.2pdoPHP

I am running Apache2 on a Mac OS X (10.5). I just compiled PHP 5.2.8 and finally got pdo-mysql working (or so I think).

This terminal command:

php --version

is showing 5.2.8 and I have the right modules installed.

But, when I do a phpinfo(), Apache dumps out PHP 5.2.6 (my earlier version, without pdo_mysql).

How do I tell Apache which PHP to load? The httpd.conf has the line:

LoadModule php5_module        libexec/apache2/libphp5.so

But, I don't know what or where that is.

Is that what I have to change?

Best Answer

I think all these answers aren't really answering the question. The root level can be determined by running the command httpd -V. This will show you what options the Apache daemon was built with at compile time. This is what controls where httpd determines where to look for it's config. files and .so modules by default.

For example:

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

The key line in that output is the HTTPD_ROOT. That defines where Apache's ROOT directory is to start, /etc/httpd in my case, when looking for config. files and modules.

NOTE: This ROOT is not the same thing as DocumentRoot. This ROOT is specific to how the httpd daemon was compiled, the DocumentRoot is for specifying where the httpd daemon should start looking for actual web content (.html files and such).

For my httpd.conf file I have the following Load lines:

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

Given this the full path to your modules would be, for example:

/etc/httpd/modules/mod_auth_basic.so

This is from a CentOS 5.x system but the technique is still apt.

BTW, it can get a little confusing because in CentOS' case the files are organized physically here:

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

...and then accessible to the Apache daemon, httpd, through this path:

% 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

The modules link connects /etc/httpd --> /usr/lib/httpd/modules.