1. 调整PHP内存配置
修改php.ini
中的memory_limit
参数(如设置为256M
或512M
),避免脚本因内存不足报错;启用OPcache
扩展(取消zend_extension=opcache.so
注释,设置opcache.enable=1
),缓存PHP脚本编译后的字节码,减少重复编译的开销,显著提升脚本执行效率。
2. 优化ThinkPHP缓存策略
开启ThinkPHP内置的缓存机制:使用文件缓存
(cache
配置项设置type=file
)、Redis
(type=redis
)或Memcached
(type=memcached
)存储频繁访问的数据库查询结果、路由信息;执行php think optimize:route
命令生成路由缓存,减少路由注册时的资源消耗;对于不常变动的静态数据(如配置项),使用Cache
门面手动缓存(如Cache::set('config', $config, 3600)
),避免重复查询。
3. 数据库访问优化
为数据库表的查询字段(如id
、name
)添加索引,提升SELECT
、JOIN
等查询效率;避免在循环中执行SQL查询(如遍历数组时查询数据库),改用whereIn
、batch
等方法批量处理;使用select
方法指定所需字段(如Db::table('user')->field('id,name')->select()
),避免select *
加载不必要的数据;开启数据库查询缓存(如MySQL的query_cache_type
),减少重复查询的执行时间。
4. 代码层面内存管控
使用单例模式管理频繁创建的对象(如数据库连接、配置对象),减少对象实例化的开销;及时释放不再使用的变量(如unset($data)
),清除内存中的无用数据;处理大型数据集时使用生成器(yield
),避免一次性加载全部数据到内存(如function readLargeFile() { while ($line = fgets($file)) { yield $line; } }
);在长时间运行的脚本中,手动调用gc_collect_cycles()
触发垃圾回收,释放循环引用的内存。
5. 服务器与PHP-FPM调优
关闭SELinux(setenforce 0
)或设置为disabled
,减少安全机制带来的系统开销;调整文件描述符限制(修改/etc/security/limits.conf
,添加* soft nofile 65535
、* hard nofile 65535
),允许更多并发连接;使用Nginx或Apache作为Web服务器(替代传统的mod_php
),并启用gzip
压缩(gzip on; gzip_types text/plain text/css application/json
),减少网络传输的数据量;优化PHP-FPM配置(/etc/php/8.0/fpm/pool.d/www.conf
):根据服务器内存设置pm.max_children
(如pm.max_children = 50
,每个子进程约占用100M
内存,则总内存消耗约5G
),调整pm.start_servers
、pm.min_spare_servers
、pm.max_spare_servers
(如分别为10
、5
、20
),平衡进程创建与销毁的开销。
6. 监控与持续优化
使用top
、htop
命令实时查看系统内存使用情况,定位占用内存高的进程;通过vmstat 1
监控内存、交换分区(swap)的使用情况(若si
、so
值持续较高,说明内存不足);使用ThinkPHP的Debug
工具(app_debug=true
)或第三方性能分析工具(如Blackfire、New Relic),分析脚本的内存消耗热点(如某段代码占用了大量内存),针对性优化;定期清理过期缓存(如runtime/cache
目录)、日志文件(runtime/log
目录),释放服务器存储空间。