PHP 无法安装 fileinfo 的一种解决思路

最近拿到我司数据中心给的一台 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 出的

网友们的思路

大家的思路无非就两种

  1. 思路一:内存太小。编译 fileinfo 需要吃系统硬件资源,内存小于 1G 的很难编译通过,所以升配或者添加swap空间就可解决问题

  2. 思路二:适配问题。当我们不存在硬件瓶颈的时候,提示报错,这里的问题绝大部分是再编译过程中使用 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,好像这个解决方案有点投机取巧,但是在是研究一整天无果后,这是最让我安心的方式了,爷累了

追求最新的技术注定要面对这样需要自己折腾的问题,适配啊、不兼容啊、没文档啊等等,但这次问题解决的过程缺会让你提升很多