Warum schlägt fopen innerhalb einer Funktion zum Herunterfahren von Registern fehl?

Ich arbeite an einer Site auf einem freigegebenen Host. Ich habe keinen Zugriff auf die PHP-INI-Datei oder das PHPini_set Funktion, und ich kann nicht @ verwendphp_flag oderphp_value directives.

Ich benutze dasset_error_handler -Funktion, um die meisten Fehler zu protokollieren und die @ -Funktion zu verwendregister_shutdown_function um schwerwiegende zu protokollieren. Ich habe hier verschiedene Lösungen zum Abfangen schwerwiegender Fehler ausprobiert:Wie kann ich einen schwerwiegenden PHP-Fehler feststellen?. Ich kann die dortigen Lösungen erfolgreich verwenden, um entweder die Fehler auf dem Bildschirm anzuzeigen oder eine benutzerdefinierte Fehlerseite aufzurufen und nicht schwerwiegende Fehler zu protokollieren, aber ich kann die schwerwiegenden Fehler scheinbar nicht protokollieren.

Dies ist die einfachste Version meiner Versuche:

    function errorHandler($num, $str, $file, $line) {

        $now        = strftime("%B %d, %Y at %I:%M %p", time());
        $text       = "{$now} → error {$num} in {$file}, line {$line}: {$str}\n";
        $errorlog   = "my_path/my_log";

        $new        = file_exists($errorlog) ? false : true;
        if($handle  = fopen($errorlog, 'a')) {
            fwrite($handle, $text);
            fclose($handle);
            if($new) { chmod($errorlog, 0755); }
        } else {
            print("Could not open log file for writing"); //I'm using this to test
        }

    }

    function fatalHandler() {
        $error  = error_get_last();
        if($error) {
            errorHandler($error["type"], $error["message"], $error["file"], $error["line"]);
        }
    }

    set_error_handler("errorHandler");
    register_shutdown_function("fatalHandler");    

Wenn ich dies mit einem nicht schwerwiegenden Fehler teste, wieecho $undefined_variable, es funktioniert und der Fehler wird ordnungsgemäß protokolliert. Allerdings, wenn ich mit einem schwerwiegenden Fehler wie @ testundefined_function(), es protokolliert nichts und druckt "Protokolldatei konnte nicht geöffnet werden". Wenn ich beide Fehler teste, wird der nicht schwerwiegende, aber nicht der schwerwiegende Fehler protokolliert.

Ihre Frage wurde als mögliches Duplikat einer anderen Frage identifiziert. Wenn die Antworten dort nicht auf Ihr Problem zutreffen, bearbeiten Sie diese bitte, um die Teile Ihrer Frage, die eindeutig sind, ausführlich zu erläutern.

ic Seedoubleyew: Nun, das offensichtlichste ist die Warnung, die in der Frage angesprochen wurde, die Sie angesprochen habefailed to open stream: ...etc hat nichts mit meiner Situation zu tun. Diese Warnung ist nie passiert. Die Testmeldung: "Protokolldatei konnte nicht zum Schreiben geöffnet werden" lautetmein eigene Nachricht, die ich geschrieben habean mic, also hätte ich ein paar Beweise dafür, dass dieif Anweisung wurde verarbeitet. Ich habe diese Nachricht erfunden. In meiner Frage ist sehr deutlich vermerkt, dass die Botschaft von mir selbst stammt. Jeder, der das Problem hat, das ich hatte, bekommt niemals die Nachrichtfailed to open stream...etc, so dass ihnen keine Frage zu einer Nachricht hilft, die sie nie erhalten haben. Ich gehe davon aus, dass es darum geht, Dummköpfen wie mir zu helfen.

Der Titel: "Warum machtfopen fail in a register shutdown function "war nicht mein Titel. Das ist die Bearbeitung einer anderen Person. Meine Frage war, warum ich nicht in ein Protokoll im @ schreiben konntregister_shutdown_function. Ich wusste nicht obfopen ist fehlgeschlagen oder es gab ein anderes Problem. Ich habe versucht, etwas von der Funktion abzumelden, und es hat nicht funktioniert. Entfernen des angegebenen Ziels (Abmelden von der Funktion) von der Frage und Hinzufügen der Bewertung einer anderen Person "Warum funktioniertfopen fail "macht es für jeden, der hierher kommt, um eine Lösung für die Situation zu finden, die ich erlebt habe, weniger nützlich. Wäre bereits eine Frage vorhanden gewesen, die das Schreiben in eine Datei innerhalb der Shutdown-Funktion betraf, hätte ich sie gefunden." tutfopen fail "ist zu spezifisch, um bei einer Suche von jemandem nützlich zu sein, der nicht weiß, warum er nicht in eine Datei in der Funktion schreiben kann.

Ich wollte nichts über die Bearbeitung sagen, aber da Sie mich gebeten haben, es zu erklären, erkläre ich es. Mir ist klar, dass wahrscheinlich jeder Bearbeiter Punkte bekommt, aber nehmen Sie sich eine Minute Zeit, um zu überlegen, wie sich Ihre Bearbeitung auf die Nützlichkeit der Frage für jemanden auswirkt, der mit der Situation, die ich hatte, hierher kommt.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage