Mögliche Warnings einer Funktion und ob Sie das Skript abbrechen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mögliche Warnings einer Funktion und ob Sie das Skript abbrechen

    Hallo Leute,

    Ich ärgere mich momentan mit den Warnings ein bisschen rum. Seit PHP5 gibts es immer mehr und gute Klassen die einfach zu benutzen sind, aber nirgends ist dokumentiert welche Fehler und Warnings von den Funktionen geworfen werden und ob die Warnings nur einen Text drucken oder das ganze Skript abbrechen.

    Mir ist das aktuell bei der Methode ZipArchive::extractTo auf die Füsse gefallen. Es funktioniert alles sehr gut nur wenn das übergebene Verzeichnis z.B. nicht lesbar ist bricht das Skript mit einer Warning ab. Nun ist es kein größeres Problem das Verzeichnis zu testen ob es lesbar und ausführbar ist aber es gibt bestimmt noch eine ganze Menge mehr Warnings die man ohne Dokumentation nie alle finden wird.

    Jetzt ist meine Frage sind irgendwo alle Warnings dokumentiert?
    Und zweitens kann man irgendwo einstellen das Warnings (/Errors) nur eine Fehlermeldung werfen/drucken (mit set_error_handler abfangbar) und nicht das ganze Skript beenden, was auch passiert wenn man einen error_handler nutzt!!! (mein PHP ist 5.2.6)

    hier mal der Beispielcode (funktionsfähiger Ausschnitt aus dem Gesamtwerk)
    PHP-Code:
    <?php
    define
    ("LB","<br />\n");
    error_reporting(E_ERROR);
    $alter_error_handler set_error_handler("myErrorHandler");
    if (
    class_exists("ZipArchive"))
    {    
        
    $zip = new ZipArchive;
        
    $res $zip->open('modx.zip',ZIPARCHIVE::CHECKCONS);
        if (
    $res === TRUE) {
          
    $dir_name 'temp';
          echo 
    'chmod'.chmod($dir_name,0500).LB//damit der Error geworfen wird
          
    echo 'extract:'.$zip->extractTo($dir_name).LB;
          echo 
    'ok'.LB;

           echo 
    'close:'.$zip->close().LB;
        } else {
            echo 
    zipFileErrMsg($res);
        }
    }
    else
    {    
        echo 
    'Klasse ZipArchive nicht im System';
    }

    // Fehlerbehandlungsfunktion
    function myErrorHandler($fehlercode$fehlertext$fehlerdatei$fehlerzeile)
    {
        switch (
    $fehlercode) {
        case 
    E_USER_ERROR:
            echo 
    "<b>Mein FEHLER</b> [$fehlercode$fehlertext<br />\n";
            echo 
    "  Fataler Fehler in Zeile $fehlerzeile in der Datei $fehlerdatei";
            echo 
    ", PHP " PHP_VERSION " (" PHP_OS ")<br />\n";
            echo 
    "Abbruch...<br />\n";
            exit(
    1);
            break;

        case 
    E_USER_WARNING:
            echo 
    "<b>Meine WARNUNG</b> [$fehlercode$fehlertext<br />\n";
            break;

        case 
    E_USER_NOTICE:
            echo 
    "<b>Mein HINWEIS</b> [$fehlercode$fehlertext<br />\n";
            break;

        default:
            echo 
    "Unbekannter Fehlertyp: [$fehlercode$fehlertext (Zeile: $fehlerzeile)<br />\n";
            break;
        }

        
    /* Damit die PHP-interne Fehlerbehandlung nicht ausgeführt wird */
        
    return true;
    }

    function 
    zipFileErrMsg($errno) {
      
    // using constant name as a string to make this function PHP4 compatible
      
    $zipFileFunctionsErrors = array(
        
    'ZIPARCHIVE::ER_MULTIDISK' => 'Multi-disk zip archives not supported.',
        
    'ZIPARCHIVE::ER_RENAME' => 'Renaming temporary file failed.',
        
    'ZIPARCHIVE::ER_CLOSE' => 'Closing zip archive failed',
        
    'ZIPARCHIVE::ER_SEEK' => 'Seek error',
        
    'ZIPARCHIVE::ER_READ' => 'Read error',
        
    'ZIPARCHIVE::ER_WRITE' => 'Write error',
        
    'ZIPARCHIVE::ER_CRC' => 'CRC error',
        
    'ZIPARCHIVE::ER_ZIPCLOSED' => 'Containing zip archive was closed',
        
    'ZIPARCHIVE::ER_NOENT' => 'No such file.',
        
    'ZIPARCHIVE::ER_EXISTS' => 'File already exists',
        
    'ZIPARCHIVE::ER_OPEN' => 'Cant open file',
        
    'ZIPARCHIVE::ER_TMPOPEN' => 'Failure to create temporary file.',
        
    'ZIPARCHIVE::ER_ZLIB' => 'Zlib error',
        
    'ZIPARCHIVE::ER_MEMORY' => 'Memory allocation failure',
        
    'ZIPARCHIVE::ER_CHANGED' => 'Entry has been changed',
        
    'ZIPARCHIVE::ER_COMPNOTSUPP' => 'Compression method not supported.',
        
    'ZIPARCHIVE::ER_EOF' => 'Premature EOF',
        
    'ZIPARCHIVE::ER_INVAL' => 'Invalid argument',
        
    'ZIPARCHIVE::ER_NOZIP' => 'Not a zip archive',
        
    'ZIPARCHIVE::ER_INTERNAL' => 'Internal error',
        
    'ZIPARCHIVE::ER_INCONS' => 'Zip archive inconsistent',
        
    'ZIPARCHIVE::ER_REMOVE' => 'Cant remove file',
        
    'ZIPARCHIVE::ER_DELETED' => 'Entry has been deleted',
      );
      
    $errmsg 'unknown';
      foreach (
    $zipFileFunctionsErrors as $constName => $errorMessage) {
        if (
    defined($constName) and constant($constName) === $errno) {
          return 
    'Zip File Function error: '.$errorMessage;
        }
      }
      return 
    'Zip File Function error: unknown';
    }
    ?>
    Gruß

    Max

  • #2
    Re: Mögliche Warnings einer Funktion und ob Sie das Skript abbrechen

    Original geschrieben von bemax
    Mir ist das aktuell bei der Methode ZipArchive::extractTo auf die Füsse gefallen. Es funktioniert alles sehr gut nur wenn das übergebene Verzeichnis z.B. nicht lesbar ist bricht das Skript mit einer Warning ab. Nun ist es kein größeres Problem das Verzeichnis zu testen ob es lesbar und ausführbar ist aber es gibt bestimmt noch eine ganze Menge mehr Warnings die man ohne Dokumentation nie alle finden wird.
    ZipArchive::extractTo - Rückgabewerte
    Gibt bei Erfolg TRUE zurück, im Fehlerfall FALSE.

    so ist das eigentlich bei allen funktionen, false zeigt dir, dass etwas schiefgelaufen ist.
    oder was meintest du?

    Original geschrieben von bemax
    Und zweitens kann man irgendwo einstellen das Warnings (/Errors) nur eine Fehlermeldung werfen/drucken (mit set_error_handler abfangbar) und nicht das ganze Skript beenden, was auch passiert wenn man einen error_handler nutzt!!! (mein PHP ist 5.2.6)
    ein E_WARNING gibt nur die warnmeldung (je nach einstellung) aus und das script wird fortgeführt.

    ein E_ERROR ist ein fataler fehler zur laufzeit und das script wird in _jedem_ fall abgebrochen. wenn z.b. die max_execution_time überschritten wurde, dann kannst du daran nichts ändern auch nicht mit einem error_handler.

    insofern verstehe ich die frage nicht.

    Kommentar


    • #3
      chmod1

      Warning: ZipArchive::extractTo() [ziparchive.extractto]: Permission denied in /srv/www/web97/html/unzip.php on line 12
      Leider ist es nicht so das die Warnings nicht das Programm abbrechen ... Diese Fehlermeldung erhalte ich bei dem obigen Code wenn ich Zeile 3 (error_reporting(E_ERROR)) und Zeile 4 (set_error_handler) auskommentiere .. normalerweilse müssten noch einige Ausgaben kommen. Kurioserweise kann man auch Warnings erzeugen die nicht zum Abbruch führen.

      Gruß

      Max

      php 5.2.6
      Linux 2.6.18-6-amd64
      Zuletzt geändert von bemax; 25.08.2008, 21:11.

      Kommentar


      • #4
        Original geschrieben von bemax
        Leider ist es nicht so das die Warnings nicht das Programm abbrechen ... Diese Fehlermeldung erhalte ich bei dem obigen Code wenn ich Zeile 3 (error_reporting(E_ERROR)) und Zeile 4 (set_error_handler) auskommentiere .. normalerweilse müssten noch einige Ausgaben kommen.
        sorry, kann ich nicht nachstellen. ich erhalte wie erwartet die nachfolgenden ausgaben:
        Code:
        chmod1
        
        Warning: ZipArchive::extractTo(./test/./AWP.xls) [function.ZipArchive-extractTo]: failed to open stream:
        Permission denied in /mnt/hgfs/htdocs/index.php on line 13
        extract:1
        ok
        close:1
        Apache/2.2.3 (Debian) PHP/5.2.0-8+etch11
        EDIT:
        warum ist bei dir extractTo() leer? hast du das rausgenommen?
        Zuletzt geändert von 3DMax; 25.08.2008, 21:31.

        Kommentar


        • #5
          Guten Morgen,

          du hast ein sehr scharfes Auge

          Ich hab mal geschaut woran es liegt das bei mir keine Datei in der Fehlermeldung auftaucht.

          Der Grund ist ziemlich einfach. Wenn ich alle Verzeichnisse aus dem Zip entferne steht bei mir auch eine Datei in der Fehlermeldung.. scheinbar versucht er erst die Verzeichnisse zu entpacken und bekommt dann schon den Fehler der das Programm unterbricht.

          Würde mich freuen wenn du das nochmal gegentesten könntest ob das bei dir auch so passiert.


          Gruß

          Max

          aktueller Code:
          PHP-Code:
          <?php
          define
          ("LB","<br />\n");
          if (
          class_exists("ZipArchive"))
          {    
              
          $zip = new ZipArchive;
              
          $res $zip->open('modx.zip',ZIPARCHIVE::CHECKCONS);
              if (
          $res === TRUE) {
                
          $dir_name 'temp';
                echo 
          'chmod'.chmod($dir_name,0500).LB//damit der Error geworfen wird
                
          echo 'extract:'.$zip->extractTo($dir_name).LB;
                echo 
          'ok'.LB;

                 echo 
          'close:'.$zip->close().LB;
              } else {
                  echo 
          'Fehler beim öffnen der zip-Datei';
              }
          }
          else
          {    
              echo 
          'Klasse ZipArchive nicht im System';
          }
          ?>

          Kommentar


          • #6
            Original geschrieben von bemax
            Würde mich freuen wenn du das nochmal gegentesten könntest ob das bei dir auch so passiert.
            du meinst ein zip nur mit verzeichnissen?

            ok, fehlermeldung sieht jetzt wie bei dir aus (extractTo() ) - das script arbeitet aber trotzdem weiter. hätte mich auch stark gewundert, wenn das nicht so wäre.

            Kommentar


            • #7
              hmm das ist jetzt aber wirklich komisch ..

              denn der Fall mit der Warning wegen der Datei unterbricht bei mir auch nicht das Skript aber bei der Warning mit nur Verzeichnissen in der obersten Ebene schon.

              Also bei mir läuft der Server im save mode vielleicht liegt es daran..

              Danke fürs Testen

              Gruß

              Max

              Kommentar

              Lädt...
              X