Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Swiftu. Zároveň využij výhodnou slevovou akci až 30 % zdarma při nákupu e-learningu - více informací.
swift week + discount 30

Diskuze: ZipArchive close No Error - zahadna chyba pri zavirani zipu

Aktivity
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:18.12.2020 12:44

V jednom php programu mi tento kod funguje, ve druhem napise uplne posledni radek

Warning: ZipArchive::close(): Read error: No error in C:\xampp\htdocs\www\ev2c_hraward\inc\class_app_evid2c.php on line 2035

Vubec netusim, co je za problem.

// --- ZIP class for export subdirs ---

class ExtendedZip extends ZipArchive
{
// Member function to add a whole file system subtree to the archive
public function addTree($dirname, $localname = '')
        {
        if ($localname)
                $this->addEmptyDir($localname);
        $this->_addTree($dirname, $localname);
        }

// Internal function, to recurse
protected function _addTree($dirname, $localname)
        {
//echo substr($dirname,2).' dir<br>';
        // skip dirs
        if (in_array(substr($dirname,2), array(
                'tmp',
                'error', 'stats',       // ispconfig dirs
                'htx.1', 'htx.2', 'htx.3', 'old', 'sql', 'x', 'x-upl', 'zadani', 'form/old', 'inc/x' // localhost dirs
                )))
                {
                return;
                }
$list = array();
        $dir  = opendir($dirname);
        while ($filename = readdir($dir))
                {
                // Discard . and ..
                if ($filename == '.' || $filename == '..')
                        {
                        continue;
                        }
//              if ($filename == 'tmp') // vynech tmp
//                      continue;
                // Proceed according to type
                $path = $dirname . '/' . $filename;
                $localpath = $localname ? ($localname . '/' . $filename) : $filename;
                if (is_dir($path))
                        {
                        // Directory: add & recurse
$list[] = $localpath;
                        $this->addEmptyDir($localpath);
                        $this->_addTree($path, $localpath);
                        }
                elseif (is_file($path))
                        {
                        // File: just add
$list[] = $localpath;
//$list[] = $localpath.' ('.$path.')';
                        $this->addFile($path, $localpath);
                        }
                }
echo implode("<br>", $list)."<br>";     // br navic kvuli subdirs
        closedir($dir);
        }

// Helper function
//ZipArchive::CM_STORE
public static function zipTree($dirname, $zipFilename, $flags = 0, $localname = '', $addfiles=array())
        {
//echo sys_get_temp_dir();
// exit;
/*
        $zip = new self();
        $zip->open($zipFilename, $flags);
        $zip->addTree($dirname, $localname);
        foreach($addfiles as $localname=>$content)
                {
                $zip->addFromString($localname, $content);
                }
        $zip->close();
*/

        $limit    = 100 * 1024 * 1024;  // ~100M
//      $path  = "php://memory/maxmemory:$limit";
//      $filename = "/tmp/xxx.zip";
        //$path = sys_get_temp_dir();
        $path     = "php://temp/maxmemory:$limit";
        $filename = tempnam($path, 'memoryZipProjekty');
        $zip      = new self();
        $opened   = $zip->open($filename, $flags);
        if( $opened !== true )
                {
                die("cannot open {$filename} for writing.");
                }
        // add files in dirs from disk, recursive
        $zip->addTree($dirname, $localname);
        // add files from content (additional files)
        if (is_array($addfiles))
                {
                foreach($addfiles as $localname=>$content)
                        {
                        $zip->addFromString($localname, $content);
                        }
                }
        $zip->close();

        // download
        $download = true;
        $download = false;      // ZAKOMENTUJTE
        if ($download==true)
                {
                ob_clean();
                header("Content-Description: File Transfer");
                header('Content-type: application/zip');
                header("Content-Length: " . filesize($filename));
                header('Content-Disposition: attachment; filename="'.$zipFilename.'"');
                header("Content-Transfer-Encoding: binary");
                header("Pragma: no-cache");
                header("Expires: 0");
                echo file_get_contents($filename);
                unlink($filename);
                exit;
                }
        else    {
                unlink($filename);
                }

//      echo stream_get_contents($zip);
//  if (file_exists($filename)) {
//     unlink($filename);
//     readfile($filename);

        }
}

Zkusil jsem: .

Chci docílit: .

 
Odpovědět
18.12.2020 12:44
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:19.12.2020 17:45

Vcera jsem nemel moc cas to popsat. A jeste k tomu patri export funkce, ktera je take stejna. A ten radek vypise prikaz $zip->close();.

public function exportDb($filename_prefix="hraward_zaloha")
        {
        $time     = date('Y-m-d-H-i-s', time());
//      $zipname  = './tmp/archive_'.$time.'.zip';
        $zipname  = '.'.$filename_prefix.'_'.$time.'.zip';      // tady byla na zacatku '.' + name, nevim proc
        $cfg_str  = file_get_contents('./inc/cfg_inc.php');
        $cfg_str  = preg_replace('~\=\> \'[^\']+\'~', '=> \'\'', $cfg_str);
        $db_str   = $this->SQL->exportDb();
//var_dump($db_str);
        $addfiles = array(
                'inc/cfg_inc.php'    => $cfg_str,       // vymaz cfg
                'sql/mysql_dump.sql' => $db_str
                );
//      echo '<pre>'.$db_str;
        ExtendedZip::zipTree('.', $zipname, ZipArchive::CREATE, '', $addfiles);
//      ExtendedZip::zipTree('./css', $zipname, ZipArchive::CREATE, '', $addfiles);
//$mime = "application/x-gzip";
//header( "Content-Type: " . $mime );
//header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
        exit();
        }

Jde o to, ze stejny kod mam ve 2 php programech, ktere jsou hodne podobne, ale jine.
Oba spoustim localhost, stejna db, jine tabulky, jine adresare souboru. Jiny kod ostatniho programu.
Script provadi export db, expor souboru, zipuje to, posila uzivateli.
Jeden program vrati zip 11MB, druhu zip 0B.
Vubec mi to nedava smysl.

Zatim mne napadaji tyto mozne priciny, ale netusim, jak by bylo mozne, ze to ma vliv:

  1. jsou rozdilne soubory, je tam nejaky soubor, na kterem php-zip umre
  2. nejaky vnejsi kod nejakym zpusobem zasahuje dovnitr
  3. mozna to narazi na limit pametinebo neceho (nicmene soubory programu 2 jsou celkove mensi
  4. jeste by do toho mohl zasahovat nejaky header() nebo neco, ale to snad ne?
  5. Je mozne, ze win mel nekde nejaky soubor otevreny, vytvoril nad nim zamek. Ale zip by pri pokusu addFile preci vyhlasil false, a to se nestalo. A i tak by to nebyl duvod, proc nedovolit zavrit zip. Proste by tam jen bylo o 1 soubor mene.

Zkusil jsem si vypsat prave tu chybu ziu a ten vrati totec, co je v te php hlasce
"Read error: No error"

Zkusil jsem var_dump($zip) a ten vypise, ze tam je 287 souboru, ze je to ulozeno v c:\neco\temp\sou­bor.tmp. Ale, kdyz po zip->close zkusim ziskat filesize, tak mi napise 0.

Nenarazil jste nekdo pri php-zipovani na takovou chybu? Dost spatne se to googluje.
"Read error: No error" a pritom php vyhodi warning, takze nejaky error asi nastane. A nejde precist soubor z pameti, takze zip si soubor stale blokuje protoze neni uzavreny.

Fakt netusim, co mam hledat, proc selhalo zavreni zipu, ikdy evidentne tam soubory ma. Jak ty z disku, tak z databaze.

 
Nahoru Odpovědět
19.12.2020 17:45
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.12.2020 13:36

Tohle je vypis.

echo '<br>numFiles = '. $zip->numFiles.'<br>';
echo '<hr>'; var_dump($zip->getStatusString()); echo '<hr>';
        $success = $zip->close();
echo '<hr>'; var_dump($zip->getStatusString()); echo '<hr>';
var_dump(file_get_contents($filename));

numFiles = 292

string(8) "No error"

Warning: ZipArchive::close(): Read error: No error in C:\xampp\htdocs\www\ev2c_hraward\inc\class_app_evid2c.php on line 2041

Warning: ZipArchive::getStatusString(): Invalid or uninitialized Zip object in C:\xampp\htdocs\www\ev2c_hraward\inc\class_app_evid2c.php on line 2042
bool(false)

string(0) ""

Cili, evidentne se to uzavre, ale z nejakeho duvodu vrati zip pradny vysledek, asi selze close.
Spis je zvlastni, ze na tom samem pc ten samy kod, v jinem php programu a bez problemu :)

Na localhostu mam

System  Windows NT DESKTOP-J96VK8S 10.0 build 19041 (Windows 10) i586
Build Date      May 23 2018 20:26:19
Compiler        MSVC15 (Visual C++ 2017)
Architecture    x86
Server API      Apache 2.0 Handler
PHP API         20170718
PHP Extension   20170718
Zend Extension  320170718
Zend Extension Build    API320170718,TS,VC15
PHP Extension Build     API20170718,TS,VC15
Apache Version  Apache/2.4.33 (Win32) OpenSSL/1.1.0h PHP/7.2.6
Apache API Version      20120211
 
Nahoru Odpovědět
20.12.2020 13:36
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:22.12.2020 22:16

Tak jsem zkousel tam pridat omezeni na pocet souboru. Pulil jsem interval a dosel k cislu 130. Tam je nejaky jpeg, co ma neco spatne. Ten jsem prepsal. Hloupy, nezazalohoval ten vadny :) Ale i tak ten novy je vytvoreny v adobe ilustrator a ma divne systemove datum. jedno z tech ctyr. ostatni jsou spravne. Bud bylo prazdne nebo tam je 31.12.1979 (nebo 30 nebo, kolik ma ten mesic dnu). Divne, ze by na tom php-zip zhavaroval, ale po nahrazeni mi to proslo :)

 
Nahoru Odpovědět
22.12.2020 22:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.