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.

200px-PHP-logo.svgDas 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);

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.