Abfrage einer Session Variable während eines laufendens Prozess
Melzmann
- php
Hallo,
folgende Problemstellung:
Ich habe ein Script, was in einer for schleife läuft und nach jedem durchlauf um 2 Sekunden unterbrochen wird. innerhalb dieses Durchlauf wird ein Wert in eine Session Variable geschrieben:
for ($x; $x< 10; $x++)
{
$_SESSION['fortschritt'] = $x;
sleep(2);
}
Nun möchte ich in einer anderen Datei die entsprechende Session Variable abfragen. Jedoch kann ich dies erst, sobald die for schleife komplett durchglaufen ist und beendet wird (sie läd genauso lange wie der Prozess) .
<?php
session_start();
print_r ($_SESSION['fortschritt']);
?>
normalerweise sollten die beiden prozesse ja unabhängig voneinander auf die Session Variable zugreifen können.
Oder wird da irgendwas im laufenden Prozess blockiert ? Wie arbeitet da PHP bzw. der Apache intern. Könnt ihr mir helfen ?
Grüße,
Melzmann
Oder wird da irgendwas im laufenden Prozess blockiert ? Wie arbeitet da PHP bzw. der Apache intern. Könnt ihr mir helfen ?
php/apache unterstütz aufjeden fall multithreading, ob das per default aktiv ist oder die prozesse hintereinander abgearbeitet werden weiss ich leider nicht
Hello,
Ich habe ein Script, was in einer for schleife läuft und nach jedem durchlauf um 2 Sekunden unterbrochen wird. innerhalb dieses Durchlauf wird ein Wert in eine Session Variable geschrieben:
for ($x; $x< 10; $x++)
{
$_SESSION['fortschritt'] = $x;sleep(2);
}
>
> Nun möchte ich in einer anderen Datei die entsprechende Session Variable abfragen. Jedoch kann ich dies erst, sobald die for schleife komplett durchglaufen ist und beendet wird (sie läd genauso lange wie der Prozess) .
> Oder wird da irgendwas im laufenden Prozess blockiert ? Wie arbeitet da PHP bzw. der Apache intern. Könnt ihr mir helfen ?
Ja, wwenn du session\_start() aufrufst, wird die Session-Datei gesperrt, bis der Sessiondurchlauf beendet wird. Das findet automatisch am Ende des Scriptes statt.
Wenn Du es mittendrin haben möchtest, musst Du <http://www.php.net/manual/de/function.session-write-close.php> nach dem Schreiben benutzen und vor dem Schreiben jeweils wieder ein session\_start().
Ich habe aber noch nicht ausprobiert, ob die Session-ID nach dem session\_write\_close() noch bekannt ist. Eventuell musst Du sie die beim ersten mal mit $sid = session\_id(); besorgen und dann die Session mit session\_start($sid) wiedereröffnen.
Das ist aber nur ein gedachtes und mögliches Überraschungsmoment. Ich habe allerdings schon öfter solche erlebt bei PHP.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Ja, wwenn du session_start() aufrufst, wird die Session-Datei gesperrt, bis der Sessiondurchlauf beendet wird. Das findet automatisch am Ende des Scriptes statt.
Wenn Du es mittendrin haben möchtest, musst Du http://www.php.net/manual/de/function.session-write-close.php nach dem Schreiben benutzen und vor dem Schreiben jeweils wieder ein session_start().
Ich habe aber noch nicht ausprobiert, ob die Session-ID nach dem session_write_close() noch bekannt ist. Eventuell musst Du sie die beim ersten mal mit $sid = session_id(); besorgen und dann die Session mit session_start($sid) wiedereröffnen.
Das ist aber nur ein gedachtes und mögliches Überraschungsmoment. Ich habe allerdings schon öfter solche erlebt bei PHP.
Hallo Tom,
hab das ganze mal getestet. Prinzipiell läuft das bestens, ich kann die ganze Session freigeben und im nächsten durchlauf wieder öffnen und neu beschreiben:
for ($x; $x< 10; $x++)
{
session_start();
$_SESSION['fortschritt'] = $x;
session_write_close();
}
Ich kann nun auch in der entsprechenden info datei die Statusinformation abrufen.
Ein Haken hat die Geschichte aber:
eine logische Konsequenz ist natürlich nun, das ich im PHP Fehlermeldungen bekomme, die mir sagen das ich den Session Cookie nicht mehr senden kann, da der Header ja schon an mich raus gegangen ist. Der cache limiter kann desswegen natürlich auch nicht gesendet werden. Irgendeine Idee ob man das Senden der Session cookies blockieren kann ? ich Brauch sie im 2 Durchlauf ja nicht mehr senden, da sie lokal vorhanden sind.
echo $begrüßung;
eine logische Konsequenz ist natürlich nun, das ich im PHP Fehlermeldungen bekomme, die mir sagen das ich den Session Cookie nicht mehr senden kann, da der Header ja schon an mich raus gegangen ist. Der cache limiter kann desswegen natürlich auch nicht gesendet werden. Irgendeine Idee ob man das Senden der Session cookies blockieren kann ?
Das ist ein übliches Problem. Unterbinden jegliche Ausgabe bevor nicht alle HTTP-Header gesendet wurden. Die übliche Lösung: Strukturierung des Programmflusses nach EVA-Prinzip. Die Ausgabe erfolgt erst zum Schluss, nachdem der Verarbeitungsprozess alle Daten ermittelt hat.
ich Brauch sie im 2 Durchlauf ja nicht mehr senden, da sie lokal vorhanden sind.
Das kann session_start() ja nicht wissen. Du könntest zwischen den Durchläufen ja die SID gewechselt haben. Da session_start() nicht so designt ist, dass es mehrfach aufgerufen werden soll, merkt es sich seine früheren Aufrufe nicht.
echo "$verabschiedung $name";