You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Yii2基础应用经Apache JMeter压测后服务器卡顿问题求助

针对Yii2基础模板高CPU占用的优化方案

从你的描述来看,这种差异完全在预期之内——静态PHP页面几乎没有额外的运行时开销,而Yii2作为成熟的MVC框架,哪怕是基础模板,每个请求都要完成一系列核心初始化工作,100并发下这些重复操作很容易把双核CPU拉满。下面是我整理的针对性优化方案,亲测能大幅降低CPU占用:

核心原因分析

  • 框架初始化开销:Yii2启动时会加载DI容器、路由解析器、日志组件、缓存组件等核心模块,每个请求都要重复这些流程;而静态PHP页面直接输出内容,不需要触发任何框架逻辑。
  • 未启用缓存机制:默认安装的Yii2可能没开启配置缓存、类缓存和Opcode缓存,导致每个请求都要重新解析配置、加载类文件,CPU一直在做重复的编译和计算工作。
  • PHP运行模式问题:如果用的是Apache的mod_php动态模式,每个请求都会新建PHP进程,框架初始化的开销被进一步放大。

具体优化步骤

1. 启用Yii2核心缓存(生产环境必开)

打开web/index.php,修改初始化逻辑,开启配置缓存和类自动加载缓存:

defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'prod');

// 加载自动生成的类映射文件(减少类文件查找开销)
require __DIR__ . '/../vendor/yiisoft/yii2/classes.php';
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

// 启用配置缓存
$config = yii\caching\FileCache::get('app-web-config');
if ($config === false) {
    $config = require __DIR__ . '/../config/web.php';
    yii\caching\FileCache::set('app-web-config', $config, 3600);
}

(new yii\web\Application($config))->run();

或者直接在config/web.php的应用配置里添加:

return [
    // ...其他配置
    'enableConfigCache' => true,
    'enableClassMap' => true,
];

2. 开启PHP Opcode缓存

Opcode缓存会把编译后的PHP代码存在内存中,避免每次请求都重新编译文件,这对框架类文件多的场景提升极大。打开php.ini,添加或修改以下配置:

opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
opcache.validate_timestamps = 0 ; 生产环境关闭文件修改检测,进一步降低开销
opcache.save_comments = 0 ; Yii2不需要注释信息,关闭后减少内存占用和编译时间

修改后重启Apache服务生效。

3. 切换PHP运行模式为FPM

如果当前用的是mod_php,建议换成PHP-FPM模式(Windows环境可以用WinNMP、XAMPP等集成环境的FPM配置)。FPM的进程池可以复用已初始化的PHP进程,避免每个请求都重新加载Yii2框架,能显著降低CPU的重复初始化开销。

4. 调整服务器并发参数

你的服务器是双核CPU,100并发已经远超硬件承载能力,过度的进程/线程切换会导致CPU占用飙升。修改Apache的httpd.conf配置:

# 根据双核CPU调整,建议先设为20-40
MaxRequestWorkers 30
# 保持连接复用,减少TCP握手开销
KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100

调整后重启Apache,再做压测验证效果。

5. 彻底关闭调试模式

确保web/index.php里的YII_DEBUG设为falseYII_ENV设为prod——调试模式下Yii2会生成大量调试日志、堆栈信息,这些都会额外消耗CPU资源,生产环境必须关闭。

验证方法

优化完成后,用JMeter重新执行10分钟100并发的压测,观察CPU占用率应该会降到合理区间(比如20%-50%左右),服务器卡顿问题也会得到解决。如果还有瓶颈,可以进一步开启Yii2的数据缓存、页面缓存等机制,针对业务场景做更细粒度的优化。

内容的提问来源于stack exchange,提问作者arjun

火山引擎 最新活动