编译安装php8.1过程记录

php最新版本已经升级到8.1.6,之前一直使用php7.2,这两天想升级到8.1.6, 中间遇到一些问题,步骤记录如下

  1. 下载php8.1.6源码,解压
    wget https://www.php.net/distributions/php-8.1.6.tar.gz
  1. 编译
    ./configure --prefix=/usr/local/php8.1 --enable-fpm  --with-mysqli --with-zlib --with-openssl
    make
  1. 解决内存不足问题 购买的云主机只有1G内存,编译过程中报错Cannot allocate memory,内存不够,暂时使用交换分区解决
    sudo dd if=/dev/zero of=/swapfile bs=64M count=16
    sudo mkswap /swapfile
    sudo swapon /swapfile

编译完成之后,可以再卸载交换分区

    sudo swapoff /swapfile
    sudo rm /swapfile
  1. 解决phar报错 编译过程中,phar报段错误,不是phar文件找不到,研究半天没解决,暂时关掉phar功能,configure的时候禁用phar,--disable-phar
    ./configure --prefix=/usr/local/php8.1 --enable-fpm  --with-mysqli --with-zlib --with-openssl --disable-phar
  1. 安装,make install
  2. php启动segmentation fault 安装完成之后,启动php报段错误,Segmentation fault,并且没有产生core文件。
  3. 解决没有产生core文件问题 可能是因为linux系统限制,使用ulimit -a查看一下
     core file size          (blocks, -c) 0
     data seg size           (kbytes, -d) unlimited
     scheduling priority             (-e) 0
     file size               (blocks, -f) unlimited
     pending signals                 (-i) 7674
     max locked memory       (kbytes, -l) 65536
     max memory size         (kbytes, -m) unlimited
     open files                      (-n) 65535
     pipe size            (512 bytes, -p) 8
     POSIX message queues     (bytes, -q) 819200
     real-time priority              (-r) 0
     stack size              (kbytes, -s) 8192
     cpu time               (seconds, -t) unlimited
     max user processes              (-u) 7674
     virtual memory          (kbytes, -v) unlimited
     file locks                      (-x) unlimited
    

    第一行core file size (blocks, -c) 0,说明不允许产生core文件,使用命令调整一下

    ulimit -c unlimited

注意该命令只在当前shell环境下生效,如果换个shell会话还会恢复操作系统默认的配置。
修改core配置之后,再次执行php,产生core文件

    :/usr/local/php8.1-withssl/bin# ./php -i
    Segmentation fault (core dumped)

使用gdb分析core文件,得到如下错误栈:

    #0  resolve_base64_encode () at /root/php-8.1.6/ext/standard/base64.c:391
    #1  0xb7f08d0c in elf_machine_rel (skip_ifunc=<optimized out>, reloc_addr_arg=<optimized out>, version=<optimized out>, sym=<optimized out>, reloc=0x4ed348,
map=0xb7f24940) at ../sysdeps/i386/dl-machine.h:475
    #2  elf_dynamic_do_Rel (skip_ifunc=<optimized out>, lazy=<optimized out>, nrelative=<optimized out>, relsize=<optimized out>, reladdr=<optimized out>,
map=<optimized out>) at do-rel.h:137
    #3  _dl_relocate_object (scope=<optimized out>, reloc_mode=<optimized out>, consider_profiling=<optimized out>) at dl-reloc.c:258
    #4  0xb7f013c2 in dl_main (phdr=<optimized out>, phnum=<optimized out>, user_entry=<optimized out>, auxv=<optimized out>) at rtld.c:2190
    #5  0xb7f150e1 in _dl_sysdep_start (start_argptr=0xbfe2caf0, dl_main=0xb7efee30 <dl_main>) at ../elf/dl-sysdep.c:253
    #6  0xb7efe9ff in _dl_start_final (arg=0xbfe2caf0) at rtld.c:414
    #7  _dl_start (arg=<optimized out>) at rtld.c:521
    #8  0xb7efdc7b in _start () from /lib/ld-linux.so.2

表面意思是resolve_base64_encode函数引起的问题,暂时定位不到具体的原因

  1. openssl引起的段错误? 经过尝试,configure去掉openssl模块,重新编译安装,运行没问题。 可能是openssl版本的问题,但换用openssl-1.1.1之后,依旧是相同的原因报错。
  2. bison版本问题? 仔细分析产生coredump的那行代码,php-8.1.6/ext/standard/base64.c:391,是一个很普通的函数声明的代码,看报错应该是没有解析成功,php是用bison来解析语法结构的,难道是bison版本太低了吗?
    根据官方的php安装步骤,[https://www.php.net/manual/zh/install.unix.php](https://www.php.net/manual/zh/install.unix.php),php7.4及其以上版本要求bison高于3.0版本,而自己的云主机上bison的最新版本是3.0.8,手动安装到更高版本试一下。
    wget 'http://ftp.gnu.org/gnu/bison/bison-3.8.tar.gz'
    解压,configure,make,make install
  1. 更新bison版本后,编译安装php依旧有coredump,原因与上面一致,暂定位不到其他原因了,嗯。。。。
  2. 操作系统是ubuntu,那就使用apt安装试试吧,安装php的更新源之后,直接apt install即可,然后再安装PHP的拓展包,参考:https://blog.csdn.net/yisonphper/article/details/116764005

手动编译php遇到的问题,没有解决,后续继续研究。

版权声明

本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。

© 空空博客,本文链接:https://www.yeetrack.com/?p=1430