在 GNU/Linux 下,使用PHP源码编译安装
这里以php-5.6.31为例
#!/bin/bash
./configure \
--prefix=/usr/local/php-5.6 \
--with-config-file-path=/usr/local/php-5.6/etc \
--with-config-file-scan-dir=/usr/local/php-5.6/etc/php.ini.d \
--localstatedir=/var \
--enable-fpm \
--with-zlib \
--enable-bcmath \
--with-bz2 \
--enable-calendar \
--enable-dba=shared \
--with-gdbm \
--with-gettext \
--with-gd \
--with-freetype-dir=/usr \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--enable-gd-native-ttf \
--with-pdo-mysql \
--with-mysql \
--with-mysqli \
--with-curl
#
# 这只是一个示例,有些扩展单独安装也可以,比如curl、mysql等。
#
# --with-config-file-scan-dir: 指定配置文件的扫描目录,这样可以将ini的配置分模块进行配置,从而可以不、维护一个很长的php.ini文件。
#
# --with-config-file-path: 指定php.ini文件的查找路径,默认查找路径为PREFIX/lib(参考configure --help)
#
在macOS中,编译安装PHP 5.6.35
安装目录为/gnu,PHP 5.6的编译选项如下:
#!/bin/bash
./configure \
--prefix=/gnu \
--localstatedir=/gnu/var \
--sysconfdir=/gnu/etc/php/5.6 \
--with-config-file-path=/gnu/etc/php/5.6 \
--with-config-file-scan-dir=/gnu/etc/php/5.6/conf.d \
--with-pear=/gnu/share/php/5.6/pear \
--enable-fpm \
--with-zlib \
--enable-bcmath \
--with-bz2 \
--enable-calendar \
--enable-dba=shared \
--with-gdbm \
--with-gd \
--with-freetype-dir=/usr \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--enable-gd-native-ttf \
--with-pdo-mysql \
--with-mysql \
--with-mysqli \
--with-curl
#
# 这只是一个示例,有些扩展单独安装也可以,比如curl、mysql等。
#
# --with-config-file-scan-dir: 指定配置文件的扫描目录,这样可以将ini的配置分模块进行配置,从而可以不、维护一个很长的php.ini文件。
#
# --with-config-file-path: 指定php.ini文件的查找路径,默认查找路径为PREFIX/lib(参考configure --help)
#
下面是Brew中的PHP5.6的配置选项:
#!/bin/bash
./configure \
--prefix=/usr/local/Cellar/php@5.6/5.6.35_1 \
--localstatedir=/usr/local/var \
--sysconfdir=/usr/local/etc/php/5.6 \
--with-config-file-path=/usr/local/etc/php/5.6 \
--with-config-file-scan-dir=/usr/local/etc/php/5.6/conf.d \
--with-pear=/usr/local/Cellar/php@5.6/5.6.35_1/share/php@5.6/pear \
--enable-bcmath \
--enable-calendar \
--enable-dba \
--enable-exif \
--enable-ftp \
--enable-fpm \
--enable-intl \
--enable-mbregex \
--enable-mbstring \
--enable-mysqlnd \
--enable-opcache-file \
--enable-pcntl \
--enable-phpdbg \
--enable-phpdbg-webhelper \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx \
--enable-zip \
--with-apxs2=/usr/local/opt/httpd/bin/apxs \
--with-bz2 \
--with-fpm-user=_www \
--with-fpm-group=_www \
--with-freetype-dir=/usr/local/opt/freetype \
--with-gd \
--with-gettext=/usr/local/opt/gettext \
--with-gmp=/usr/local/opt/gmp \
--with-icu-dir=/usr/local/opt/icu4c \
--with-jpeg-dir=/usr/local/opt/jpeg \
--with-kerberos \
--with-layout=GNU \
--with-ldap \
--with-ldap-sasl \
--with-libedit \
--with-libzip \
--with-mhash \
--with-mysql-sock=/tmp/mysql.sock \
--with-mysqli=mysqlnd \
--with-mysql=mysqlnd \
--with-mcrypt=/usr/local/opt/mcrypt \
--with-ndbm \
--with-openssl=/usr/local/opt/openssl \
--with-pdo-dblib=/usr/local/opt/freetds \
--with-pdo-mysql=mysqlnd \
--with-pdo-odbc=unixODBC,/usr/local/opt/unixodbc \
--with-pdo-pgsql=/usr/local/opt/libpq \
--with-pgsql=/usr/local/opt/libpq \
--with-pic \
--with-png-dir=/usr/local/opt/libpng \
--with-pspell=/usr/local/opt/aspell \
--with-unixODBC=/usr/local/opt/unixodbc \
--with-webp-dir=/usr/local/opt/webp \
--with-xmlrpc \
--with-xsl \
--with-zlib \
--with-curl CC=clang CPPFLAGS=-DU_USING_ICU_NAMESPACE=1 CXX=clang++
# 注意事项
# 1. 该编译选项参考自从brew中安装的php-5.6的php-config命令的输出。
# 2. 某些选项进行了调整。
安装的可执行程序
分为两部分,以部分位于bin目录下,一部分位于sbin目录下。
安装的可执行程序
分为两部分,以部分位于bin目录下,一部分位于sbin目录下:
bin ├── pear # PEAR扩展安装工具。这是一个SHELL脚本。 ├── peardev # pear命令的包装,除去了普通配置的内存限制。这是一个SHELL脚本。 ├── pecl # PECL扩展下载及开发工具。这是一个SHELL脚本。 ├── phar -> phar.phar ├── phar.phar ├── php # ├── php-cgi ├── php-config # SHELL脚本,用户获取已经安装的PHP的配置信息。 ├── phpdbg └── phpize # phpize命令用于准备PHP扩展的构建环境。 sbin └── php-fpm # 用于PHP的简单又强大的FastCGI进程管理器。
pear | PEAR扩展安装工具。这是一个SHELL脚本。
peardev | pear命令的包装,除去了普通配置的内存限制。这是一个SHELL脚本。
pecl | PECL扩展下载及开发工具。这是一个SHELL脚本。
phar -> phar.phar
phar.phar
php #
php-cgi
php-config | SHELL脚本,用户获取已经安装的PHP的配置信息。
phpdbg
phpize | phpize命令用于准备PHP扩展的构建环境。
php-fpm | 用于PHP的简单又强大的FastCGI进程管理器。
编译中的注意事项
#1 关于–with-config-file-path
编译的时候如果未加入:
启动php-fpm时,需要使用-c指定php.ini文件的位置;(02/23/2017,目前的php版本在7.0.0以下,7.0.0+未测试)
#2 关于编译
最好可以在源码目录外创建build文件夹来编译,不要在源码目录内直接configure。
# 关于OpenSSL
编译时如果指定了–with-openssl选项时,可以将OpenSSL编译到PHP中。或者源码目录下的ext目录中单独以模块的方式编译安装OpenSSL。我一般选择后者以模块的方式安装OpenSSL,注意原因是因为使用–with-openssl时会出现各种问题。
常见的编译及安装错误
#1 undefined reference to `libiconv’
这个问题出现在php-5.4.45的编译中。
推荐解决办法:make ZEND_EXTRA_LIBS=’-liconv’
解决办法:修改Makefile, 在EXTRA_LIBS中添加-liconv
EXTRA_LIBS = -lcrypt -lz -lcrypt -lrt -lmysqlclient -lmcrypt -lldap -llber -lfreetype -lpng -lz -ljpeg -lcurl -lz -lrt \ -lm -ldl -lnsl -lrt -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err \ -lidn -lssl -lcrypto -lz -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -lxml2 -lz \ -lm -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -liconv
#2 configure: error: DBA: Could not find necessary header file(s)
问题原因:没有安装GDBM
解决办法:安装GDBM,或者头文件
#!/bin/bash # Kali GNU/Linux Rolling apt-get install libgdbm-dev
#3 configure: error: Please reinstall the libcurl distribution
checking for cURL in default path… not found
configure: error: Please reinstall the libcurl distribution –
OS: Kali GNU/Linux Rolling
问题原因:Debian中,cURL库的头文件位于/usr/include/x86_64-linux-gnu/curl;还有的原因可能是没有安装libcurl库的头文件。
解决办法:建立到include下的curl软连接:
#!/bin/bash ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
#4 configure: error: Cannot find OpenSSL’s <evp.h>
问题原因:SSL头文件版本和SSL库版本不一致。我使用的发行版中,提供了两个版本的libssl:libssl1.0.2、libssl1.1;头文件也是两套:libssl1.0-dev、libssl-dev
解决办法:统一库和头文件的版本
#!/bin/bash apt-get install libssl1.1 libssl-dev
#5 easy.h should be in <curl-dir>/include/curl/
checking for cURL support… yes
checking for cURL in default path… not found
configure: error: Please reinstall the libcurl distribution –
系统环境:Kali GNU/Linux Rolling
问题原因:在系统中,curl头文件的路径位于/usr/include/x86_64-linux-gnu/curl,而编译时要求在/usr/include/curl中。
解决办法方案:ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl