WernerK: Fatal error: Allowed memory size abfangen

Hallo

wenn eine zu grosse Datei geladen wird bekomme ich die Meldung
Fatal error: Allowed memory size exhausted.
Ich könnte jetzt natürlich das limit erhöhen.
Mich würde aber interessieren wie man den Fehler abfangen kann

So kommt der Fatal error
$filecheck = fread($fh, filesize("$ordner/$file"));

Jetzt versuche ich es wie im PHP Manual beschrieben

try {
    throw new Exception('Zu grosse Datei geladen!');
    $filecheck = fread($fh, filesize("$ordner/$file"));
} catch (Exception $e) {
    echo 'Exception abgefangen: ',  $e->getMessage(), "\n";
}

Das klappt jedoch nicht.
Es wird nie in den Catch Block gesprungen.
Geht das bei dieser Art Fehler nicht oder was mache ich falsch?

Danke
Gruss
Werner

  1. Geht das bei dieser Art Fehler nicht oder was mache ich falsch?

    Das dürfte ein fataler Fehler sein. Der Abbruch erfolgt also zwingend wenn PHP feststellt, das das Skript zu viel Speicher konsumiert. Wie soll da der Fehler noch behandelt werden?

    Zudem ist throw new Exception nicht dazu da, um solche fatalen Fehler abzufangen, sondern damit Du im Skript selbst fest stellen kannst, dass was schief läuft (Im Handbuch steht POTENTIELLE Fehler) und eigene Fehlermeldungen zu erzeugen und im Falle nicht-fataler Fehler ggf. zu reagieren.

    Besser, Du prüfst die Dateigöße und ggf. weitere Eigenschaften und schmeißt die Ausnahmen selbst oder behebst die POTENTIELLEN Fehler.

    Hier wäre also die Existenz, Lesbarkeit, Dateigröße und die Sperre zu prüfen (Du nimmts ja nicht umsonst fread statt file_get_contents) zu prüfen. Selbstredend kannst diese auch berechnen, ich habe einfach mal 1 Mio Bytes angenommen:

    <?php  
    function checkAndOpenFile($file) {  
        if ( ! is_file("$file") ) {  
            throw new Exception("Die Datei '$file' existiert nicht.");  
        } else if ( ! is_readable("$file") ) {  
            throw new Exception("Die Datei '$file' ist nicht lesbar.");  
        } else if ( 1000000 < filesize("$file") ) {  
            throw new Exception("Die Datei '$file' ist zu groß.");  
        } else if ( 0 == filesize("$file") ) {  
            throw new Exception("Die Datei '$file' ist leer.");  
        } else {  
            $fh =  fopen("$file","r" );  
            if ( !flock ($fh, LOCK_SH) ) {  
                throw new Exception("Die Datei '$file' konnte nicht gesperrt werden.");  
               return false;  
            }  
        return $fh;  
        }  
    }  
      
    try {  
        $fh=checkAndOpenFile('./testdatei.txt');  
        $filecheck = fread( $fh, filesize('./testdatei.txt') );  
    } catch (Exception $e) {  
        $filecheck = '';  
        echo 'Exception abgefangen: ',  $e->getMessage(), "\n";  
        ### was auch immer oder exit;  
    }  
    ?>