Ankündigung

Einklappen
Keine Ankündigung bisher.

Arbeitsspeicher Problem

Einklappen

Neue Werbung 2019

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

  • Arbeitsspeicher Problem

    Hallo!

    habe nun Danke der Hilfe von karl-150 ein Skript, das bestimmte Dateien vom FTP sichert.

    Nun kommt aber folgende Meldung, wenn ich es ausführe:
    Fatal error: Allowed memory size of 26214400 bytes exhausted (tried to allocate 6236457 bytes) in /www/htdocs/xxxxx/phpBB2/includes/functions_packer.php on line 316
    Diese functions_packer.php beinhaltet eine Klasse mit tar-, zip- und gzip-Funktionen, welche ich von hier habe:
    http://www.php-resource.de/forum/sho...threadid=15186

    Das Skript funktioniert, da ich es vorher mit anderen, zu sichernden Ordnern getestet hatte. Aber sobald ich mehr Ordner packen will, dann kommt diese Meldung.

    zuerst hatte ich es so eingestellt, daß jeder gewünschte Ordner einzeln in eine TAR gepackt wird und am Ende dann erst eine tar.gz daraus gemacht wird. Da kam auch die Meldung.
    OK, dachte ich. Mach ich halt pro Ordner eine tar.gz. Also habe ich die gzip-funktion in die Schleife eingefügt, aber die Meldung kommt dennoch.

    Einzeln funzt es ja, aber wenn ich mehrere Ordner einzeln(!) packe und als gzip speichere, dann zählt der die trotzdem irgendwie zusammen, obwohl ja die ersten paar tar.gz-Dateien auf dem FTP landen.

    Wo habe ich hier den Denkfehler oder ist das normal?
    Den verfügbaren Speicher kann wohl nur der Provider erhöhen, oder? (habe nur einen Webspace, keinen Server)

    Hier der Code meines Skriptes:
    Code:
    <?php 
    define('IN_PHPBB', true); 
    $phpbb_root_path = './../../phpBB2/';  
    include($phpbb_root_path . 'extension.inc'); 
    include($phpbb_root_path . 'common.'.$phpEx);
    $userdata = session_pagestart($user_ip, PAGE_INDEX); 
    init_userprefs($userdata); 
    $page_title = 'Backup-Zentrale'; 
    include($phpbb_root_path . 'includes/page_header.'.$phpEx); 
    include($phpbb_root_path . 'includes/functions_packer.'.$phpEx); 
    
    #if( ($userdata['session_logged_in']) and ($userdata['user_level'] == ADMIN) )
    #{
    
    if ( isset($HTTP_POST_VARS['mode']) || isset($HTTP_GET_VARS['mode']) )
    {
    	$mode = ( isset($HTTP_POST_VARS['mode']) ) ? $HTTP_POST_VARS['mode'] : $HTTP_GET_VARS['mode'];
    	$mode = htmlspecialchars($mode); 
    }
    else
    {
    	$mode = '';
    }
    
    # Ordner auslesen
    function show_all_files($path = '.', $sub = FALSE) {
      static $folder;
      $files = glob($path.'/*', GLOB_ONLYDIR);
      if (is_array($files)) {
        foreach ($files  as $file) {
          $folder[] = $file;
          if ($sub)
            show_all_files($file, TRUE);
        }
        return $folder;
      }
      return FALSE;
    }
    
    # allgemein
    if ($mode == "")
    {
    	echo "Allgemein";
    }
    
    # mode = 1 (alle Dateien in /phpBB2/)
    if ($mode == 1)
    {
    	$folder = show_all_files($phpbb_root_path,TRUE);
    	$count = count($folder);
    
    	$suche = array('phpBB2');
    	$flags['recursed']=0;
    	$backup = new tarfile($_SERVER['DOCUMENT_ROOT'],$flags);
    	$c = 0;
    	$a = 0;
    	while ($c < $count)
    	{
    		$folder[$c] = "phpBB2/" . str_replace("./../../phpBB2//", "", $folder[$c]);
    		$co = count($suche);
    		$x = 0;
    		while ($x < $co)
    		{
    			$pos = strpos ($folder[$c], $suche[$x]);
    			if ($pos === false)
    			{
    			}
    			elseif ($pos == 0)
    			{
    			$a++;
    			$filelist = array($folder[$c]);
    			echo "verarbeite " . $folder[$c];
    			$backup->adddirectories($filelist);
    			$backup_zip = new gzfile($_SERVER['DOCUMENT_ROOT'].'_backup/zentrale/',$flags);
    			$backup_zip->addfile($backup->getdata(),'backup.tar');
    			$backup_zip->filewrite('backup_'.date('d_m_Y_H_i_s',time()).'__'.$a.'.tar.gz',0755);
    			echo " - fertig!
    ";
    			}
    			$x++;
    		}
    		$c++;
    	}
    }
    
    #$template->set_filenames(array('body' => 'admin/backupzentrale.tpl'));
    #$template->pparse('body');
    #}
    
    include($phpbb_root_path . 'includes/page_tail.'.$phpEx); 
    ?>
    und hier noch ein Link zu der functions_packer.php:
    http://www.gumfuzi.com/diverses/func...packer.php.txt

    Danke für eure Tipps!

  • #2
    tja, sagen wir es so, die datei ist viel zu groß, ich mein dass schon 26 mb speicher belegt sind steht ja da und dass er nochmal mehr als 6 mehr will steht auch da ...
    link auf phpinfo ?
    wie viel bietet dir denn dien hoster, ich mein 26 hinzubekommen ist schon viel die meisten hoster bieten 8 MB. ansonsten schauen ob man auf ein shell-programm umsteigen kann soweit ich weis kann php mit seinen gzipfunktionen keine on the fly kompression mit ausgabe ins dateisystem ...

    somit wärst du an den grenzen deines webspaces angelangt.

    mfg
    robo47
    [URL="http://www.robo47.net"]robo47.net[/URL] - Blog, Codeschnipsel und mehr
    | :arrow: [URL="http://www.robo47.net/blog/192-Caching-Libraries-and-Opcode-Caches-in-php-An-Overview"]Caching-Klassen und Opcode Caches in php[/URL] | :arrow: [URL="http://www.robo47.net/components"]Robo47 Components - PHP Library extending Zend Framework[/URL]

    Kommentar


    • #3
      Hi!

      Hier der Link:
      http://www.gumfuzi.com/diverses/info.php

      Ich dachte eben, daß wenn ich jeden Ordner einzeln packe und einzeln abspeichere (jeder Ordner wird als eigene Datei gespeichert, bevor der nächste Ordner gepackt wird), daß ich die 26MB-Marke nicht erreiche. Aber es wird trotzdem zusammengezählt. Warum? Wird der benutzte Speicher immer addiert, solange es innerhalb des selbes Scriptes passiert?

      Den Speicher erweitern wird nicht gehen, weil alles Dateien ca. 100MB haben...

      Kommentar


      • #4
        Tritt das Problem auch auf, wenn du nur eine Datei packst, oder nur, wenn du mehrere Dateien nacheinander gepackt werden sollen? Wenn letzteres der Fall ist, kannst du vermutlich nach jedem Packen nicht mehr benötigten Speicherplatz von Variablen mit unset() wieder freigeben.

        Kommentar


        • #5
          Was macht die Funktion show_all_files?
          a)Warum werden alle Einträge aus $files nochmal in $folder übertragen?
          b) Der Rückgabewert beim rekursiven Aufruf if ($sub) show_all_files($file, TRUE); wird nicht verwendet. Was hat das dann überhaupt für einen Sinn?

          Was für Klassen sind tarfile und gzfile? Kommen die auch von phpBB?

          Kommentar


          • #6
            @Bruchpilot:
            die show_all_files gibt die Ordnerstruktur des FTP's innerhalb eines Verzeichnisses. Das brauche ich, damit ich eine Liste aller Ordner habe, welche dann mit den Ordnern verglichen wird, die zu sichern sind.

            zu a) und b):
            schwer zu sagen, aber so funzt es auf alle Fälle mal (die Ordnerliste)

            @xabbuh:
            ist nur, wenn ich mehrere Ordner packe. Ich habe es schon mit 3-4 kleinen Ordnern probiert, da funzte es super. nur wenn es einige mehr sind, dann kommt die Meldung.
            Das mit dem "unset" ist eine gute Idee, die ich gleich mal testen werde, danke.
            (dachte nicht daran, die Var zu leeren...). Genügt das unset() bei "backup" und "backup_zip"? Ich probiere es mal so.

            Kommentar


            • #7
              ach herje, das static $folder; habe ich übersehen. Was für ein Quatsch. Naja, wenn's "funktioniert" bitte.

              Bleibt aber immer noch die Frage:
              Was für Klassen sind tarfile und gzfile? Kommen die auch von phpBB?

              Kommentar


              • #8
                Die kommen nicht von phpBB.
                (habe die functions_packer.php im ersten Posting verlinkt)

                Ich habe es inzwischen gelöst:
                die Zeile:
                PHP-Code:
                <?php
                $backup 
                = new tarfile($_SERVER['DOCUMENT_ROOT'],$flags);
                ?>
                muss auch in die Schleife rein, sonst wird nie eine neue TAR begonnen *lol*
                Nun funzt es! *freu*

                *edit*
                der Rest gehört nicht mehr in diesen Thread, da es ein neues Problem ist

                Kommentar

                Lädt...
                X