装一套 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 的大版本跨越都可能让程序直接起不来。