Speedtest-X是一个基于PHP和JavaScript的开源网络测速工具,它能够帮助用户测量网络的上传、下载速度、延迟和抖动等关键指标。与商业版的Ookla Speedtest不同,Speedtest-X允许用户自行搭建服务器,特别适合企业内网、IDC机房或特殊网络环境下的带宽测试需求。
在实际部署过程中,我发现原始版本存在几个影响使用体验的问题:
这些问题的存在使得Speedtest-X在实际运维工作中使用起来不够顺手。作为经常需要测试不同网络环境质量的运维人员,我决定对源代码进行针对性优化,使其更符合生产环境的使用需求。
原始版本的Speedtest-X使用SleekDB作为轻量级数据库存储测速结果,但存在一个严重缺陷:它没有实现历史记录的保存功能,每次新测试都会覆盖之前的记录。这对于需要对比多次测试结果的场景非常不友好。
解决方案是修改report.php文件,主要做了以下改进:
MAX_LOG_COUNT参数限制最大保存记录数php复制// 修改后的数据存储逻辑
$reportData = [
"key" => sha1(filter_var($_POST['key'], FILTER_SANITIZE_STRING)),
"ip" => maskLastSegment(filter_var($_POST['ip'], FILTER_SANITIZE_STRING)),
// 其他字段保持不变...
];
$results = $store->insert($reportData);
$MAX_LOG_COUNT = defined('MAX_LOG_COUNT') ? MAX_LOG_COUNT : 100;
if ($results['_id'] > $MAX_LOG_COUNT) {
$store->where('_id', '=', $results['_id'] - $MAX_LOG_COUNT)->delete();
}
提示:
MAX_LOG_COUNT可以在config.php中自定义设置,建议根据服务器存储空间和实际需求调整。对于频繁测试的环境,可以适当增大这个值。
原始的前端页面(index.html)在测试完成后会自动清空所有结果,这导致用户无法方便地记录测试数据。通过分析前端JavaScript代码,我发现问题出在onend回调函数的处理逻辑上。
优化后的方案:
javascript复制s.onend=function(aborted){
I("startStopBtn").className="";
if(aborted){
// 只有手动中止时才清空UI
initUI();
return;
}
// 正常结束时保留结果并提交数据
var testData = this.lastTestData;
if(!testData) return;
// 构建并提交测试数据
var xhr = new XMLHttpRequest();
xhr.timeout = 3000;
xhr.ontimeout = function(){ console.log('上报超时'); };
xhr.onerror = function(e){ console.log('上报失败:', e); };
xhr.open('POST', url_report, true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(params);
}
默认的Speedtest-X配置中,上传和下载测试时间较短(通常15秒左右),这在某些需要更精确测量的场景下可能不够。通过修改speedtest_worker.js中的配置参数,我们可以自定义测试时长。
关键参数说明:
time_ul_max:上传测试最大时长(秒)time_dl_max:下载测试最大时长(秒)time_auto:是否自动判断测试时长count_ping:Ping测试次数javascript复制var settings = {
test_order: "IP_D_U",
time_ul_max: 60, // 上传测试60秒
time_dl_max: 60, // 下载测试60秒
time_auto: false, // 禁用自动时长判断
count_ping: 30, // Ping测试30次
// 其他配置保持不变...
};
在开始优化前,需要先完成Speedtest-X的基础部署。我使用的是宝塔面板+LNMP环境,具体步骤如下:
安装宝塔面板(如已安装可跳过):
bash复制wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
通过宝塔创建网站:
部署Speedtest-X:
bash复制cd /www/wwwroot/your_site
git clone https://github.com/BadApple9/speedtest-x.git .
chown -R www:www .
定位文件:
code复制/www/wwwroot/speedtest-x-master/backend/report.php
备份原始文件:
bash复制cp report.php report.php.bak
应用修改:
验证修改:
backend/SleekDB/speedlogs/data/目录修改index.html:
onend事件处理逻辑测试不同场景:
定位speedtest_worker.js文件:
code复制/www/wwwroot/speedtest-x-master/speedtest_worker.js
修改关键参数:
time_ul_max和time_dl_maxcount_ping获取更准确的延迟数据time_auto选项参数调优建议:
问题1:测试后没有生成新的JSON文件
backend/目录权限:确保PHP进程有写入权限/www/wwwlogs/php_error.log问题2:记录数超过限制但旧数据未被删除
MAX_LOG_COUNT已正确定义问题3:测试完成后结果仍然被清空
aborted参数是否正确传递onend事件处理逻辑没有被覆盖问题4:数据提交失败
url_report路径是否正确问题5:测试结果波动较大
问题6:延迟测试不准确
count_ping值对于高频使用的Speedtest-X实例,可以考虑以下优化:
更换数据库引擎:
添加定期清理任务:
bash复制# 每天凌晨清理30天前的数据
0 0 * * * php /path/to/clean_script.php
数据压缩存储:
添加访问控制:
防止滥用:
数据加密:
数据可视化:
告警集成:
API支持:
经过上述优化后,Speedtest-X的实用性和可靠性得到了显著提升。在实际使用中,这些改进使得网络质量监测工作更加高效和准确。特别是在需要长期跟踪网络性能变化的场景下,历史数据的保留功能显得尤为重要。