Autor Zpráva
Haky
Profil *
Chtel bych vas poprosit o radu.
Mam web www.sportovnivozy.cz a pracuju na zalohovani.

Nasel jsem na internetu navod, jak rekurzivne prochazet adresare, ale narazim na problem s pameti.
Pokousim se pomoci knihovny zip.lib.php zabalit 8 souboru (kazdy z nich ma 100 MB), ale vypise mi to chybu:

Fatal error: Allowed memory size of 64782216 bytes exhausted (tried to allocate 4064010 bytes)

U malych souboru to funguje bez problemu.
Jde toto nejak osetrit, pripadne pouzit jinou knihovnu, ktera pracuje lepe s pameti?

Dekuji za pomoc.
Haky
Profil *
Prikladam kod, ktery pouzivam:

$dir="data";
$zip_name="zaloha.zip";

function get_files($dir)
{
	
  $file_array = array();
  // Read directory
  $handle = opendir($dir);
  while (false !== ($file = readdir($handle))) {
    if ($file != "." && $file != "..") {
      if (is_dir($dir.'/'.$file)) {
        //recursive read directory and append array values
        $return_array = get_files($dir.'/'.$file);
        $file_array[] = $dir.'/'.$file.'/';        
        $file_array = array_merge($file_array, $return_array);
      } else {
        $file_array[] = $dir.'/'.$file;
        //echo $dir.'/'.$file."<br>";
      }
    }
  }
  closedir($handle);
  return $file_array;	
}

function pack_it($dir,$files,$names)
{
	$zip = new zipfile();
	
	if (count($files)!=count($names)) $names = $files;
	for($i=0;$i<count($files);$i++)
	{
    
    if( is_dir( $files[$i] ) )
    {
      $zip->addFile("",$names[$i]);
    }
    else
    {
  		$fp=fopen($files[$i],"rb");
  		$part_content=fread($fp,filesize($files[$i]));
  		fclose($fp);
  		
     	$zip->addFile($part_content,$names[$i]);
    }
		
		
	}
	$content=$zip->file();
	return $content;
}

function save_it($content,$zip_name)
{
	$fp=fopen(dirname(__FILE__).'/'.$zip_name,"wb");	
	fwrite($fp,$content);
	fclose($fp);
	echo "Zaloha vytvorena.";
}

function download_it($content,$zip_name)
{
  header("Content-Type: application/x-zip");
  header("Content-disposition: attachment; filename=$zip_name");
	echo $content;
	
}

$files=get_files($dir);

$zip_content=pack_it($dir,$files,$files);
//download_it($zip_content,$zip_name);
save_it($zip_content,$zip_name);
Haky
Profil *
Opravdu moc prosim o radu, nebo jakykoliv jiny zpusob zabaleni celeho webu pro archivaci (zaloha.zip) a nasledne stazeni jednoho souboru pres ftp nebo http.
Jsem v tomto amater, tak budu vdecnej za jakoukoliv radu.

Diky moc!
Mike8748
Profil
moznost a) rekni si na hostingu, at ti zvesti memory limit (malo pravdepodobne)

moznost b) nedelej tak velky soubory (100mb je fakt dost velky)

moznost c) pred zabalenim souboru ten soubor rozkouskuj treba na 1mb velky, ty pak zabal

btw: kdyz tam mas pristup na ftp, proc to normalne nestahnes? neni jedno jestli se stahuje 1 nebo 10 souboru?
Haky
Profil *
Mike8748: diky za odpoved.
a) mam to u pipni, uz mi zvedli z 16 na 64MB, ale to bohuzel neni reseni
b) nejde ani tak o velike soubory, spadne to i kdyz balim 10x100MB soubor, tak i kdyz balim 6000x100KB soubory, takze evidentne si ta knihovna nahrava cely vysledny zip do pameti...
c) viz b
k FTP: prave to je nespolehlive, nevim proc, ale kdyz kopiruju treba pres TC pres FTP 6000 souboru, tak se to pravidelne kousne po chvilce kopirovani, zkouseno i na jinem pc s jinym pripojenim...

Nevis prosim jestli existuje nejaky spolehlivy ftp klient, ktery bez problemu obnovi pripojeni a zkopiruje v poradku tech 6000 souboru?
Hlavne aby taky zachoval atributy tech souboru...
Diky moc!
Mike8748
Profil
Haky
>> k FTP: prave to je nespolehlive, nevim proc,
to ti muzu rict proc. protoze Pipni ( sorry, ja vim ze tohle si slyset nechtel)
Medvídek
Profil
Mám stejný problém :( Udělal jsem si script pro stahování fotek z coppermine galerie: ¨¨

<?php 
$server = '';        
$user =   '';
$heslo =  ''; 
$db =   '';
$prefix =  'cpg14x_';
$pripojit=mysql_connect($server, $user, $heslo) or die ('<H2>NENALEZEN MYSQL SERVER, nebo špatně zadané přihlašovací údaje.</H2>');
   $vyber=mysql_select_db($db) or die ('<H2>DATABÁZE nebyla nalezena</H2>');
   
    mysql_query('SET character_set_results=utf8'); 
		mysql_query('SET character_set_connection=utf8');
		mysql_query('SET character_set_client=utf8'); 
$id=$_GET["album"];
$vysledek=mysql_query("SELECT filepath FROM cpg14x_pictures WHERE aid='$id'");
$radek=mysql_fetch_object($vysledek);
$slozka=$radek->filepath;	
 
$slozka="albums/".$slozka;
require "zip.lib.php";
$zip = new zipfile();
$adr=Dir($slozka);



while ($file=$adr->Read())
{
  if (!(($file==".")||($file=="..")||($file=="index.php")||(SubStr ($file, 0, 7)=="normal_")||((SubStr ($file, 0, 6)=="thumb_"))))
  {
    $files[]="$file";
    
  }
}
$adr->Close();
@Sort($files);
$max=SizeOf($files);
for ($i=0;$i<$max;$i++){
  $filename=$slozka.$files[$i];
  $f=FOpen($filename,"r");
  $add_to_zip = fread ($f, filesize ($filename));
  FClose($f);
  $zip->addFile($add_to_zip, "$files[$i]");
    
}
  
  $info="Staženo ze stránek DJTOLA.com dne " . Date("d.m.Y");
  $zip->addFile($info,"_info.txt");
header("Content-Type: application/x-zip");
header("Content-disposition: attachment; filename=".$slozka.".zip");
echo $zip->file();

?>
Bohužel samozřejmě fotek naní málo a téměř vždy to překročí limit 16 MB ... Pokud by mi nezvedli limit na hostingu, dá se to řešit i janak ??? [Za podmínky, že si uživatele ty fotky budou moci stahnout]


Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 6575048 bytes) in /home/www/djtola.cz/subdomains/foto/zip.lib.php on line
Mike8748
Profil
Medvídek
zeptej se na hostingu jestli by ti nezvedli memory limit z 16mega na dvojnasobek
Medvídek
Profil
Pokud to zkoušim u alb, kde je méňe fotek, tak některé jdou v pohodě, některé nikoliv:
http://foto.djtola.cz/stahnout.php?album=4 kdyz dam stahnout, tak se mi to thne behem sekundy a tvrdi, ze je poskozen archiv :(

Kdezto http://foto.djtola.cz/thumbnails.php?album=14 jde v pořádku stáhnout :(

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0