?最近被hosting vps主機的速度給困擾了,干脆放下手中的活 測試下
test.php放在網站根目錄即可
代碼如下:
<?php
/*** 最終版服務器性能測試工具* 測試項目:CPU運算性能、內存讀寫速度、硬盤IO速度、網絡下載速度*/// 配置參數(已優化以控制總測試時間在100秒內)
$config = ['cpu_test_duration' => 3, // CPU測試持續秒數'mem_test_size' => 32, // 內存測試大小(MB)'disk_test_size' => 50, // 硬盤測試大小(MB)'disk_block_size' => 4, // 硬盤測試塊大小(KB)'net_test_size_mb' => 50, // 網絡測試下載大小(MB)'net_test_url' => 'https://speed.hetzner.de/100MB.bin', // 網絡測試文件'tmp_file' => __DIR__ . '/benchmark_tempfile.tmp' // 臨時文件路徑
];// 工具函數:格式化大小顯示
function formatSize($bytes) {$units = ['B', 'KB', 'MB', 'GB', 'TB'];$unit = 0;while ($bytes >= 1024 && $unit < 4) {$bytes /= 1024;$unit++;}return number_format($bytes, 2) . ' ' . $units[$unit];
}// 工具函數:格式化時間顯示
function formatTime($seconds) {if ($seconds < 1) return number_format($seconds * 1000, 1) . ' ms';return number_format($seconds, 3) . ' s';
}// 工具函數:輸出分隔線
function printSeparator() {echo "----------------------------------------\n";
}// 工具函數:確保在瀏覽器和CLI中都能正確換行
function eol() {return (PHP_SAPI === 'cli') ? "\n" : "<br>\n";
}// 記錄總開始時間
$start_time = microtime(true);// 標題顯示
echo eol();
printSeparator();
echo " 服務器性能測試結果 " . eol();
printSeparator();
echo "測試時間:" . date('Y-m-d H:i:s') . eol() . eol();// 1. CPU性能測試(計算質數)
echo "[1/4] CPU性能測試中...";
$startTime = microtime(true);
$primeCount = 0;
$currentNumber = 2;while (microtime(true) - $startTime < $config['cpu_test_duration']) {$isPrime = true;for ($i = 2; $i <= sqrt($currentNumber); $i++) {if ($currentNumber % $i == 0) {$isPrime = false;break;}}if ($isPrime) $primeCount++;$currentNumber++;
}$cpuTime = microtime(true) - $startTime;
$cpuResult = ['duration' => $cpuTime,'prime_count' => $primeCount,'per_second' => $primeCount / $cpuTime
];
echo "完成" . eol();// 2. 內存性能測試
echo "[2/4] 內存性能測試中...";
$memSize = $config['mem_test_size'] * 1024 * 1024; // 轉換為字節
$blockSize = 4096;
$blocks = $memSize / $blockSize;
$data = [];// 內存寫入測試
$startTime = microtime(true);
for ($i = 0; $i < $blocks; $i++) {$data[] = str_repeat(chr(rand(0, 255)), $blockSize);
}
$writeTime = microtime(true) - $startTime;// 內存讀取測試
$startTime = microtime(true);
$checksum = 0;
for ($i = 0; $i < $blocks; $i++) {$checksum += crc32($data[$i]);
}
$readTime = microtime(true) - $startTime;// 釋放內存
unset($data);$memResult = ['write_speed' => $config['mem_test_size'] / $writeTime,'read_speed' => $config['mem_test_size'] / $readTime
];
echo "完成" . eol();// 3. 硬盤IO測試
echo "[3/4] 硬盤IO測試中...";
$testFile = $config['tmp_file'];
$diskSize = $config['disk_test_size'] * 1024 * 1024;
$blockSize = $config['disk_block_size'] * 1024;
$totalBlocks = $diskSize / $blockSize;
$randomData = random_bytes($blockSize);// 寫入測試
$startTime = microtime(true);
$file = fopen($testFile, 'wb');
for ($i = 0; $i < $totalBlocks; $i++) {fwrite($file, $randomData);
}
fclose($file);
$writeTime = microtime(true) - $startTime;// 讀取測試
$startTime = microtime(true);
$file = fopen($testFile, 'rb');
for ($i = 0; $i < $totalBlocks; $i++) {fread($file, $blockSize);
}
fclose($file);
$readTime = microtime(true) - $startTime;// 刪除測試文件
@unlink($testFile);$diskResult = ['write_speed' => $config['disk_test_size'] / $writeTime,'read_speed' => $config['disk_test_size'] / $readTime,'write_iops' => $totalBlocks / $writeTime,'read_iops' => $totalBlocks / $readTime
];
echo "完成" . eol();// 4. 網絡速度測試(下載測試)
echo "[4/4] 網絡速度測試中...";
$testUrl = $config['net_test_url'];
$startTime = microtime(true);
$ch = curl_init($testUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOPROGRESS, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60); // 最大超時60秒
$content = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$downloadSize = min(curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD) / 1024 / 1024, $config['net_test_size_mb']); // MB
$downloadTime = microtime(true) - $startTime;
curl_close($ch);$netResult = ['speed' => 0,'size' => $downloadSize,'time' => $downloadTime
];if ($httpCode == 200 && $downloadSize > 0 && $downloadTime > 0) {$netResult['speed'] = $downloadSize / $downloadTime;
}
echo "完成" . eol() . eol();// 最終匯總報告
printSeparator();
echo " 測試結果匯總 " . eol();
printSeparator();
echo "1. CPU性能:" . number_format($cpuResult['per_second'], 1) . " 質數/秒" . eol();
echo " 測試時間:" . formatTime($cpuResult['duration']) . eol() . eol();
echo "2. 內存性能:" . eol();
echo " 寫入速度:" . number_format($memResult['write_speed'], 2) . " MB/s" . eol();
echo " 讀取速度:" . number_format($memResult['read_speed'], 2) . " MB/s" . eol() . eol();
echo "3. 硬盤IO:" . eol();
echo " 寫入速度:" . number_format($diskResult['write_speed'], 2) . " MB/s(IOPS: " . number_format($diskResult['write_iops'], 0) . ")" . eol();
echo " 讀取速度:" . number_format($diskResult['read_speed'], 2) . " MB/s(IOPS: " . number_format($diskResult['read_iops'], 0) . ")" . eol() . eol();
echo "4. 網絡速度:" . eol();
echo " 下載速度:" . number_format($netResult['speed'], 2) . " MB/s(" . number_format($netResult['speed'] * 8, 2) . " Mbps)" . eol() . eol();
echo "測試總耗時:" . formatTime(microtime(true) - $start_time) . eol();
echo "測試完成時間:" . date('Y-m-d H:i:s') . eol() . eol();
?>
不得不服氣阿里云,在國內一直是遙遙領先的存在!?