preload
Aug 07

Es ist schon mehrfach aufgetreten, dass Seiten, die mittels exec() Programme ausführen, urplötzlich hängen. Eine genauere Analyse ergab, dass dieses Problem auftritt, wenn der Server den ersten Request noch nicht abgearbeitet hat, jedoch der Benutzer im Browser schon wieder auf einen Link geklickt hat. Ruft der zweite Request auch exec() auf, hängt der Server. Es handelt sich dabei weder um ein Problem des Servers (bspw. Apache, IIS, Tomcat, usw.) noch um ein Problem des mit exec() ausgeführten Programms (bspw. GhostScript, ImageMagick, sonstige.com, usw.exe).

Das Problem liegt in diesem Fall bei PHP. Da die Session noch in Verwendung ist, während der nächste Request bereits versucht, einen zweiten Prozess mit der selben Session zu öffnen, hängt der Server, falls das ganze während der Ausführung von exec() stattfindet. Die Lösung dieses Problems ist es, die Session vor dem Aufruf von exec() zu schließen und sie direkt im Anschluss wieder zu starten:

<?php
  ...
  session_write_close();
  exec($sCommand);
  session_start();
  ...
?>

Durch das Schließen der Session kommt es nicht mehr zum Hängen des Servers. Das erneute Öffnen nach dem Aufruf von exec() garantiert, dass alle vor Beendigung des Skriptes erfolgenden Session-Zugriffe korrekt ablaufen.

Links zu diesem Problem: