本节将指导如何在 Unix 系统下安装和配置 PHP。在开始安装之前,请务必研究自己使用的系统和 web 服务器的相关章节。
在安装前需要考虑的事项一节提到,在本节主要以 web 为中心介绍 PHP 的设置。不过本节也会覆盖一些 PHP 命令行用法的设置方法。
在 Unix 平台下安装 PHP 有几种方法:使用配置和编译过程,或是使用各种预编译的包。本文主要针对配置和编译 PHP 的过程。很多 Unix 类系统都有包安装系统,可以用它来设置一个有着标准配置的 PHP。但是若需要与标准配置不同的功能(例如一个安全服务器,或者不同的数据库驱动扩展模块),可能需要编译 PHP 和/或 web 服务器。如果不熟悉编译软件,可以考虑搜索一下是否有人已经编译了包含所需要功能的预编译包。
编译所需的知识和软件:
直接从 Git 源文件或者自己修改过的包编译时可能需要:
PHP 初始的配置和安装过程被 configure 脚本中一系列命令行选项控制。可以通过 ./configure --help命令了解 PHP 所有可用的编译选项及简短解释。本手册是分开对这些选项编写文档的。可在附录中找到核心配置选项,而扩展模块特定的配置选项分别在其函数参考页面中描述。
配置好 PHP 后,便可以开始编译模块和/或可执行文件。make 命令用来做这一工作。如果该命令执行失败而找不到原因,请参考安装问题一节。
roman4e at gmail dot com (2011-03-18 06:50:18)
Be careful when compiling on system used with apache2 worker MPM (inl. apache-itk). It will be always compiled with ZTS implicitly when you are using --with-apxs2 and no matter how --enable-maintainer-zts configure option is set
Neil Davis (2008-02-08 07:51:24)
On Red Hat EL5.1 you need to install the libtool-ltdl-devel package (or the workaround below) to compile php.
symbolic link libltdl.so to libltdl.so.3.1.4 missing and the compile will fail.
Noting this because it wasn't necessary in Red Hat EL4.1 and caused confusion. I verified this on the box I'm migrating from. Since I built the box, and compiled php on it, I know I didn't need to do this before.
You can get around needing to install this devel.
Workaround:
# cd /usr/lib
# ln -s libltdl.so.3.1.4 libltdl.so
The devel rpm isn't necessary, just the link. I'll leave it at that. This is an rpm packaging convention change with ES5.
-Neil
packard_bell_nec at hotmail dot com (2007-10-27 04:06:33)
If you install PHP as an Apache module, you can consider the following. Instead of adding:
application/x-httpd-php php
application/x-httpd-php-source phps
into Apache mime.types, you can add:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
into Apache httpd.conf, OR you can add:
AddHandler application/x-httpd-php .php
AddHandler application/x-httpd-php-source .phps
into Apache httpd.conf. The last one is the preferred way of configuration, but it does not work in previous Apache versions.
phpnet at puellae dot com (2007-10-17 10:19:00)
Further down in the links it talks about using the fPIC option in the compiler to fix the SElinux error. I messed around with it and adding --with-pic to the configure will also allow the module to load. I have not done more testing with it but apache at least starts. If you have already compiled you will need to do a make clean before recompiling.
phpnet at puellae dot com (2007-10-17 09:16:03)
If you get an apache failing to start message with SElinux enabled.
The error in var/log/messages is:
Oct 17 10:41:49 nwn kernel: audit(1192635709.825:37936): avc: denied { execmod } for pid=23189 comm="httpd" name="libphp5.so" dev=hda3 ino=4980740 scontext=user_u:system_r:unconfined_t:s0 tcontext=user_u:object_r:usr_t:s0 tclass=file
See the following page:
http://danwalsh.livejournal.com/6117.html?thread=23525
Basically do a chcon -t textrel_shlib_t libphp5.so
It does not sound like it is too dangerous.
aryeh dot friedman at gmail dot com (2007-09-13 04:05:30)
For all multi-core processors (not just Sun as noted above) you need to add --enable-shared-core to the apache config
Alex at GrimMusic dot com (2006-11-13 00:49:36)
I am new to linux/apache/php (coming from server 2003/IIS/Asp.Net), so i was stumped as to why php/apache could only use static content. Also, it couldn't access some documents that you created somewhere else, and then dragged into the HTML directory.
After some research, i found the problem was the SELinux context of the files. It took me forever to find the Proper command to use to change that, as all the examples on the net were out dated using old commands:
# chcon "user_u:object_r:httpd_sys_content_t" /var/www/html -Rc
This will change the SELinux context of all the documents under the /var/www/html directory (which is the web directory under Fedora), to allow the httpd process to access them, and the '-Rc' flag will make the changes Recursive, and will output it's progress for each file that it sucessfully changes.
squeegee (2006-09-30 21:24:21)
It wasn't until I also added LIBS="-lirc" to the beginning of the configure line that it would configure without errors. It also compiled fine after that. So the start of my configure line looked like this:
LDFLAGS="-lirc" LIBS="-lirc" EXTRA_LIBS="-lirc" ./configure
Arjan van Bentem (2006-07-12 12:29:51)
When using Red Hat Fedora, beware of Security Enhanced Linux, SELinux.
Quoted from Red Hat: "The security goal is to make sure that Apache HTTP is only reading the static Web content, and not doing anything else such as writing to the content, connecting to database sockets, reading user home directories, etc."
These limitations include, among many other things, using mkdir to create directories, using fopen to access files, using fopen or get_headers to read URLs, or using exec to run external applications that happen to use sockets (or maybe access some files, but which will run fine when executed from the command line as Unix user apache or httpd -- such as HylaFAX "faxstat" as invoked from nweb2fax recvq.php and sendq.php).
See /var/log/messages for any denials due to the SELinux policy. To disable it:
- System, Administration, Security Level and Firewall
- open the SELinux tab
- click the Transition tree
- check Disable SELinux protection for Apache HTTP
- execute /etc/init.d/httpd restart
See also http://fedora.redhat.com/docs/selinux-faq/ and http://php.net/results.php?q=selinux&p=wholesite
dpresley4 at yahoo dot com (2005-11-06 15:42:16)
Hi,
PROBLEM: ./configure PHP --with-oci8
fails with unresolved references such as __rpc_thread_destroy@GLIBC_2_2_3_...
ONE SOLUTOIN
FOR SOLVING PHP ./configure RESULTING IN __rcp_thread_destroy@GLIBC_2_2_3_... AND
UNRESOLVED REFERENCES WITH ORACLE OCI8
KEYWORDS: PHP OCI OCI8 NET8 ./configure __rpc_thred_destroy UNRESOLVED REFERENCES
For building php-4.4.1 or later with oci8, make sure your LD_LIBARRY_PATH has at a minimum the following directories in its path for Oracle8i 8.1.5 or later, Oracle9i 9.0.2 or later, and Oracle9i Release 2: 9.2.0.4 or later, do the following:
Note: We are not using the Oracle Instant Client here. This assumes you have an actual Oracle Installation.
1. Set ORACLE_HOME
Example using Oracle 9i Relase 2 -- 9.2.0.5:
ORACLE_HOME=/opt/app/oracle/product/9iR2
2. Set LD_LIBRARY_PATH with:
LD_LIBRARY_PATH=$ORACLE_HOME/lib: \
$ORACLE_HOME/rdbms/lib:\
$LD_LIBRARY_PATH
3. On Unix / Linux, don't forget to export these environment variables:
export ORACLE_HOME LD_LIBRARY_PATH
4. Now, build PHP with the following:
./configure --with-apxs2=<path to Apache 2.0/bin/apxs> --with-oci8=$ORACLE_HOME --enable-sigchild
It should now build correctly. The key with Oracle is to ensure that you pick up the libclntX.so (client librariess) where X is the Oracle version associated with the version your using for instance, in the above example, libclnt9.so
Also note that if your using Oracle 9iAS Release 2 v9.0.2, Oracle 10g iAS Release 1 v9.0.4.1, the above steps will work because ORACLE_HOME will containe all of the libraries necessary. Simply point ORACLE_HOME to the top level directory of these installations and set LD_LIBRARY_PATH as described above.
Hope this helps.
phptard at gmail dot com (2005-03-23 04:17:50)
after a long night of wrestling with mysql4.0 under linux compiled with the intel compiler, i've gotten php5.0.3 to compile with mysql libraries for this flavor of mysql:
1: download the mysql for linux/intel compiler and install
2: download the rpm for the intel compiler libraries and install
3: configure php with LDFLAGS="-lirc -lgcc_s" and EXTRA_LIBS="-lirc -lgcc_s"
Example:
LDFLAGS="-lirc -lgcc_s" LD_LIBRARY_PATH="-L/usr/lib64" LD_PATH="-L/usr/lib64" LDPATH="-L/usr/lib64" EXTRA_LIBS="-lirc -lgcc_s" ./configure --with-apxs2=/usr/local/apache/bin/apxs --with-ssl=/usr/local/ssl --without-sqlite --with-zlib-dir=/usr --with-mysql=/usr/local/mysql
of course this is on a xeon system that has half of its modules in the /usr/lib64 directory, so on a normal system, without the other kruft, it would look something more like this:
LDFLAGS="-lirc -lgcc_s" EXTRA_LIBS="-lirc -lgcc_s" ./configure --with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql
Hopefully this will save someone the 6 hour headache it caused me..
alexander justadot henry at acm dot org (2004-12-22 12:48:42)
The system at my workplace has a need for apache/php with all static compilation. In order to save time adminning our systems, I decided to make my own RPM of php/apache with mod_ssl support. I had always installed by hand with the instructions on this page, but when buiding the RPM way, came upon the following error when apache was compiling:
===> src/modules/php4
make[4]: *** No rule to make target `all'. Stop.
Ordinarily this is because one did not do a 'make install' in php before the second apache configure, or somehow the make install failed. But the way rpm's work, the make install must be in the %install portion of the spec file, after all makes are completed.
make install-sapi
This line will copy relevant files to the directory specified in --with-apache
thansen at terra dot com dot br (2003-12-30 20:36:28)
The configure directives --with-apxs2 and --with-apxs2filter are not compatible one with other, even though the configure script will not complain about that. Each one affect the way Apache will call the php parser: If you choose the first one, you must use the traditional include:
AddType application/x-httpd-php php
at httpd.conf, to call the parser. If you use the --with-apxs2filter, the include will be:
<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
</Files>
, and php will be called as a filter to .php files.
If you use both together, you will get compilation errors (duplicate symbols while linking libphp4).
aaronmorris at mindspring dot com (2003-12-05 12:47:46)
If you have the libphp4.a instead of libphp4.so on AIX, you can extract the .so file from the .a file by running "ar -x libphp4.a".
doug at NOSPAM dot techie dot net (2003-02-04 05:16:03)
Users compiling under some versions of Solaris/SunOS may encounter the following error.
symbol ap_block_alarms: referenced symbol not found
To address this problem, add the following additional flag to the Apache build configure line:
--enable-rule=SHARED_CORE
So, adding this to the original instructions, you'd configure your Apache build like so:
./configure --prefix=/www --enable-module=so --enable-rule=SHARED_CORE
Doug
dimaberastau at hotmail dot com (2001-06-09 21:33:53)
when installing with mysql support (--with-mysql=<path/to/your/mysql>) via Apache APXS you'll probably get something like 'can't load libmysqlclient.so' when you try to start up apache. There are 2 solutions to this problem. First, (as documented in INSTALL file of the php4 distribution) you can modify /etc/ld.so.conf to contain the directory name where libmysqlclient.so is (so if your mysql is installed in /usr/local, you want to add something like /usr/local/lib/mysql into /etc/ld.so.conf), else (and particularly if you haven't got the super-user on the system) you can modify (or create if it isn't defined already) LD_LIBRARY_PATH shell variable to reflect the changes you would have otherwise made to /etc/ld.so.conf (again if mysql is /usr/local LD_LIBRARY_PATH=/usr/local/lib/mysql). Either one of these methods will get the problem sorted. Just remember to run ldconfig (so that /etc/ld.so.cache is updated) if you chose to modify /etc/ld.so.conf
marshalm at ebrd dot com (2001-05-17 10:43:54)
HP-UX 11.X PA-RISC installation with oracle (oci8). You need to install the HP-UX patch PHSS_22514 patch (updated libdld.sl), otherwise you will get errors with dlopen() and dlclose() not found during the apache integration stage.