SpeicherProblem mit fread()

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

  • SpeicherProblem mit fread()

    Hi,

    Ich verwende das folgende Script, um daten aus einer datei (myfile.dat) zu laden und dann gleich wieder in eine andere datei zu speichern (myfile1.dat); d.h. quasi, dass ich die datei kopiere.

    PHP-Code:
    $fs=fopen("myfile.dat","r"); 
    $fd=fopen("myfile1.dat","w"); 
    $buffer_size=4096
    $buffer fread($fs,$buffer_size); 
    while (!
    feof($fs)) 

    fwrite($fd,$buffer); 
    $buffer fread($fs,$buffer_size); //Problem HERE 

    fclose($fs); 
    fclose($fd); 
    Wenn ich jedoch dass Script auf einem Server mit der standart 8MB PHP-Speicherbegrenzung laufen lasse, dann bekomme ich diese Fehlermeldung:
    "Allowed memory size of 8388608 bytes exhausted (tried to allocate 8192 bytes)" (Problem HERE).

    Warum braucht diese Funktion so viel Speicher?

    Eigentlich müsste der obere code so funktionieren:
    ein datenpacket wird in den speicher geladen, und in die zweite datei geschrieben. das wird sooft wiederholt bis EOF erreicht ist.

    ich hoffe, dass ihr mir weiterhelfen könnt,
    Zuletzt geändert von IWeb; 29.06.2002, 14:34.
    Money making - Find the right advertisers
    Earn money
    FXP&PHP

  • #2
    BufferSize heisst einmal $buffersize und einmal $buffer_size. Ich schätz mal, $buffer_size ist undefiniert, also gleich null, und fread versucht deshalb immer die ganze Datei auf einmal zu lesen und verschluckt sich.

    Kommentar


    • #3
      Nur ein Hinweis die Antwort von Pekka erklärt ja schon den Fehler

      Ich würde das
      $buffer = fread($fs,$buffer_size);

      vor der Schleife rausnehmen und die Schleife in der natürlichen Reihenfolge aufbauen ... :

      PHP-Code:
      while (!feof($fs)) { 
         
      $buffer fread($fs,$buffer_size);
         
      fwrite($fd,$buffer); 

      carpe noctem

      [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
      [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

      Kommentar


      • #4
        buffer_size habe ich nur hier im forum falsch geschrieben.
        in meinem script heißen alle variablen buffer_size und nicht buffersize...

        goth, deinen vorschlag habe ich natürlich gleich verwendet (frag mich nicht warum ich das nicht gleich so gemacht habe wie du ).
        Leider hat das aber nichts mit dem Speicherproblem zu tun
        Zuletzt geändert von IWeb; 29.06.2002, 14:51.
        Money making - Find the right advertisers
        Earn money
        FXP&PHP

        Kommentar


        • #5
          Memory Limit ist in der php.ini zu definieren:
          Code:
          ;;;;;;;;;;;;;;;;;;;
          ; Resource Limits ;
          ;;;;;;;;;;;;;;;;;;;
          
          max_execution_time = 30     ; Maximum execution time of each script, in seconds
          memory_limit = 8M      ; Maximum amount of memory a script may consume (8MB)
          PHP-Code:
          $file_i      "myfile.dat";
          $file_o      "myfile1.dat";
          $buffer_size 4096

          $fs=fopen($file_i,"r"); 
          if (!
          $fi) {
              print 
          "File $file_i doesn't exist<br>\n";
          } else {
              
          $fo=fopen($file_o,"w"); 
              while (!
          feof($fi)) { 
                  
          $buffer fgets($fi,$buffer_size); 
                  
          fwrite($fo,$buffer);
              }
              
          fclose($fi); 
              
          fclose($fo);

          Alternativ dazu, u.U. ist copy etwas resourcenschonender:
          PHP-Code:
          $file_i      "myfile.dat";
          $file_o      "myfile1.dat";

          unlink($file_o);
          if (!
          copy($file_i$file_o)) {
              print (
          "failed to copy file - Source: $file_i / Destination: $file_o<br>\n");

          http://www.php.net/manual/de/function.copy.php

          Kommentar


          • #6
            danke.
            Mit dem Erhöhen des Speichers löst man das Problem jedoch nicht, sondern man umgeht es nur.

            Aber anscheinend cached PHP alles im Speicher, selbst wenn es schon auf die HD geschrieben ist...

            Die Copy funktion ist auch sehr interessant, aber erst ab PHP 4.3 werden URLs unterstützt...
            ... und bei meinen Hosts ist nur PHP 4.1.x installiert.
            Money making - Find the right advertisers
            Earn money
            FXP&PHP

            Kommentar


            • #7
              Mit exec(), system() oder dem Backtick-Operatoren können, soferne freigeschaltet, ebenso Filesystemoperationen durchgeführt werden.

              Kommentar


              • #8
                PHP 4.3.0 wirst Du wohl im moment noch bei keinem Provider bekommen ... !
                carpe noctem

                [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                Kommentar


                • #9
                  ist ja auch noch im Beta Stadium
                  Money making - Find the right advertisers
                  Earn money
                  FXP&PHP

                  Kommentar

                  Lädt...
                  X