先执行 git init 并提交当前状态锁定现状,再通过 git status --ignored 识别忽略文件、用诊断代码验证 php 环境兼容性、用 get_included_files() 梳理 require_once 依赖链、导出 schema.sql 和 data_fixtures.sql 统一管理数据库变更。

直接初始化 Git 仓库,别先改代码结构
老旧 PHP 项目通常没有 .git 目录,也不带 composer.json 或现代目录规范。这时候最稳妥的做法是:在项目根目录执行 git init,立刻提交当前状态为第一个 commit——哪怕它包含 config.php 里明文数据库密码、upload/ 目录下几百个用户头像、甚至 index.php 顶部还写着 <?php // v1.2 - 2009-03-15 ?>。
这样做不是为了“干净”,而是为了锁定现状。后续所有改动(删冗余文件、抽离配置、升级 PHP 版本兼容性补丁)都能被追溯。跳过这步直接重构,很容易陷入“改了一半发现没法回退”的困境。
- 运行
git status --ignored看哪些文件被忽略(比如日志、缓存、临时上传文件),再决定是否加进.gitignore - 敏感配置(如
db_host、api_key)先保留原样提交,后续用环境变量或配置分离方案替换,但别在第一版就硬删 - 如果项目混着 HTML/CSS/JS 在 PHP 文件里,先不急着拆,Git 能照常跟踪混合内容
PHP 版本兼容性要从 phpversion() 和 extension_loaded() 开始验证
老旧项目常依赖已废弃的函数(如 mysql_connect())或扩展(如 mcrypt),直接拉到新服务器可能白屏或报 Fatal error: Uncaught Error:。与其猜,不如让代码自己说话。
在入口文件(如 index.php 或 common.php)顶部插入诊断段:
立即学习“PHP免费学习笔记(深入)”;
<?php
echo 'PHP Version: ' . phpversion() . "\n";
echo 'Extensions loaded: ' . implode(', ', get_loaded_extensions()) . "\n";
if (!function_exists('mysql_connect')) {
echo "mysql_* functions are NOT available\n";
}
if (!extension_loaded('openssl')) {
echo "openssl extension missing\n";
}
die();
?>把输出结果和目标服务器环境对照,比查文档更快定位断点。常见坑:mbstring 缺失导致中文乱码、curl 未启用导致支付接口失败、json 扩展在 PHP 5.2 下需手动编译。
别碰 require_once 路径逻辑,先用 get_included_files() 梳理依赖链
老项目常靠一堆相对路径 require_once '../inc/db.php' 拼凑运行环境,一改路径就 Warning: Failed opening required。此时强行统一成 Composer 自动加载,反而容易引入命名冲突或类重定义。
更务实的做法是先搞清当前加载顺序:
- 在主入口末尾加一行
print_r(get_included_files());,运行后看实际载入了哪些文件、顺序如何 - 检查是否有重复
require_once同一文件(尤其在循环或条件分支里),这是白屏常见原因 - 若发现大量
../路径,可新增一个bootstrap.php统一设置set_include_path(),但不要动原有require_once语句本身
等版本控制稳定、测试覆盖到位后,再逐步替换成 include_path 或 PSR-4 自动加载——不是不能做,是得排在“能安全回滚”的前提之后。
数据库变更必须配 schema.sql + data_fixtures.sql,别信“程序自动建表”
很多老项目把建表语句写死在 PHP 里,或者靠 if (!table_exists) create table 动态生成结构。这种逻辑在多人协作或部署到测试环境时极易出错:字段类型不一致、索引漏建、默认值丢失。
正确做法是立即导出两份 SQL:
-
mysqldump --no-data your_db > schema.sql—— 表结构,放 Git 跟踪 -
mysqldump --no-create-info --skip-triggers your_db config_table user_role_table > data_fixtures.sql—— 关键基础数据(如管理员账号、权限配置),也进 Git - 删除 PHP 里的建表逻辑,改用部署脚本执行
mysql your_db ,再导入 fixtures
注意:如果表里有 ENUM 或 SET 字段,导出时务必加 --compatible=ansi 避免 MySQL 特有语法污染跨版本兼容性。
最难的不是技术动作,而是说服团队接受“先冻结现状再迭代”——很多人想一步到位改成 Laravel + Docker + CI/CD,结果三天后连登录页都打不开。Git 的价值不在漂亮提交图,而在每次 git checkout 都能回到一个确定可运行的状态。











