php最新版本已经升级到8.1.6,之前一直使用php7.2,这两天想升级到8.1.6, 中间遇到一些问题,步骤记录如下
- 下载php8.1.6源码,解压
wget https://www.php.net/distributions/php-8.1.6.tar.gz
- 编译
./configure --prefix=/usr/local/php8.1 --enable-fpm --with-mysqli --with-zlib --with-openssl
make
- 解决内存不足问题 购买的云主机只有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
- 解决phar报错 编译过程中,phar报段错误,不是phar文件找不到,研究半天没解决,暂时关掉phar功能,configure的时候禁用phar,
--disable-phar
./configure --prefix=/usr/local/php8.1 --enable-fpm --with-mysqli --with-zlib --with-openssl --disable-phar
- 安装,
make install
- php启动segmentation fault 安装完成之后,启动php报段错误,Segmentation fault,并且没有产生core文件。
- 解决没有产生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函数引起的问题,暂时定位不到具体的原因
- openssl引起的段错误? 经过尝试,configure去掉openssl模块,重新编译安装,运行没问题。 可能是openssl版本的问题,但换用openssl-1.1.1之后,依旧是相同的原因报错。
- 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
- 更新bison版本后,编译安装php依旧有coredump,原因与上面一致,暂定位不到其他原因了,嗯。。。。
- 操作系统是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
近期评论