Felix Riesterer: entzippen sowohl unter PHP4.4.4 als auch PHP5.1.6?

Liebe Forumsleser und -schreiber,

ich versuche gerade auf meinem Windoof-Apachen2.2.3 den Zip-Support unter PHP5.1.6 einzurichten. Dabei scheitere ich an unterschiedlichen Einstellungen zwischen meinem lokalen System und dem System meines Webhosters.

phpinfo() bei meinem Hoster (PHP4.4.4) spuckt mir für "zip" folgendes aus:
Zip support        enabled

mein lokales System (PHP5.1.6) dagegen:
Zip                enabled
Extension Version  $Id: php_zip.c,v 1.70 2006/08/14 15:54:34 pajoye Exp $
Zip version        @PACKAGE_VERSION@
Libzip version     0.7.1

Nicht, dass mich die Ausführlichkeit irgendwie stören würde, aber offensichtlich gibt es da innere Unterschiede in der Ausführung meines Scripts auf beiden Systemen, die ich nicht so ganz verstehe. Gut, ich sehe den Unterschied in den PHP-Versionen, aber das Script soll in beiden Fällen fehlerfrei laufen, was es aber nur unter PHP4.4.4 auf meinem Webspace tut.

Das Script soll eine hochgeladene Datei auf dem Server inklusive Unterverzeichnisse entpacken. Mein PHP5.1.6 beschwert sich, dass der Funktion zip_read ein unpassender Parameter (keine "resource") übergeben worden sei. Hier der Code:

   $dir = './'; // zum Testen fest codiert, später variabel  
   $zip = zip_open('test.zip'); // ebenso zum Testen fest codiert  
  
   while($zip_entry = zip_read($zip)) { /* PHP5: Warning: zip_read()  
                                           expects parameter 1 to be  
                                           resource, integer given */  
       $entry = zip_entry_open($zip,$zip_entry);  
       $filename = zip_entry_name($zip_entry);  
       $target_dir = $dir.substr($filename, 0, strrpos($filename, '/'));  
       $filesize = zip_entry_filesize($zip_entry);  
       if (is_dir($target_dir) || mkdir($target_dir, 0777)) {  
           if ($filesize > 0) {  
               $contents = zip_entry_read($zip_entry, $filesize);  
  
               $handle = fopen($dir.$filename, 'wb+');  
               fputs($handle, $contents);  
               fclose($handle);  
               @chmod($dir.$filename, 0666);  
           }  
       }  
   }

Meine Nachforschungen haben ergeben, dass zip_open() die Zahl 11 zurückgibt, was ein Fehlercode ist, der besagt, dass das Öffnen fehlgeschlagen hätte (vergl. hierzu User-Comment von Adam Stout). Der Code ist mir insofern unverständlich, als dass eine Prüfung auf is_file zuvor mit true bewertet worden war. Mir ist das Ganze deshalb so schleierhaft, da sowohl Script, als auch Test-Zip-Datei lokal wie online identisch sind!

Wer weiß Rat?

Liebe Grüße aus Ellwangen,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  1. hi,

    Meine Nachforschungen haben ergeben, dass zip_open() die Zahl 11 zurückgibt, was ein Fehlercode ist, der besagt, dass das Öffnen fehlgeschlagen hätte (vergl. hierzu User-Comment von Adam Stout). Der Code ist mir insofern unverständlich, als dass eine Prüfung auf is_file zuvor mit true bewertet worden war.

    Daraus, dass eine Datei physisch vorhanden ist, willst du doch nicht automatisch schliessen, dass es sich auch um eine gültige, "lesbare" Datei _im Format "zip"_ handelt?

    Mir ist das Ganze deshalb so schleierhaft, da sowohl Script, als auch Test-Zip-Datei lokal wie online identisch sind!

    Der Fehler tritt also eigentlich bereits in folgender Zeile auf:
    $zip = zip_open('test.zip'); // ebenso zum Testen fest codiert

    Der Nutzerkommentar von ajbaas at cs dot uu dot nl am
    13-Oct-2004 09:08
    besagt, unter Windows müsse man, wenn man PHP in der Modulversion verwendet (bei dir der Fall?), der Funktion einen absoluten Pfad übergeben, "because it is not aware of it's whereabouts. this is for win32 at least."

    Probier's also erst mal mit einem absoluten Pfad, ob das hilft.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Korrektur: (irgendwas ist doch immer ...)

      Der Nutzerkommentar von ajbaas at cs dot uu dot nl am 13-Oct-2004 09:08 besagt, unter Windows müsse man, wenn man PHP in der Modulversion verwendet (bei dir der Fall?), der Funktion einen absoluten Pfad übergeben, "because it is not aware of it's whereabouts. this is for win32 at least."

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
    2. Lieber wahsaga,

      und wieder einmal schulde ich Dir meinen Dank!

      der Funktion einen absoluten Pfad übergeben, "because it is not aware of it's whereabouts. this is for win32 at least."

      Volltreffer! Daher folgende Modifikation:

         $zip_datei = 'test.zip';  
         $zip = zip_open(preg_replace('~[^/]+$~', '', $_SERVER['SCRIPT_FILENAME']).$zip_datei);
      

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Hallo Felix,

        $zip_datei = 'test.zip';

        $zip = zip_open(preg_replace('~[^/]+$~', '', $_SERVER['SCRIPT_FILENAME']).$zip_datei);

          
        Um das Verhalten von relativen Pfaden identisch zu duplizieren, wäre übrigens [getcwd()](http://de3.php.net/getcwd) zum bestimmen des aktuellen Arbeitsverzeichnisses relevant, wenn Du nämlich mit [chdir()](http://de3.php.net/chdir) in ein anderes Verzeichnis wechselst, ist fopen ('bla.txt', 'r') und fopen (SF.'bla.txt', 'r') nicht mehr das gleiche (das SF stehe hier für Dein Konstrukt mit dem SCRIPT\_FILENAME und preg).  
          
        Ferner funktioniert getcwd() auch bei CLI, SCRIPT\_FILENAME dagegen ist eine CGI-Variable, die in der Modulvariante von PHP zufälligerweise auch gesetzt wird.  
          
        Wenn Du dagegen einen Pfad relativ zur aktuell verarbeiteten Datei suchst, dann wäre dirname (\_\_FILE\_\_) besser (bzw. allgemein würde ich dirname() statt preg\_replace empfehlen).  
          
        Viele Grüße,  
        Christian  
        
        -- 
        "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
        
      2. Hi,

        Volltreffer! Daher folgende Modifikation:

        Ein realpath() tut's nicht?

        Gruß, Cybaer

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!