宝塔面板安装 php80 版本的 fileinfo 扩展不能被识别
测试安装新的 [宝塔面板·腾讯云专享版](新腾讯云服务器)时,想要将一个之前测试 laravel 及 php80 新特性的 demo 放到服务器上。
上传之后,在网站面板添加网站,网站根目录选择项目根目录,创建好之后点设置,选择网站目录,再把运行目录绑定到 /public
上,并取消勾选 [防跨站攻击(open_basedir)] 保存。PHP 版本选择的是安装好的 php80,伪静态选择 laravel5 保存。此时使用 Composer tab 栏来安装第三方类库,之前版本都适配好的,所以直接选择 install 、root 安装。然后就报错了:
league/flysystem 1.1.6 requires ext-fileinfo * -> it is missing from your system
...
大概的几个错误,根源都在 php fileinfo 扩展上,也就是说,宝塔面板默认是没有安装 fileinfo 的。从软件商店、已安装、PHP-8.0 点击设置打开,phpinfo 一栏 [文件和字符串处理库] 中的 FileInfo 确实显示为 No,此时需要安装 fileinfo 扩展。
使用宝塔面板安装前需要注意,PHP-8.0管理中的 [安装扩展] 一栏安装之后是不需要修改配置文件(去除注释)再重启或重载服务的,因为这些步骤都是自动完成的。[安装扩展] 里点击安装之后会自动添加 .so
文件的路径到扩展且自动重载服务。如果点击了安装扩展,并且去修改配置文件,去除相关注释,重载不会报错,但重启服务会报错,提示重复加载服务之类的错误。
点击安装 fileinfo 扩展,之后转到 phpinfo 一栏发现,FileInfo 并没有开启,让同事相同镜像环境尝试,情况一致。也就是说,宝塔面板安装 php80 版本的 fileinfo 扩展不能被识别。
中间尝试在另外一台自主安装宝塔面板的服务器,安装 php80 和 fileinfo 扩展,但因为服务器内存不够 1G,每次点击安装之后都安装失败了。之前有过裸机 centos 服务器升级 PHP 版本到 8 的经历,一点也不虚,大不了编译安装 fileinfo 得了。
这时同事给了一个想法:宝塔面板安装 php80 时,使用编译模式,然后把 fileinfo 模块通过 --enable-fileinfo
参数添加进去一块安装。先卸载当前 80 版本,再去重新找到 PHP-8.0 选择编译模式安装,这个花了一些时间,最终是成功了。
phpinfo 中 配置指令:
'./configure' '--prefix=/www/server/php/80' '--with-config-file-path=/www/server/php/80/etc' '--enable-fpm' '--with-fpm-user=www' '--with-fpm-group=www' '--enable-mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-iconv-dir' '--with-freetype' '--with-jpeg' '--with-zlib' '--with-libxml-dir=/usr' '--enable-xml' '--disable-rpath' '--enable-bcmath' '--enable-shmop' '--enable-sysvsem' '--enable-inline-optimization' '--with-curl' '--enable-mbregex' '--enable-mbstring' '--enable-intl' '--enable-ftp' '--enable-gd' '--with-openssl' '--with-mhash' '--enable-pcntl' '--enable-sockets' '--with-xmlrpc' '--enable-soap' '--with-gettext' '--disable-fileinfo' '--enable-opcache' '--with-sodium=/usr/local/libsodium' '--with-webp' '--enable-fileinfo'
可以看到里面有 --disable-fileinfo
和 --enable-fileinfo
,后续增加的覆盖了前面的,fileinfo 模块从而正常安装。
最后需要禁用函数中删除 putenv,将 .env.example
复制一份改成 .env
文件,然后命令行 php artisan key:generate
生成 APP_KEY,到此 demo 部署完毕。