⭐ 推荐:社区规则条款 V1.0

安装前环境准备(PHP版本、MySQL版本、Web服务器选择)

juming
juming 归队站长新人站长
发布于 2026-10-14 21:47 ·1 浏览 ·2 回复
内容摘要

安装PHP程序前需按官方要求选受支持的PHP版本,装齐必要扩展并调整php.ini;MySQL优先8.0/8.4 LTS、用utf8mb4;Web服务器首推Nginx+PHP-FPM,仅老程序选Apache 2.4。

本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-2014.html
转载请注明出处,版权归原作者所有。
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 2

周末
周末 新人站长 1楼 2026-10-14 21:57

这套梳理基本可以照着抄,但有几个坑帖子里没提,一旦「锁 PHP 7.4 的老程序 + MySQL 8.0」这个组合出现就必踩。

最典型的是 MySQL 8.0 默认认证插件改成了 caching_sha2_password,而 PHP 7.4 的 mysqlnd 对它支持不完整,连接时经常直接报 Authentication plugin 'caching_sha2_password' cannot be loaded。解决办法是先执行 ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';,或者干脆上 PHP 8.1+。第二个坑是 sql_mode,8.0 默认带 ONLY_FULL_GROUP_BY,老程序里那些不规范的 GROUP BY 会报 1055,稳妥做法是在 my.cnf 里剔掉这一项,别在程序里硬改。

Web 服务器那块再补两句:Nginx 的 location ~ \.php$ 里除了 fastcgi_pass unix:/run/php/php8.1-fpm.sock;,老程序依赖 .htaccess 伪静态的要把规则转成 try_files,走 PATH_INFO 的还得加 fastcgi_split_path_info,否则内页全部 404。另外确认一下 php.ini 的 disable_functions,很多主机商默认禁了 proc_open、putenv,装某些程序时会在安装向导里莫名其妙地报错,php -i | grep disable_functions 先看一眼能省不少事。

满月居于空
满月居于空 版主资深会员新人站长 👑年卡会员 #1637 2楼 2026-10-14 22:09
周末:这套梳理基本可以照着抄,但有几个坑帖子里没提,一旦「锁 PHP 7.4 的老程序 + MySQL 8.0」这个组合出现就必踩。 最典型的是 MySQL 8.0…

你补的这几条都在点上,我再钉三颗钉子,这套「PHP 7.4 + MySQL 8.0」的组合基本就踩不出坑了。

caching_sha2_password 先分清病根。跑 php -i | grep -i "Client API",如果显示 mysqlnd(官方源装的 PHP 7.4 基本都是),那报错往往不是插件不支持,而是非 SSL 连接下拿不到服务端 RSA 公钥。除了逐条 ALTER USER 改 native_password,更省事的是在 my.cnf 里加 default_authentication_plugin = mysql_native_password 再重启 mysqld,之后新建账号默认就是老插件;如果程序走 PDO 且连接开了 SSL,其实能直连,不必降插件。

sql_mode 顺手把零日期一起处理。老程序除了 ONLY_FULL_GROUP_BY 报 1055,还常在写入 '0000-00-00' 时被 STRICT_TRANS_TABLES + NO_ZERO_DATE 拦下报 1292/1364。同一个 my.cnf 里一起改更干净:sql_mode = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,改完用 SELECT @@global.sql_mode; 确认,别只在会话里改。

Nginx 的 PATH_INFO 是两段。fastcgi_split_path_info 只是前半截,后面还得有 fastcgi_param PATH_INFO $fastcgi_path_info;,很多默认 vhost 里压根没这行,光加 split 照样内页 404;伪静态统一先落 try_files $uri $uri/ /index.php?$query_string;。

disable_functions 之外,open_basedir 更阴。宝塔和虚拟主机默认把 open_basedir 锁在站点目录,程序一旦要读 /tmp 或调外部命令,报错一样莫名其妙,php -i | grep -i open_basedir 一并看了。

装之前先跑一句 php -r "new PDO('mysql:host=127.0.0.1;dbname=test','u','p');" 做连通性测试,比在安装向导里撞报错好定位得多。