ZJMF 3.9.22 后台卡顿问题排查报告
- 问题现象
系统升级到 3.9.22 后,后台实例相关页面出现明显卡顿,自建授权站后问题没有改善。授权站网络测试显示响应正常,HTTP 返回 200,总耗时约 17ms,因此初步排除授权接口网络延迟导致的卡顿。当前 PHP 版本为 PHP 7.2.24,运行 PHP-FPM。系统加载了 ionCube Loader,同时加载了 /usr/lib64/php/modules/idcsmart.so。实际 PHP 模块名显示为 idcxmart,但配置项仍然使用 idcsmart.url。/etc/php.d/40-idcsmart.ini 内容为:
extension=idcsmart.so
idcsmart.url=隐私保护
- 故障定位过程
开启 PHP-FPM slowlog 后,发现多个 www-nginx worker 同时卡在:
sleep() /home/zjmf/dashboard/www/app/controller/CloudController.php:80
调用栈显示该 sleep 出现在 CloudController 实例化阶段,即 ThinkPHP 容器创建 CloudController 对象时触发。因此该卡顿不是数据库查询慢,也不是授权站 HTTP 请求慢,而是控制器构造函数中存在显式 sleep。解密文件显示,CloudController::__construct() 末尾存在以下逻辑:
if (!function_exists("phpinfo")) {
$sleep = mt_rand(5, 10);
sleep($sleep);
} else {
ob_start();
phpinfo(8);
$data = ob_get_contents();
ob_end_clean();
if (strpos($data, "idxsmart") !== false) {
$sleep = mt_rand(5, 15);
sleep($sleep);
}
}
系统此前安装命令将 /etc/php.ini 中的 disable_functions 改为 phpinfo,导致 function_exists("phpinfo") 返回 false。因此每次访问实例相关接口时,都会随机 sleep 5-10 秒。由于后台实例列表、前台 VNC 等功能会调用 CloudController,所以表现为后台卡顿和 VNC 不可用。同时还检测了 idxsmart 但是幸好开心版扩展实际上不叫这个,因此未命中。
- 验证结果
将 phpinfo 从 disable_functions 中移除后,function_exists("phpinfo") 返回 true。进一步测试 phpinfo(8) 输出内容:
strpos($data, "idxsmart") 返回 false
strpos($data, "idcxmart") 返回非 false
也就是说,当前模块名为 idcxmart,而代码检测的是 idxsmart,因此不会触发第二个 sleep 分支。修改后后台卡顿消失。根因是 3.9.22 版本 CloudController 中新增了基于 phpinfo 状态的延迟检测逻辑,而安装命令又要求禁用 phpinfo,二者形成冲突。禁用 phpinfo 后,CloudController 每次实例化都会触发随机 sleep,从而占用 PHP-FPM worker 并造成后台和 VNC 请求明显变慢。
- 处理方案
保留 idcsmart.so 和 idcsmart.url 配置不变,仅从 /etc/php.ini 的 disable_functions 中移除 phpinfo,并重启 PHP-FPM。不会的可以直接把处理方案发给AI,让AI告诉你怎么把 phpinfo 从魔方云主控的 php.ini 中的 disable_functions 移除即可。
- 对作者
我有Easytoyou PHP7.2的解密会员,你可以回复本issue提供一个临时邮箱,我会把账号密码给你,还剩9天时间无限文件,足够你完整解密魔方云3.9.22的所有文件,并删除这些恶意的sleep逻辑。非常感谢你的项目,但是也请下次谨慎一点,希望这个报告能给遇到一样问题的人,和作者,一点思路和帮助,也希望作者以后可以先解密所有文件,再发布开心版,并一并发布解密后的源码托管在 GitHub 替代安装命令防止安装到存在恶意后门的官方版,我愿意个人赞助 Easytoyou 等网站的解密会员。
没有更多内容了