必须从系统层、服务层、php运行时三层同步优化:清缓存用drop_caches、停服务按nginx→php74→mysql→redis顺序并kill残留进程、php中用$data=null+gc_collect_cycles()替代unset()、opcache jit缓冲调至64m~128m、强制配置2gb swap保编译。

1GB内存的VPS跑PHP 7.4,光靠unset()或重启PHP-FPM根本压不住内存增长——必须从系统层、服务层、PHP运行时三层同步动手,否则每次请求都在累积未释放的opcode和FPM子进程。
为什么free -h看到的内存不降
常见现象:停掉MySQL、Redis、FTP后free -h显示可用内存仍没涨。这不是假象,而是Linux内核把空闲内存用作buffers/cache(文件缓存),这部分会自动释放给应用,但free命令默认不计入“可用”栏。真正卡住的是PHP-FPM子进程残留和OPcache未清理的共享内存块。
实操建议:
- 用
ps aux --sort=-%mem | head -5查真实吃内存的进程,重点盯php-fpm和mysqld - 执行
echo 3 > /proc/sys/vm/drop_caches可手动清空页缓存(仅调试用,不影响业务) - 确认OPcache是否真在用:
php -i | grep -E "(opcache.enable|opcache.memory_consumption)",若opcache.enable=0却开着opcache.jit,反而增加开销
停服务必须带版本号,且顺序不能错
宝塔面板里点“停止”看似简单,但bt stop php会报错,bt stop php74才有效;更关键的是依赖关系:Nginx依赖PHP处理动态请求,先停PHP再停Nginx会导致Nginx日志刷满502 Bad Gateway,虽不中断停服,但会掩盖真实内存释放效果。
安全停服顺序和命令:
- 先停Web服务器:
bt stop nginx(若用Apache则bt stop httpd) - 再停对应PHP版本:
bt stop php74(别写php或php-fpm) - 接着停数据库:
bt stop mysql(确认没装MariaDB残留,用systemctl list-units --type=service | grep -i sql扫一遍) - 最后停缓存/FTP:
bt stop redis、bt stop pure-ftp - 停完立刻执行
killall -9 php-fpm或pkill -f "php-fpm.*www"——面板显示“已停止”不代表子进程退出
PHP运行时内存要主动切段清理
unset($bigArray)在PHP 7.4里大概率不立竿见影,尤其当变量被多个引用持有,或处于循环中反复生成时。GC不会每轮都触发,而memory_get_usage(false)只反映当前zval占用,true才看系统分配总量,参数用错就误判。
有效做法:
- 大数组处理完立刻
$data = null(比unset()更彻底切断引用) - 批量操作数据库结果集时,不用
fetchAll()全拉进内存,改用fetch()逐行处理 - 明确知道某段逻辑结束后需强回收,跟
gc_collect_cycles()一起用:unset($obj); gc_collect_cycles(); - 检查
php.ini里opcache.jit_buffer_size是否过大(如设了256M),低配VPS建议调到64M或128M,JIT缓冲占的是常驻共享内存
Swap不是可选项,是编译和重启的保命线
1GB内存装宝塔+PHP 7.4,连phpize编译fileinfo扩展都会OOM。没有Swap,make过程直接被内核杀掉,错误信息是Killed而非具体报错。
创建可靠Swap的关键点:
- 路径必须是根目录:
dd if=/dev/zero of=/swapfile bs=1M count=2048(不能放/www或/tmp) - 权限必须
600:chmod 600 /swapfile,否则swapon失败 - 启用后验证:
swapon -s看是否列出/swapfile,free -h确认Swap行total为2.0G - 加到
/etc/fstab防重启丢失:/swapfile none swap sw 0 0
最易忽略的是:OPcache预加载(opcache.preload)和JIT在启动时就锁定大量内存,哪怕你停了PHP-FPM,这些共享内存块也不会自动释放——必须systemctl restart php74-fpm(不是reload),否则改了opcache.memory_consumption也无效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











