Formmail: Versionsüberprüfung mit der Datei "/fm0f87d1.txt" fehlgeschlagen: fopen(/fm0f87d1.txt) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: Permission denied
Heute gabe es mal wieder eine schöne Fehlermeldungs-Email:
To: mail@mail.comFrom: mail@mail.com
Der folgende Fehler trat in FormMail auf :
Versionsüberprüfung mit der Datei "/fm0f87d1.txt"
fehlgeschlagen: fopen(/fm0f87d1.txt)
[<a href='function.fopen'>function.fopen</a>]:
failed to open stream: Permission denied
email: mail@mail.com
realname: Nutzername
mesg: 'Test'
submit: 'Abschicken'
Referring page was...
SERVER_NAME was...
REQUEST_URI was /kontakt_process.php
User IP address was I.P.AD.RE.SS
User agent was Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Die Lösung musste ein wenig auf sich warten, googlen hatte nicht sofort das Problem gelöst.
Hier die Erklärung der Formmail-Hilfe:
http://www.tectite.com/fmdoc/scratch_pad.php
Lösung:
Nachdem ich die Variable auf mein Temp-Verzeichnis gelegt hatte
$SCRATCH_PAD = "/var/www/webX/tmp";
lief es wieder ohne Probleme.
Das betrifft vor allem Webspace, bei dem das temporäre Verzeichnis nicht im Standardpfad eines Webservers "/tmp" liegt.
weitere Hinweise
Auslöser ist die Überprüfung einer neuen Version von Formmail mittels:
Check4Update()
Diese meckert, wenn die Datei in der Variablen $s_chk_file nicht existiert.
Check4Update bekommt aber den kompletten Pfad, inklusive der Datei übergeben: $s_dir."/".$s_chk_file
Und $s_dir wird weiter oben gebildet:
$s_dir = GetTempDir();
Die Funktion GetTempDir() erwartet den Verzeichnisnamen von $s_name (Zeile 2399).
function GetTempDir()
{
$s_name = GetTempName("fm");
if (file_exists($s_name))
unlink($s_name);
$s_dir = dirname($s_name);
return ($s_dir);
}
Und wenn $SCRATCH_PAD nicht gesetzt ist, dann nutzt die Funktion GetTempName() einfach den Standardpfad /tmp:
function GetTempName($s_prefix)
{
global $SCRATCH_PAD;
if (isset($SCRATCH_PAD) && !empty($SCRATCH_PAD))
$s_name = GetScratchPadFile($s_prefix);
else
$s_name = tempnam("/tmp",$s_prefix);
return ($s_name);
}
Gut, dass der Quellcode ordentlich dokumentiert ist. Vielen Dank an die Entwickler.
Bookmarks:
Delicious Facebook Google Yahoo Mr. Wong Linkarena Digg