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 = ""; // 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(); ?>