permission denied unter IIS und php
GeoSven
- webserver
Guten Morgen,
ich muss eine PHP Anwendung unter Windows und dem IIS zum laufen bringen. Dabei werden aus einer Datenbankanwendung verschiedene Textfiles (hier $mapfile) als Konfiguration für eine PHP-CGI-Anwendung (in diesem Fall ein Mapserver) geschrieben. Der Mapserver läuft unter PHP als Extension und wird über PHP-Mapscript programmiert. Bisher klappt auch alles einwandfrei, bis auf folgendes Problem: Wenn ein Textfile von der Software geparst wird (newMapobj) und z.B. einen Syntaxfehler beinhaltet bekomme ich eine entsprechende Fehlermeldung, aber der IIS gibt den File nicht mehr frei (Permission denied), obwohl ich ein entsprechendes Error Handling vornehme:
try {
//Mapobjekt laden
$oMap = ms_newMapobj($mapfile);
} catch (Exception $e) {
echo '<strong>Exception:</strong> ', $e->getMessage(), "\n";
$oMap->free();
unset($oMap);
exit;
}
Wenn ich beim IIS ein restart durchführe ist der Texfile wieder freigegeben und ich kann ihn löschen (unset) bzw. wieder neu schreiben. Wie kann ich den IIS dazu überreden den File wieder freizugeben? Unter dem Apache ist das alles kein Problem.
Danke Sven
Hallo GeoSven,
das kann so nicht funktionieren. Wenn ms_newMapobj() eine Exception wirft, gibt's keine Zuweisung mehr und du kannst im Exception-Handler auf oMap nicht zugreifen, da steht dann null oder ein veralteter Wert drin. Die Zuweisung an oMap findet nur statt wenn die Funktion ohne Exception durchläuft - aber dann kommst Du auch nicht in den catch-Teil.
WENN ms_newMapobj eine Exception wirft, ist es in ihrer eigenen Verantwortung, keine Ressourcen festzuhalten. Denn Du bekommst ja keine Handhabe, um irgendwas freizugeben. Blockiert sie dennoch, ist das ein Bug in der ms_newMapObj Funktion bzw. weiter unten in der Aufrufhierarchie.
Hier steht ein Issue dazu: https://github.com/mapserver/mapserver/issues/1994, 2006 wurde von einem User ein Patch dazu angeboten und 2012 ist es endlich auf closed gesetzt worden. In welcher MapServer Version der Fix enthalten sein soll kann ich nicht erkennen, aber wenn das die Reaktionszeit auf Fehler ist, dann aua aua aua...
Setzt Du die neueste MapServer Version ein? Wenn nicht - kannst Du die Neueste ausprobieren? Wenn Du den Fehler mit der neuesten Version immer noch hast, solltest Du das Issue neu öffnen und auf IIS/Windows hinweisen. Ein Issue zu öffnen, wenn man alte Versionen einsetzt, wird normalerweise mit "update erstmal" beantwortet, deshalb ist diese Probe erforderlich.
Eine Alternative könnte sein - nicht, dass ich MapServer kennen würde, aber die API Funktion klingt vielversprechend - die Datei manuell in einen String zu laden und dann ms_newMapObjFromString zu nutzen. Keine Ahnung ob und wie es funktioniert, aber wenn Du die Datei liest und freigibst, dann kann der MapServer sie jedenfalls nicht festhalten.
Rolf
Hallo Rolf,
danke für Deine Antwort. Ja, ich setze die neueste MapServer version 7.0.7 (ein Kompilat aus MS4W 3.2.3) ein. Ich glaube Du hast recht, ich werde mal das Issue neu öffnen und schauen was passiert. Die Idee die Definition via ms_newMapObjFromString zu laden hatte ich auch schon und habe das auch mal eingebaut, allerdings wird das mit includierten Layern und Symbolsets etc. recht kompliziert.
Sven
Hallo GeoSven,
hast Du die Tools bzw. das Know-How, um Du die Sourcen selbst zu kompilieren? Dann könntest Du versuchen, zu schauen, wo es hakt.
Rolf