PHP后端开发需保障服务稳、快、可维护,涵盖路由分发、防SQL注入、规范接口输出、并发隔离及日志管理等核心能力。

PHP后端开发不是写网页表单提交逻辑就完事了,而是要让整个服务在用户看不见的地方稳、快、可维护——尤其当流量突增、数据库慢查询频发、第三方接口超时的时候,你写的那段 foreach 循环和 try...catch 里怎么写,直接决定用户看到的是“加载中”还是“502 Bad Gateway”。
处理 HTTP 请求与路由分发
用户点一个链接或发个 POST,PHP 后端得先接住这个请求,识别 URL 路径、方法(GET/POST)、参数($_GET、$_POST、$_SERVER['REQUEST_URI']),再交给对应逻辑。现代框架如 Laravel 或 ThinkPHP 用路由配置替代手工 if-else 判断,但底层仍是靠 $_SERVER['REQUEST_METHOD'] 和正则或前缀匹配实现。
- 别直接在入口脚本里写业务逻辑,路由层应只做分发,不掺杂数据库操作或模板渲染
- 注意
$_REQUEST默认包含 GET/POST/COOKIE,容易引发参数覆盖,敏感操作务必显式读取$_POST或file_get_contents('php://input') - RESTful 接口需支持 PUT/PATCH/DELETE,Apache 需开启
mod_rewrite,Nginx 要配try_files,否则会 405
与数据库交互并防范 SQL 注入
PHP 连 MySQL 最常用的是 PDO 或 MySQLi,核心不是“能不能查出数据”,而是“查得安全、查得可控、查得可追踪”。裸写 mysql_query("SELECT * FROM user WHERE id = " . $_GET['id']) 在今天等于主动交出服务器权限。
- 必须用预处理语句:
$stmt = $pdo->prepare("SELECT * FROM orders WHERE status = ? AND created_at > ?"); $stmt->execute([$status, $since]); - 批量插入别用循环执行 N 次
INSERT,改用INSERT INTO ... VALUES (...), (...), (...)单条语句 - 读写分离场景下,
SELECT走从库,INSERT/UPDATE/DELETE必须走主库,框架里常通过DB::connection('write')显式指定
接口输出与状态码控制
前端调的不是 PHP 文件,是接口。返回 JSON 不只是 echo json_encode($data) 就完事——HTTP 状态码、Content-Type、跨域头、错误结构,全得手动或由框架统一管控。
立即学习“PHP免费学习笔记(深入)”;
- 成功必须返回
200 OK,创建资源用201 Created,重定向用302或307,客户端错误统一用400,权限问题用401或403,服务异常才用500 - JSON 接口务必设置头:
header('Content-Type: application/json; charset=utf-8');,否则前端response.json()可能解析失败 - CORS 头不能只加
Access-Control-Allow-Origin: *,带 cookie 时必须设为具体域名,并加Access-Control-Allow-Credentials: true
处理并发与资源隔离
PHP-FPM 是进程/线程模型,每个请求独占一个 worker,看似天然隔离,但共享内存(Redis)、文件锁(flock)、数据库连接池、临时文件路径冲突,都是并发下容易翻车的点。
- 上传文件别直接用
$_FILES['file']['tmp_name']做后续处理,先move_uploaded_file()到明确路径,否则高并发时 tmp 目录可能被清理或覆盖 - 秒杀类逻辑必须用原子操作:Redis 的
DECR+GET组合,或数据库行锁(SELECT ... FOR UPDATE),避免超卖 - 日志别用
error_log()写文件,尤其在容器环境,推荐用 Monolog 写到 stdout 或集中式日志系统(如 ELK),否则日志分散难排查
真正卡住人的往往不是语法,而是当缓存雪崩发生时你是否记得清 redis->del() 和 redis->flushDB() 的影响范围,或是当慢查询告警响起时,你第一反应是看 EXPLAIN 还是重启 MySQL。
