1gb内存服务器运行php7.4需禁用opcache.preload、精简opcache缓存范围(如设opcache.restrict_api和max_accelerated_files)、停用fileinfo/xmlrpc扩展、调低fpm为dynamic模式并限制max_children≤8,避免oom。

1GB 内存的服务器跑 PHP 7.4,不是“内存用得太多”,而是默认配置和扩展编译流程根本没为低配设计——memory_limit 调小只是掩耳盗铃,真正吃内存的是 OPcache 预加载、fileinfo 编译、FPM worker 进程堆叠,以及未关闭的调试模块。
关掉预加载(preloading)避免启动即爆内存
PHP 7.4 的 opcache.preload 是双刃剑:它让框架类常驻内存,但也意味着 FPM master 进程一启动就加载几百 MB 的字节码。低配机上这个动作大概率触发 OOM killer 杀死 php-fpm。
- 确认是否启用:执行
php -i | grep opcache.preload,若输出opcache.preload => /www/server/php/74/etc/preload.php类路径,说明已开 - 临时禁用:注释掉
php.ini中的opcache.preload行,或设为opcache.preload = "" - 不要删 preload 文件本身——留着,但不加载;后续有资源再启用
- 重启服务:
service php-fpm-74 restart,再用free -h观察 RSS 是否下降 200MB+
精简 OPcache 缓存范围,跳过无用文件
默认 opcache.restrict_api 和 opcache.file_cache_only 都是关的,OPcache 会扫描并缓存所有被 include/require 的 PHP 文件,包括 Composer 的 vendor、测试文件、备份脚本等——这些在生产环境根本不会执行,却占着内存。
- 先定位真实业务路径:比如网站根目录是
/www/wwwroot/myapp,那就只缓存它下面的.php文件 - 在
php.ini加入:opcache.file_cache = /tmp/opcache-74(确保/tmp有写权限) - 加白名单过滤:
opcache.restrict_api = /www/wwwroot/myapp,这样phpinfo()或调试脚本不在该路径下就自动跳过缓存 - 调低上限:
opcache.max_accelerated_files = 2000(默认 10000),够中小型项目用,内存占用直降约 40MB
停用非必要扩展,尤其是 fileinfo 和 xmlrpc
fileinfo 扩展在 PHP 7.4 编译时默认启用,但它依赖大量魔数数据库和递归解析逻辑,加载后每个 FPM worker 多占 8–12MB;xmlrpc 同理,几乎没人用却默认开着。
- 查已启用扩展:
php -m | grep -E "(fileinfo|xmlrpc)" - 禁用方法(二选一):
- 编辑
/www/server/php/74/etc/php.ini,找到extension=fileinfo.so和extension=xmlrpc.so行,在前面加;注释掉 - 或删软链接:
rm /www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/fileinfo.so
- 编辑
- 注意:
fileinfo若被宝塔面板依赖(如某些插件检测 MIME 类型),禁用后可能报错,此时应保留但关闭其自动加载——在业务代码中按需dl('fileinfo.so'),而非全局启用
调低 FPM worker 数量,改用动态模式
宝塔默认给 PHP 7.4 配 pm.max_children = 50,每个 worker 平均 RSS 60MB,光子进程就吃掉 3GB 内存——物理内存才 1GB,全靠 swap 硬撑,IO 拉满,响应反而更慢。
- 进宝塔 → PHP 7.4 设置 → “性能调整” → 改为
pm = dynamic - 设参数:
pm.start_servers = 2pm.min_spare_servers = 1pm.max_spare_servers = 3-
pm.max_children = 8(绝对不要超 10)
- 保存后重启:
service php-fpm-74 restart,再用ps aux --sort=-%mem | grep php-fpm看实际进程数是否压到 3–5 个 - 如果并发真高(比如 API 接口),宁可加 Nginx 限流,也不要盲目提
max_children——低配机的瓶颈从来不是并发数,而是单 worker 的内存洁癖
真正的低配优化,不是把东西塞得更满,而是明确知道哪些东西根本不该出现在内存里。预加载、全量 OPcache、fileinfo、静态大 worker 池——它们在 4GB+ 机器上是加速器,在 1GB 上就是内存粉碎机。删一个扩展、关一个配置、少起两个进程,比调 memory_limit 管用十倍。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











