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

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

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

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

装一套 PHP 程序,安装前先把环境定死:PHP 用 7.4 或 8.1/8.2(按程序官方要求二选一,别硬上新版),数据库用 MySQL 5.7 或 8.0 + InnoDB + utf8mb4,Web 服务器首推 Nginx + PHP-FPM,只有必须靠 .htaccess 或 mod_php 的老程序才选 Apache 2.4。

PHP 版本该怎么选?

结论:PHP 版本只由目标程序的官方要求决定,不选「最新」,也不要在生产环境用已停止安全维护的版本。PHP 7.4 于 2022-11-28 结束安全支持,PHP 8.0 于 2023-11-26 结束安全支持,这两个版本现在只适合过渡;PHP 8.1 的安全支持到 2025-12-31,8.2 到 2026-12-31,8.3 到 2027-12-31,长期跑就选这三个里的最低可满足版本。

实际操作顺序是:先打开程序的安装文档或 README,找「PHP >= x.x」这一行;如果只写「PHP 7.0 以上」,就选 7.4 或 8.1。要注意的是,很多老程序在 PHP 8.0 之后会因为函数签名变化、each() 被移除、动态属性报错而白屏,这类程序必须锁 7.4。

检查命令:php -v 看版本,php -m 看已装扩展。

PHP 需要哪些扩展,怎么检查?

结论:必装扩展至少包括 pdo_mysql(或 mysqli)、gd、curl、mbstring、openssl、zip、fileinfo、bcmath、xml/dom,缺一个都可能在安装向导里报错。

逐条核对用 php -m | grep -iE 'pdo_mysql|gd|curl|mbstring|openssl|zip|fileinfo|bcmath',没列出来的就是没装。Debian/Ubuntu 系用 apt install php8.1-gd php8.1-mysql php8.1-curl php8.1-mbstring php8.1-zip php8.1-xml php8.1-bcmath,CentOS/RHEL 系用 yum install php-gd php-mysqlnd php-mbstring php-zip php-bcmath。

php.ini 三个值必须改,改完重启 PHP-FPM 生效:memory_limit = 256M、upload_max_filesize = 20M、post_max_size = 20M(post_max_size 必须大于等于 upload_max_filesize,否则上传大文件会静默失败);另外把 date.timezone = Asia/Shanghai 写上,生产环境设 display_errors = Off。

MySQL 选 5.7 还是 8.0?

结论:新装一律选 MySQL 8.0 或 8.4 LTS,只有程序明确写着「仅支持 5.7」时才用 5.7(5.7 已在 2023 年 10 月结束生命周期)。MySQL 8.0 的支持周期到 2026 年 4 月,8.4 LTS 更长,MariaDB 10.6/11.4 LTS 在多数场景可平替。

字符集必须选 utf8mb4,不要选 utf8(MySQL 里的 utf8 只有 3 字节,存 emoji 和部分生僻字会直接报错);排序规则 MySQL 8.0 默认 utf8mb4_0900_ai_ci,兼容老程序可手动设为 utf8mb4_general_ci。存储引擎统一用 InnoDB,它是事务型引擎,MyISAM 不支持事务和外键。

两个易踩的坑:一是 MySQL 8.0 默认开启严格模式,老程序插入空值会报 Incorrect integer value,可在 my.cnf 里去掉 STRICT_TRANS_TABLES;二是 innodb_buffer_pool_size 建议设为物理内存的 50%~70%,1 核 1G 的机器就设 512M。检查版本用 mysql --version,进库看字符集用 SHOW VARIABLES LIKE 'character_set%';。

Web 服务器选 Nginx 还是 Apache?

结论:默认选 Nginx 1.20 以上 + PHP-FPM(FastCGI 进程管理器),静态资源并发和内存占用都优于 Apache;只有当程序依赖 .htaccess 重写规则、或文档明确要求 mod_php 时,才选 Apache 2.4,用 proxy_fcgi 接 PHP-FPM。

Nginx 配置里 PHP 处理段落用 fastcgi_pass unix:/run/php/php8.1-fpm.sock; 或 fastcgi_pass 127.0.0.1:9000;,两者速度差别不大,socket 略快一点。伪静态(URL 重写)必须自己写 try_files $uri $uri/ /index.php?$query_string;,Nginx 不支持 .htaccess。Apache 则要 a2enmod rewrite 打开重写模块,并确认目录段 AllowOverride All。

另外记得放行端口:80、443 走 Web,3306 只对本机开放,9000 是 PHP-FPM 端口,不要暴露到公网。

怎么在安装前一次性验证环境?

结论:装之前先跑一轮「版本 + 扩展 + 连接」三查,能省掉 80% 的安装报错。

具体做法:服务器上执行 php -v && php -m | wc -l && mysql --version && nginx -v;再在站点根目录建一个 info.php,内容只有 <?php phpinfo(); ?>,浏览器访问 http://你的域名/info.php,确认 PHP 版本、扩展列表、memory_limit 都对;然后用命令行连一次库:mysql -u root -p -e "SHOW VARIABLES LIKE 'version';"。全部通过再开始装程序,装完立刻删掉 info.php,它是一个完整的环境探测文件,留在线上等于给攻击者递地图。

最后补一句资源底线:1 核 1G 内存可以跑小型站点,但 PHP-FPM 子进程数要压到 2~4;要跑中等流量的程序,建议 2 核 2G 起步,磁盘预留 20G 以上。环境版本一旦定下就不要在运行中随意升级,PHP 和 MySQL 的大版本跨越都可能让程序直接起不来。

本文转载自 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');" 做连通性测试,比在安装向导里撞报错好定位得多。