Raketenwilli: Probleme mit der Funktion file()

Beitrag lesen

Und die Verwendung eines vorgeschalteten is_readable() ist schlichtweg falsch, da man damit einen Zeit-Zugriffsfehler (TOCTTOU) riskiert.

Häää? Die Benutzung der Funktion sollte einer einmaligen Überprüfung der Lesbarkeit einer Datei für den PHP-Systembenutzer dienen.

Naja. Der PHP-Freund hat nicht ganz unrecht.

Zwischen is_readable() und dem eigentlichen Lesen kann die Datei auf Grund der Bemühungen eines anderen Prozesses verschwinden, die Rechte können sich ändern e.t.c. pp. Gerade im Hinblick auf das weiter oben gezeigte Error-Log wird es im Hinblick auf logrotate „heiß“.

Also:

<?php
if ( $rows = file( '/var/log/apache2/example.com/access.log' ) ) {
     print_r( $rows );
} else {
     echo 'Fehler.';
}

Die Verschachtelung ist „eher ungünstig“. Könnte man auch herumdrehen:

<?php
if ( ! $rows = file( '/var/log/apache2/example.com/access.log' ) ) {
     echo 'Fehler.';
}
print_r( $rows );

Das gibt aber Mecker(), wenn man sich an Code-Standards halten soll.

Es geht also besser, z.B. kann man aus der Warnung einen Fehler machen, in dem man einen error-handler definiert:

<?php
set_error_handler(
    function( $errNo, $errStr, $errFile, $errLine ) {
        if (0 === error_reporting()) {
            return false;
        }
        throw new ErrorException( $errStr, 0, $errNo, $errFile, $errLine );
    }
);

try {
    $rows = file( '/var/log/apache2/access.log' );
} catch ( ErrorException $e ) {
    echo 'Fehler....';    
}
restore_error_handler();
print_r( $rows );

das …

echo 'Fehler....';

… ist in beiden Varianten natürlich nur ein Platzhalter wie das

print_r( $rows );