Ich hatte vor kurzem wieder das Problem, dass ich mehrere PHP-generierte Dateien auf eine Webseite laden musste.
Im vergleich zu statischen Dateien war dies extrem langsam. Bei nur geringer Serverlast.
Das Problem:
Es darf nur eine offene PHP-Session gleichzeitig geben. Weitere Anfragen mit der gleichen Session werden
nur nacheinander abgearbeitet.
Lösung:
Man sollte, sobald man alle Session-Variablen in $_SESSION gespeichert hat, die Session schließen.
Das geht mit session_write_close. Unten ein Beispiel zur Veranschaulichung.
Demo:
mit einem sehr späten Session-Close: https://weltmeyer.net/wp/phpSamples/SessionBlock/
mit frühem Session-Close: https://weltmeyer.net/wp/phpSamples/SessionBlock/?closeEarly
Der Unterschied ist klar bemerkbar!
<?PHP session_start(); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <a href="?closeEarly">mit frühem session_write_close()_ </a><br > <a href="?">ohne frühes session_write_close()_ </a><br > <?php $tileSize = 50; $cols = 10; $destroy_early=0; if (isset($_GET['closeEarly'])) $destroy_early=1; for ($i = 0; $i < $cols; $i++) { for ($ix = 0; $ix < $cols; $ix++) { $rnd = microtime() . '-' . rand(0, 9999); printf('<img src="img.php?ts=%1$d&rnd=%2$s&de=%3$d" style="width:%1$dpx;height:%1$dpx;margin:0px;padding:0px;">', $tileSize,$rnd,$destroy_early); } echo("<br />"); } ?> </body> </html>
<?php session_start(); $imgsize = $_GET['ts']; $im = imagecreate($imgsize, $imgsize); if (isset($_GET['de']) && $_GET['de'] == 1) session_write_close(); $background_color = ImageColorAllocate($im, rand(0, 255), rand(0, 255), rand(0, 255)); header("Expires: Mon, 26 Jul 1990 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Content-Type: image/png"); imagepng($im); usleep(100000);