99 lines
3.1 KiB
PHP
99 lines
3.1 KiB
PHP
<?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();
|
|
?>
|