最近拿到我司数据中心给的一台 8C16G 的虚机,预装 centos 7.9.2009 最新版本,使用 oneinstack 一键安装 lnmp 运行环境,硬是没给我装上 fileinfo 扩展,导致我的 laravel 8 项目中读取文件的各类操作均报错,这个问题还没找到解决方案。如下是我个人的一种解决思路,供大家参考
系统环境介绍
- centos 7.9.2009 最小化安装 (使用
cat /etc/redhat-release
指令便可查看当前你的曹祖系统具体的版本) - oneinstack 2022-03-14 版本
- nginx 1.20.2
- mysql 8.0
- php 8.1.3
- php 扩展:zendguardloader,ioncube,sourceguardian,imagick,fileinfo,imap,ldap,phalcon,yaf,redis,memcached,mongodb,swoole(因为机器性能强劲,随便造,注意,这里安装前我选择了 fileinfo,虽然最后自动模式下没装上)
可以看出,我这里能新则新,截止发稿时,我用的都是最新的版本,想的就是体验新的技术,而我们的问题则是在 php 8.1.3 下装 fileinfo 出的
网友们的思路
大家的思路无非就两种
思路一:内存太小。编译 fileinfo 需要吃系统硬件资源,内存小于 1G 的很难编译通过,所以升配或者添加swap空间就可解决问题
思路二:适配问题。当我们不存在硬件瓶颈的时候,提示报错,这里的问题绝大部分是再编译过程中使用 std=c99 选项来重新编译
make && make install
,这样就可以通过
以上两种方式相信自己搜索过的同学都知道该怎么处理
但这以上的问题对我来说均不是问题,我遇到了思路二的问题 + 一个c语言指针的问题,后者的错误是我不想去修改的,毕竟根本跟我代码没什么关系的事情,纯粹就是 php 或者 fileinfo 的问题,不如交给他们的开发者去研究修复,但是不改没法用 fileinfo 的功能,而且网上都没有我说的这个问题
解决方案
解决方案很无脑:找一个 php 8.1 版本的、编译通过的 fileinfo.so 文件,放到系统里,就什么问题都解决了
文件下载好,放到 oneinstack 默认的扩展存放位置 /usr/local/php/lib/php/extensions/no-debug-non-zts-20210902/
中,然后再回到 php.ini
,将 extension=fileinfo
前面的 # 删掉,重启 php 服务 service php-fpm restart
,即可
这时候我们使用 php -m
就可以看到 fileinfo 就在其中,解决问题!
毕竟我们费劲编译到最后的目的就是生成这个 fileinfo.so,好像这个解决方案有点投机取巧,但是在是研究一整天无果后,这是最让我安心的方式了,爷累了
追求最新的技术注定要面对这样需要自己折腾的问题,适配啊、不兼容啊、没文档啊等等,但这次问题解决的过程缺会让你提升很多