编译遇到的问题很多。网上的文章往往是记录遇到的报错,贴上对应的解决。

而实际的环境,如操作系统,安装的软件必然有差异,所以,更重要的是,如何找到解决方法(不担保按步骤做可以编译成功),并将过程自动化。

安装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/

Debian GNU/Linux 8.4 (jessie)编译安装php.md的更多相关文章

  1. 大神教你Debian GNU/Linux 9.7 “Stretch” Live和安装镜像开放下载

    Debian项目团队于昨天发布了Debian GNU/Linux 9 "Stretch" 的第7个维护版本更新,重点修复了APT软件管理器中存在的安全漏洞.在敦促每位用户尽快升级系 ...

  2. ZFS(一):ZFS在Debian GNU/Linux上的安装

    以下内容翻译自https://pthree.org/2012/04/17/install-zfs-on-debian-gnulinux/,并附有原文,由于是第一次翻译,如有任何翻译不恰当之处,欢迎指出 ...

  3. Debian系统中当安装deb软件时出现:deb cdrom:[Debian GNU/Linux 9.3.0 _Stretch_ - Official amd64 DVD Binary-1 20171209-12:11]/ stretch contrib main

    vi /etc/apt/sources.list // 注释掉下面这句话# deb cdrom:[Debian GNU/Linux 9.3.0 _Stretch_ - Official amd64 D ...

  4. debian7 请把标有“Debian GNU/Linux 7.1.0 _Wheezy_ - Official amd64 DVD Binary-1 20130615-23:06”的盘片插入驱动器“/media/cdrom/”再按回车键

    有时候,在通过apt-get install 安装软件的时候,会出现: 更换介质:请把标有“Debian GNU/Linux 7.1.0 _Wheezy_ - Official amd64 DVD B ...

  5. Linux下指定版本编译安装LAMP

    说明: 操作系统:CentOS 6.5 64位 需求: 编译安装LAMP运行环境 各软件版本如下: MySQL:mysql-5.1.73 Apache:httpd-2.2.31 PHP:php-5.2 ...

  6. Linux 从源码编译安装 OpenSSH

    https://blog.csdn.net/bytxl/article/details/46639073 Linux 从源码编译安装 OpenSSH以及各问题解决 2015年06月25日 17:37: ...

  7. Debian GNU Linux服务列表的获取、服务的关闭/开启、服务在启动时是否自己主动执行的生效/失效

    /*********************************************************************  * Author  : Samson  * Date   ...

  8. 【转载】Linux升级NTPD服务器-编译安装ntp-4.2.8p12与配置

    [转载]Linux升级NTPD服务器-编译安装ntp-4.2.8p12与配置 1. 系统与软件版本 1.1 系统版本 rhel6.4(Red Hat Enterprise Linux Server r ...

  9. PCL库在Linux环境下的编译安装

    PCL库在Linux环境下的编译安装 PCL库的源码库:https://github.com/PointCloudLibrary/pcl 下载完了之后解压下来 编译库的几个步骤 mkdir build ...

随机推荐

  1. 201521123085《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学 ...

  2. PHP连接数据_insert_id介绍

    对于自增长的主键列不好取值的情况,php提供了一个变量来取值,insert_id $db = new MySQLi("localhost","root",&qu ...

  3. csv文件读取

    from urllib.request import urlopen from io import StringIO import csv data = urlopen("http://py ...

  4. lintcode.177 把排序数组转换为高度最小的二叉搜索树

    把排序数组转换为高度最小的二叉搜索树    描述 笔记 数据 评测 给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树. 注意事项 There may exist multiple val ...

  5. mongoose api 图表整理

    一.背景 今天看 mongoose 的基础 API,参考了下面的链接做了图表以供查阅. 参考资料: http://www.cnblogs.com/xiaohuochai/p/7215067.html ...

  6. vue2.0动态绑定图片src属性值初始化时报错

    在vue2.0中,经常会使用类似这样的语法 v-bind:src = " imgUrl "(缩写 :src = " imgUrl "),看一个案例 <te ...

  7. Ansible系列(六):各种变量定义方式和变量引用

    本文目录:1.1 ansible facts1.2 变量引用json数据的方式 1.2.1 引用json字典数据的方式 1.2.2 引用json数组数据的方式 1.2.3 引用facts数据1.3 设 ...

  8. HTML5可预览多图片ajax上传(使用formData传递数据)

    HTML5可预览多图片ajax上传(使用formData传递数据) 在介绍上传图片之前,我们简单的来了解下FormData的基本使用:介绍完成后这些基本知识后,我们会在文章最后提供一个demo,就是a ...

  9. 【TOMCAT启动异常】The BASEDIR environment variable is not defined correctly

    <span style="font-size:18px;">The BASEDIR environment variable is not defined correc ...

  10. matplotlib学习之绘图基础

    matplotlib:http://www.cnblogs.com/jasonhaven/p/7609059.html 1.基本图形 散点图:显示两组数据的值,每个点的坐标位置由变量的值决定,头一组不 ...