当前位置: 首页 > 工具软件 > GNU SASL > 使用案例 >

Debian GNU/Linux 8.4 (jessie)编译安装php.md

阎嘉荣
2023-12-01

编译遇到的问题很多。网上的文章往往是记录遇到的报错,贴上对应的解决。
而实际的环境,如操作系统,安装的软件必然有差异,所以,更重要的是,如何找到解决方法(不担保按步骤做可以编译成功),并将过程自动化。

安装php-dev

apt-get install php5-dev

安装phpize、autoconf、php-config等configure安装需要的命令

configure 安装三步曲 (configure,make,install三步)

先进入php源码目录

  • ./buildconf --force
  • configure
  • make -j4
  • make install

    获得php原configure参数

    因为要替换包安装的的php,首先获得configure参数
php-config --configure-options
xxxx@xxxx:/etc/php5/apache2$ php-config --configure-options
--prefix=/usr --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php5/apache2 --with-config-file-scan-dir=/etc/php5/apache2/conf.d --build=x86_64-linux-gnu --host=x86_64-linux-gnu --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --with-pear=/usr/share/php --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype --with-db4 --with-qdbm=/usr --without-gdbm --with-iconv --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-onig=/usr --with-pcre-regex=/usr --enable-shmop --enable-sockets --enable-wddx --with-libxml-dir=/usr --with-zlib --with-kerberos=/usr --with-openssl=/usr --enable-soap --enable-zip --with-mhash=yes --with-system-tzdata --with-mysql-sock=/var/run/mysqld/mysqld.sock --enable-dtrace --without-mm --with-curl=shared,/usr --with-enchant=shared,/usr --with-zlib-dir=/usr --with-gd=shared,/usr --enable-gd-native-ttf --with-gmp=shared,/usr --with-jpeg-dir=shared,/usr --with-xpm-dir=shared,/usr/X11R6 --with-png-dir=shared,/usr --with-freetype-dir=shared,/usr --with-vpx-dir=shared,/usr --with-imap=shared,/usr --with-imap-ssl --enable-intl=shared --without-t1lib --with-ldap=shared,/usr --with-ldap-sasl=/usr --with-mcrypt=shared,/usr --with-mysql=shared,/usr --with-mysqli=shared,/usr/bin/mysql_config --with-pspell=shared,/usr --with-unixODBC=shared,/usr --with-recode=shared,/usr --with-xsl=shared,/usr --with-snmp=shared,/usr --with-sqlite3=shared,/usr --with-mssql=shared,/usr --with-tidy=shared,/usr --with-xmlrpc=shared --with-pgsql=shared,/usr PGSQL_INCLUDE=/usr/include/postgresql --enable-pdo=shared --without-pdo-dblib --with-pdo-mysql=shared,/usr --with-pdo-odbc=shared,unixODBC,/usr --with-pdo-pgsql=shared,/usr/bin/pg_config --with-pdo-sqlite=shared,/usr --with-pdo-dblib=shared,/usr --with-interbase=shared,/usr --with-pdo-firebird=shared,/usr build_alias=x86_64-linux-gnu host_alias=x86_64-linux-gnu CFLAGS=-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -O2 -Wall -fsigned-char -fno-strict-aliasing -g LDFLAGS=-Wl,-z,relro CPPFLAGS=-D_FORTIFY_SOURCE=2 CXXFLAGS=-g -O2 -fstack-protector-strong -Wformat -Werror=format-security

configure 常见错误

bison版本问题

configure: WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 3.0, min: 204, excluded: 3.0).
checking for re2c... no
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
configure: error: bison is required to build PHP/Zend when building a GIT checkout!
vim configure
line:5268
bison_version_exclude=""

php-config 生成参数包含 -O2 等 configure 不支持的参数

configure: error: unrecognized option: `-O2'

看起来是php-config生成的结果不能直接传入configure,把 CFLAGS 后的参数全部去掉。去掉--disable-debug,加上--enable-debug --enable-mysqlnd=shared——自己编译的目的就是打开调试。

没有装安装包、或有安装对应的包,但路径不对

此类报错数量非常多,总结一下:

  • 一般情况下,可以google报错信息。
  • 查看config.log config.m4 中的内容。找到包名,在https://packages.debian.org/search搜索
  • find 命令查找缺失的文件,看configure命令指定的路径,ln解决

具体报错

  • configure: error: Cannot find sys/sdt.h which is required for DTrace support
xxxx@xxxx:~$ sudo apt-get install systemtap-sdt-dev
  • configure: error: DBA: Could not find necessary header file(s).
xxxx@xxxx:~/workspace/php-src-php-5.6.30$ find . -name "*.m4" | xargs grep "DBA: Could not find necessary " -n
./ext/dba/config.m4:32:    AC_MSG_ERROR([DBA: Could not find necessary header file(s).])
./ext/dba/config.m4:35:    AC_MSG_ERROR([DBA: Could not find necessary library.])
./ext/dba/config.m4:235:    AC_MSG_ERROR([DBA: Could not find necessary header file(s).])
./ext/dba/config.m4:299:    AC_MSG_ERROR([DBA: Could not find necessary library.])
// 得知需要找到 db4,qdbm的package,可以在
// https://packages.debian.org/search?suite=default&section=all&arch=amd64&searchon=names&keywords=db4
// 搜索并安装
xxxx@xxxx:~$ wget http://security.debian.org/debian-security/pool/updates/main/d/db4.8/db4.8-util_4.8.30-12+deb7u1_amd64.deb
xxxx@xxxx:~$ sudo dpkg -i db4.8-util_4.8.30-12+deb7u1_amd64.deb 
仍然不行,干掉
--with-db4=/usr --with-qdbm=/usr --without-gdbm
  • configure: error: Unable to find gd.h anywhere under /usr
xxxx@xxxx:~$ sudo find / -name "gd.h"
/home/xxxx/workspace/php-src-php-5.6.30/ext/gd/libgd/gd.h
将--with-gd=shared,/usr 改为--with-gd=shared
  • configure: error: Unable to locate gmp.h
xxxx@xxxx:~$ sudo find / -name "gmp.h"
/usr/include/x86_64-linux-gnu/gmp.h
xxxx@xxxx:~$ sudo ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h
  • configure: error: libgds, libib_util or libfbclient not found! Check config.log for more information.
搜索得到
jessie (oldstable) (libs): Firebird client library 
2.5.3.26778.ds4-5+deb8u1: amd64
xxxx@xxxx:~/deb$ wget http://ftp.cn.debian.org/debian/pool/main/f/firebird2.5/libfbclient2_2.5.3.26778.ds4-5+deb8u1_amd64.deb
xxxx@xxxx:~/deb$ sudo dpkg -i libfbclient2_2.5.3.26778.ds4-5+deb8u1_amd64.deb
xxxx@xxxx:/usr/lib$ sudo apt-get install firebird-dev
仍然报错,查看config.log
/usr/bin/ld: cannot find -lfbclient
xxxx@xxxx:/usr/lib$ sudo find / -name "libfbclient.so*"
/usr/lib/x86_64-linux-gnu/libfbclient.so.2.5.3
/usr/lib/x86_64-linux-gnu/libfbclient.so.2
xxxx@xxxx:/usr/lib$ sudo ln -s /usr/lib/x86_64-linux-gnu/libfbclient.so.2.5.3 /usr/lib/libfbclient.so
  • configure: error: Cannot find ldap libraries in /usr/lib.
xxxx@xxxx:/usr/lib$ sudo ln -s /usr/lib/x86_64-linux-gnu/libldap.so /usr/lib/libldap.so
  • configure: error: oniguruma.h not found in /usr/include
sudo apt-get install libonig-dev
gem install oniguruma
  • configure: error: Cannot find FreeTDS in known installation directories
sudo apt-get install freetds-dev
  • configure: error: Could not find /usr/lib/libsybdb.a|so
xxxx@xxxx:~$ sudo ln -s /usr/lib/x86_64-linux-gnu/libsybdb.so /usr/lib/libsybdb.so
  • checking for unixODBC support... configure: error: ODBC header file '/usr/include/sqlext.h' not found!
xxxx@xxxx:/usr/lib$ sudo apt-get install unixODBC-dev
  • xxxx@xxxx:/usr/lib$ sudo apt-get install libpspell-dev
configure: error: Cannot find pspell
  • configure: error: Can not find recode.h anywhere under /usr /usr/local /usr /opt.
xxxx@xxxx:/usr/lib$ sudo apt-get install librecode-dev
  • configure: error: Could not find net-snmp-config binary. Please check your net-snmp installation.
xxxx@xxxx:~$ sudo apt-get install libsnmp-dev
  • configure: error: Cannot find libtidy
xxxx@xxxx:/usr/lib$ sudo apt-get install libtidy-dev
  • configure: error: recode extension can not be configured together with: imap
去掉imap

安装php5-redis拓展

获得php5-redis版本

xxxx@xxxx:~/my_code/c++$ sudo apt-show-versions php5-redis
php5-redis:amd64/jessie 2.2.5-1 uptodate

下载php5-redis并安装

xxxx@xxxx:~/workspace/php-src-php-5.6.30/ext$ wget https://github.com/phpredis/phpredis/archive/2.2.5.tar.gz
xxxx@xxxx:~/workspace/php-src-php-5.6.30/ext$ tar -xf 2.2.5.tar.gz
xxxx@xxxx:~/workspace/php-src-php-5.6.30/ext/phpredis-2.2.5$ phpize
Configuring for:
PHP Api Version:        20131106
Zend Module Api No:      20131226
Zend Extension Api No:  220131226
./configure && make -j4 && sudo make install

当然不可能那么顺利

xxxx@xxxx:~$ php --ini
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20131226-debug/redis.so' - /usr/lib/php/20131226-debug/redis.so: cannot open shared object file: No such file or directory in Unknown on line 0
Installing shared extensions:    /usr/local/lib/php/extensions/no-debug-non-zts-20131226/

怀疑phpize使用的配置和编译安装的不一致

xxxx@xxxx:~/workspace/php-src-php-5.6.30/ext/phpredis-2.2.5$ which phpize
/usr/local/bin/phpize
xxxx@xxxx:~/workspace/php-src-php-5.6.30$ cat /usr/local/bin/phpize | grep local
prefix='/usr/local'
datarootdir='/usr/local/php'
        aclocal.m4 config.h config.h.in conftest* ltmain.sh libtool config.cache autom4te.cache/ \
  (cd "$builddir" && cat acinclude.m4 ./build/libtool.m4 > aclocal.m4)
  -e "s#/usr/local#$prefix#" \

尝试将phpize中的local都去掉。仍然不行。最后将php-redis拓展和php一同编译。

最后的configure命令

./configure --prefix=/usr --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php5/apache2 --with-config-file-scan-dir=/etc/php5/apache2/conf.d --build=x86_64-linux-gnu --host=x86_64-linux-gnu --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --with-pear=/usr/share/php --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype  --with-iconv --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-onig=/usr --with-pcre-regex=/usr --enable-json=shared --enable-shmop --enable-sockets --enable-wddx --with-libxml-dir=/usr --with-zlib --with-kerberos=/usr --with-openssl=/usr --enable-soap --enable-zip --with-mhash=yes --with-mysql-sock=/var/run/mysqld/mysqld.sock --enable-dtrace --without-mm --with-curl=shared,/usr --with-enchant=shared,/usr --with-zlib-dir=/usr --with-gd=shared --enable-gd-native-ttf --with-gmp=shared,/usr --with-jpeg-dir=shared,/usr --with-xpm-dir=shared,/usr/X11R6 --with-png-dir=shared,/usr --with-freetype-dir=shared,/usr --with-vpx-dir=shared,/usr --enable-intl=shared --without-t1lib --with-ldap=shared,/usr --with-ldap-sasl=/usr --with-mcrypt=shared --with-mysql=shared,/usr --with-mysqli=shared --with-pspell=shared,/usr --with-unixODBC=shared,/usr --with-recode=shared,/usr --with-xsl=shared,/usr --with-snmp=shared,/usr --with-sqlite3=shared,/usr --with-mssql=shared,/usr --with-tidy=shared,/usr --with-xmlrpc=shared --with-pgsql=shared,/usr PGSQL_INCLUDE=/usr/include/postgresql --enable-pdo=shared --without-pdo-dblib --with-pdo-mysql=shared,/usr --with-pdo-odbc=shared,unixODBC,/usr --with-pdo-pgsql=shared,/usr/bin/pg_config --with-pdo-sqlite=shared,/usr --with-pdo-dblib=shared,/usr --with-interbase=shared --with-pdo-firebird=shared build_alias=x86_64-linux-gnu host_alias=x86_64-linux-gnu --enable-debug --enable-mysqlnd=shared --with-readline=shared --enable-redis=shared

至此,已经可以成功编译出debug版的php以及所需的拓展:

(gdb) b mysqli_api.c:php_mysqli_init
Breakpoint 1 at 0x7f6c64c89d02: file /home/xxxx/workspace/php-src-php-5.6.30/ext/mysqli/mysqli_api.c, line 1540.
(gdb) c
Continuing.

Breakpoint 1, php_mysqli_init (ht=0, return_value=0x7f6c71dbe4c0, return_value_ptr=0x7f6c713c8d88, this_ptr=0x0, return_value_used=1)
    at /home/xxxx/workspace/php-src-php-5.6.30/ext/mysqli/mysqli_api.c:1540
1540            if (getThis() && ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr) {
(gdb) bt
#0  php_mysqli_init (ht=0, return_value=0x7f6c71dbe4c0, return_value_ptr=0x7f6c713c8d88, this_ptr=0x0, return_value_used=1)
    at /home/xxxx/workspace/php-src-php-5.6.30/ext/mysqli/mysqli_api.c:1540
#1  0x00007f6c64c89eba in zif_mysqli_init (ht=0, return_value=0x7f6c71dbe4c0, return_value_ptr=0x7f6c713c8d88, this_ptr=0x0, return_value_used=1)
    at /home/xxxx/workspace/php-src-php-5.6.30/ext/mysqli/mysqli_api.c:1577

遇到的Call to undefined function mysqli_init()

有mysqli.so,nm看mysqli.so也有对应的接口,看进程有无加载

xxxx@xxxx:/usr/lib/php/20131226-debug$ sudo cat /proc/12931/maps | grep mysql
xxxx@xxxx:/usr/lib/php/20131226-debug$ sudo cat /proc/12931/maps | grep libphp5
7f0a68002000-7f0a68ad3000 r-xp 00000000 fd:00 33711 /usr/lib/apache2/modules/libphp5.so
7f0a68ad3000-7f0a68cd2000 ---p 00ad1000 fd:00 33711 /usr/lib/apache2/modules/libphp5.so
7f0a68cd2000-7f0a68d90000 rw-p 00ad0000 fd:00 33711 /usr/lib/apache2/modules/libphp5.so
xxxx@xxxx:/etc/p5/apache2$ php --ini
Configuration File (php.ini) Path: /etc/php5/apache2
Loaded Configuration File: /etc/php5/apache2/php.ini
Scan for additional .ini files in: /etc/p5/apache2/conf.d

不知道p5哪里来的
最后find到

Binary file /usr/lib/apache2/modules/libphp5.so matches
Binary file /usr/bin/php matches
/usr/include/php/main/build-defs.h:90:#define PHP_CONFIG_FILE_SCAN_DIR "/etc/p5/apache2/conf.d"

说明是编译期间传入的。
打开build-defs.h发现自己传入了'--with-config-file-scan-dir=/etc/p5/apache2/conf.d'
改完后重新编译安装

xxxx@xxxx:~$ php --ini
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20131226-debug/redis.so' - /usr/lib/php/20131226-debug/redis.so: cannot open shared object file: No such file or directory in Unknown on line 0
Configuration File (php.ini) Path: /etc/php5/apache2
Loaded Configuration File: /etc/php5/apache2/php.ini
Scan for additional .ini files in: /etc/php5/apache2/conf.d
Additional .ini files parsed: /etc/php5/apache2/conf.d/05-opcache.ini,
/etc/php5/apache2/conf.d/10-mysqlnd.ini,
/etc/php5/apache2/conf.d/10-pdo.ini,
/etc/php5/apache2/conf.d/20-curl.ini,
/etc/php5/apache2/conf.d/20-json.ini,
/etc/php5/apache2/conf.d/20-mcrypt.ini,
/etc/php5/apache2/conf.d/20-mysql.ini,
/etc/php5/apache2/conf.d/20-mysqli.ini,
/etc/php5/apache2/conf.d/20-pdo_mysql.ini,
/etc/php5/apache2/conf.d/20-readline.ini,
/etc/php5/apache2/conf.d/20-redis.ini

参考

http://fivezh.github.io/2016/08/02/PHP-Nginx-Memcached-Redis-configuration/
https://www.crybit.com/20-common-php-compilation-errors-and-fix-unix/

转载于:https://www.cnblogs.com/enjolras/p/7742564.html

 类似资料: