如何告诉Apache使用哪个PHP?


34

我在Mac OS X(10.5)上运行Apache2。我刚刚编译了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,这就是为什么您看到不同版本的原因。
Ruggs


自制用户,请参阅@Mick评论
BatteryAcid

1
您解决问题了吗?所有的答案都只是疯狂的事情
Pmpr

这些答复都不能回答问题。这很奇怪……
定量

Answers:


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。在我的情况下,这定义了Apache的ROOT目录从哪里开始/etc/httpd寻找配置。文件和模块。

注意:这与ROOT是不同的DocumentRoot。这ROOT特定于httpd守护程序的编译方式,DocumentRoot用于指定httpd守护程序应从何处开始查找实际的Web内容(.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

...然后可httpd通过以下路径访问Apache守护程序:

% 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


slm如我在上一篇文章中所述,ServerRoot是在ServerRoot指令中定义的,与通过“ httpd -V”显示的HTTPD_ROOT无关。请查阅我以前的文章中引用的Apache网页,或者如果您想更改 httpd.conf文件中的ServerRoot指令,请亲自查看。
billynoah

ServerRoot是一种替代HTTPD_ROOT的方法。HTTPD_ROOT是在编译时通过--prefix配置开关设置的。您的帖子区分了不同的黑白ServerRoot和DocumentRoot。httpd.apache.org/docs/current/mod/core.html#serverroot。很高兴看到您用您的SF帐户注册了名字!
slm 2013年

这是否真的回答了以下问题:“如何告诉Apache使用哪个PHP?” ?
Pmpr

Trix OP接受了它,所以是的。
slm

@slm这不能回答问题。
定量

4

您可以使用以下locate命令在系统上找到文件:

#找到libphp5.so

它将打印具有该名称的所有文件的完整路径。我有一个/usr/libexec/apache2/libphp5.so


1
所以呢?这是问题的答案吗?还是找到文件的方法?
Pmpr

1
询问者@Trix说:“我不知道那是什么,在哪里。” 我已经展示了如何找到该位置。我认为,询问者一旦看到有问题的命名文件的所有其他位置,很明显如何更改设置以使用其他文件。
罗布·肯尼迪

4

加载到httpd.conf中的模块的父目录(例如:)libexec/apache2/libphp5.soServerRoot指令定义,该指令默认情况下通常设置为/usr。我不建议您更改此设置,但对于某人知道该路径的确切定义可能很有用。

Apache的网站对ServerRoot表示以下内容:

其他配置指令(例如,例如Include或LoadModule)中的相对路径被视为相对于此目录。

另外,默认的httpd.conf文件注释为:

ServerRoot:目录树的顶部,用于保存服务器的配置,错误和日志文件。


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 /”,然后使用“ sudo apachectl restart”重新启动apache。 。


0

我在一台服务器上安装了Apache和PHP。这是由以前的系统管理员安装的。Apache和PHP都是从源代码编译而来的。除此之外,还安装了默认的PHP。因此要知道Apache使用了哪个PHP。我运行以下命令

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

这给了我通往Apache Apxs的道路

  APACHE_HOME/bin/apxs

这给了我有关此php使用哪个Apache的信息。我输入时默认的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

因此,通过这种方式,我能够弄清楚Apache使用的php。


1
请不要发布相同的答案两次。而是链接到第一个答案。
Sven
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.