PHP后端开发需掌握Web服务器配置(如Nginx+php-fpm)、安全数据库操作(预处理防注入、ORM避N+1)、接口防护(CSRF、文件上传校验)、部署排查(Composer依赖、日志与内存溢出)等实战能力。

PHP 后端开发不是只写 echo "Hello",真实项目里你得能搭服务、连数据库、防攻击、跑得稳、改得快。下面按实际干活的顺序列关键点,不罗列名词,只说哪些必须会、为什么绕不开、哪里容易翻车。
Web 服务器与 PHP 运行模式
PHP 不是独立运行的,它依赖 Web 服务器调度。你得清楚自己用的是哪种 SAPI 模式,因为它直接影响请求生命周期、全局变量行为、扩展加载方式。
-
php-fpm是现代生产环境事实标准:支持进程管理、平滑重启、慢日志分析;别用mod_php(Apache 模块),它已淘汰,内存泄漏风险高、无法隔离用户进程 - Nginx +
php-fpm组合里,fastcgi_pass地址写错(比如写成127.0.0.1:9000但php-fpm实际监听/run/php/php8.2-fpm.sock)会导致 502,查nginx error.log和php-fpm.log才能定位 - CLI 模式(如跑队列、定时任务)和 Web 模式共享同一份
php.ini,但memory_limit、max_execution_time等配置常需区分调整——CLI 下建议设为-1或足够大,否则php artisan queue:work可能被中断
数据库操作与 ORM 实践
原生 mysqli 或 PDO 足够简单场景,但中大型项目几乎必用 ORM。重点不在“会不会用”,而在“怎么避免踩坑”。
- 预处理语句必须用:哪怕参数来自
$_GET,也得走$pdo->prepare("SELECT * FROM users WHERE id = ?"),直接拼接字符串("WHERE id = ".$_GET['id'])等于敞开 SQL 注入大门 - Laravel Eloquent 的
N+1问题高频发生:循环查关联模型时没用with()预加载,100 条记录触发 101 次查询;用DB::enableQueryLog()或 Laravel Telescope 快速验证 - 事务不是套个
beginTransaction()就完事:InnoDB 表才支持事务,MyISAM 不行;且SELECT ... FOR UPDATE在长事务里易锁表,高并发下单库存扣减要用UPDATE stock SET num = num - 1 WHERE id = ? AND num >= 1+ 检查affected_rows
接口安全与常见防护手段
PHP 默认不帮你防攻击,很多漏洞是“没关开关”或“默认配置太松”导致的,不是代码写错。
立即学习“PHP免费学习笔记(深入)”;
-
register_globals = Off、magic_quotes_gpc = Off(PHP 5.4+ 已移除)、display_errors = Off(生产环境必须关,错误信息泄露路径、数据库结构)——这些在php.ini里确认过才算数 - 上传文件不能只靠前端
accept或后缀名判断:$_FILES['file']['type']可伪造,必须用finfo_file()检查 MIME 类型,再白名单校验;保存路径别拼用户输入,用uniqid().'.pdf'生成文件名,存到非 Web 可访问目录(如/var/uploads/) - CSRF 防护要前后端配合:Laravel 自动注入
@csrf,但 API 接口(尤其 Vue/React 单页应用调用)得手动在请求头带X-XSRF-TOKEN,且后端需校验session中的 token 是否匹配
部署与线上问题排查
本地跑通 ≠ 线上可用。很多问题只在特定环境暴露,得有快速定位能力。
- Composer 依赖冲突常见于
composer install失败:先清缓存composer clear-cache,再用composer why-not vendor/package:version查谁在阻止安装;生产环境务必加--no-dev --optimize-autoloader - 500 错误不报具体信息?检查
error_log路径是否可写(ls -l /var/log/php/),以及log_errors = On是否开启;有时是 SELinux 拦截了 Apache 写日志,用ausearch -m avc -ts recent查 - 内存溢出(
Fatal error: Allowed memory size of XXX bytes exhausted)往往不是代码真要那么多内存,而是循环引用未释放(如对象 A 持有 B,B 又持有 A),或大数组没unset();用xdebug的memory_get_usage()打点排查
PHP 后端的复杂性不在语法多难,而在于每个环节都得有人盯着:服务器配置、数据库索引、缓存一致性、日志轮转、SSL 证书更新……写完功能只是开始,让系统在凌晨三点不出问题,才是真正的技术落点。











