Hello Roger,
vielleicht verwechselst du da gerade was. ich habe kein problem mit rechten. und was ich für eine sys-config habe, sei auch dahingestellt. mir ging es zunächst darum, eine allgemeingültige funktion zu basteln, die überprüft, ob das script die datei beschreiben darf oder nicht. ich wollte wissen, ob man die funktion evtl. verbessern kann - für die nachwelt.
Ich habe da nichts verwechselt, sondern wollte nur auf die Interna von is_writable() eingehen.
Du hast in Deinem OP versucht, die Beschreibbarkeit der Datei mittels einer Funktion zu prüfen, die nur auf Dateirechte-Flags Rüchsicht nimmt, nicht aber auf
- safe_mode
- safe_mode_gid
- Owner des Scriptes
- Owner des Files
- Owner des Scriptverzeichnisses
- Owner des Fileverzeichnisses
Die Bugs in den unterschieldichen Systemen lassen wir mal außen vor. Aber deshalb fragte ich danach.
is_writetable() nimmt auch auf die Einstellugnen des SafeMode Rücksicht und ermittelt die effektiven Rechte. Das hast Du mit Deiner Funktion nicht gemacht.
Da ich vorhin aber für einen anderen Thread (timeout von Scripten, PHP-Background-Scripte) sowieso noch etwas mit SafeMode austesten musste, habe ich diese Aufgabe auch nochmals gecheckt und es ist genau das dabei herausgekommen, was ich erwartet hatte.
Nimm also entweder is_writable() oder benutze 'track_errors'='1' und $php_errormsg in Verbindung mit einem Schreibversuch. Ein Öffnungsversuch im passenden Modus müsste es auch tun (Linux)
$fh = @fopen($dateiname,'a+'); ## a+ ist zwar zerstörungsfrei, aber nicht mehr für
if (!$fh) ## Änderung vorhandener Daten nutzbar
{
Echo 'File ist not writable: '.(!empty($php_errormsg)?$php_errormsg:''));
{
Wenn Du gleich den passenden Openmode nimmst, kannst Du anschließend gleich mit dem handle weiterarbeiten. 'a+' erlaubt seit PHP version > 4.3.3 (?) auch unter Linux nicht mehr das hineinschreiben in den Altbereich der Datei.
zwischen is_writable() und fopen(...'r+') könnte sich schon wieder ein andere Prozess drängen, der da was ändert. Und dann fällt man doch auf die Nase. Also kann man auch gleich mit der open-Funktion arbeiten.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau