Files

99 lines
3.1 KiB
PHP
Raw Permalink Normal View History

2026-02-04 08:38:46 +01:00
<?php
/**
* speed.php - All-in-One Speedtest Endpoint
*
* FÜHRE DIESES SKRIPT EINMALIG PER CLI AUS, UM DIE ZUFALLSDATEN-DATEI ZU GENERIEREN:
* > php /pfad/zum/script/speed.php
*/
// --- KONFIGURATION ---
define('DATA_FILE_NAME', 'random_data.php');
// KORREKTUR: Wir definieren den VOLLSTÄNDIGEN Pfad zur Datendatei,
// basierend auf dem Speicherort dieses Skripts. Das ist jetzt idiotensicher.
define('DATA_FILE_PATH', __DIR__ . '/' . DATA_FILE_NAME);
define('NUM_CHUNKS', 10);
define('CHUNK_SIZE_KB', 256);
// --- KONTEXT-WEICHE: CLI oder WEB? ---
if (php_sapi_name() === 'cli') {
// --- GENERATOR-MODUS ---
echo "Führe im CLI-Modus aus. Generiere '" . DATA_FILE_PATH . "'...\n";
$chunk_size_bytes = CHUNK_SIZE_KB * 1024;
$chunks_array = [];
for ($i = 0; $i < NUM_CHUNKS; $i++) {
echo "Generiere Block " . ($i + 1) . "/" . NUM_CHUNKS . "...\n";
$random_data = random_bytes($chunk_size_bytes);
$chunks_array[] = base64_encode($random_data);
}
$file_content = "<?php\n// " . DATA_FILE_NAME . "\n// Generiert am: " . date('Y-m-d H:i:s') . "\n\n";
$file_content .= "\$RANDOM_CHUNKS = [\n";
foreach ($chunks_array as $chunk) {
$file_content .= " '" . $chunk . "',\n";
}
$file_content .= "];\n?>";
// KORREKTUR: Schreibe in den absoluten Pfad.
if (file_put_contents(DATA_FILE_PATH, $file_content)) {
echo "\nERFOLG: '" . DATA_FILE_PATH . "' wurde erfolgreich erstellt.\n";
} else {
echo "\nFEHLER: Konnte '" . DATA_FILE_PATH . "' nicht schreiben.\n";
}
exit(0);
}
// --- WEB-MODUS ---
// Security & Caching Headers
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Pragma: no-cache");
// Logik-Weiche: GET für Download, POST für Upload
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// --- UPLOAD LOGIK ---
$input = file_get_contents('php://input');
$received_bytes = strlen($input);
header('Content-Type: text/plain');
echo $received_bytes;
exit();
}
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// --- DOWNLOAD LOGIK ---
if (!file_exists(DATA_FILE_PATH)) {
http_response_code(503); // Service Unavailable
echo "FEHLER: Bitte das Skript zuerst einmal per CLI ausführen um Zufallsdaten zu erzeugen.";
exit();
}
require_once DATA_FILE_PATH;
$chunks_to_send = isset($_GET['chunks']) ? (int)$_GET['chunks'] : 1;
$chunk_size_bytes = CHUNK_SIZE_KB * 1024;
$total_size_bytes = $chunks_to_send * $chunk_size_bytes;
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $total_size_bytes);
for ($i = 0; $i < $chunks_to_send; $i++) {
$random_chunk_base64 = $RANDOM_CHUNKS[array_rand($RANDOM_CHUNKS)];
echo base64_decode($random_chunk_base64);
flush();
}
exit();
}
if ($_SERVER['REQUEST_METHOD'] === 'HEAD') {
// Der Jitter-Test sendet HEAD. Wir antworten einfach mit 200 OK.
// Der Webserver sorgt dafür, dass kein Body gesendet wird.
exit();
}
// Fallback für andere HTTP-Methoden
http_response_code(405);
echo "Method Not Allowed";
exit();
?>