Kopiervorgang zu langsam

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

  • Kopiervorgang zu langsam

    Hallo.

    Ich versuche mittels "copy" Dateien (über 200) von einem verzeichnis ins andere zu kopieren und gleichzeitig umzubennen.

    Nun ist jedoch mein Problem, dass wenn ich die Seite aufrufe, in welcher ich die Copyfunktion reinprogrammiert hat, das Script selbst so schnell ist, aber kopiervorgang langsamer, und somit statt alle 250 files nur z.b. 90 files kopiert werden.

    Gibt es hier bessere Lösunsansetzte als das copy?
    Oder auch gleichzeig schnellere?

  • #2
    Die copy-Funktion ist synchron. Wenn der Interpreter sie ausführt, wartet er, bis sie fertig ist. Erts dann wird weiterer PHP-Code ausgeführt. Was du da schilderst, kann also nicht wahr sein oder ich habe dich falsch verstanden.

    Kommentar


    • #3
      Hallo,

      wenn du Daten verschiebst, geht es schneller, aber ich denke mal, du wirst die Originale auch noch brauchen, sonst hättest du ja nicht copy genommen. Daher: Nein, viel schneller wird es nicht.

      Werden nur 90 Dateien kopiert, weil dann die maximale Skriptlaufzeit erreicht ist? Das kannst du verhindern, indem du nach jedem copy-Aufruf
      PHP-Code:
      set_time_limit(60); 
      aufrufst. Damit kannst du die Skriptlaufzeit immer wieder auf eine weitere Minute verlängern.

      Gruß,

      Amica
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #4
        @ onemorenerd

        Ist jedoch so...
        Ich frag nach jedem Copyvorgang ifexist $filename, wo mir bei fasst allen geschrieben wird "Gibt es noch nicht".
        Erst wenn ich den Code mit sleep(1) stoppe, bekomme ich die Meldung, dass das $filename nun existiert.

        Somit kann deine Aussage mit "Erts dann wird weiterer PHP-Code ausgeführt" nicht stimmen.

        Ich denke, dass er kopiert, und der anschließende Code nicht abwartet, ob es nun wirklich schon kopiert wurde. (was schön wäre)
        Sonst würden mir nicht so viele Datein verloren gehen.

        Zudem habe ich genau darunter ein insert, welches in die DB den Namen der Datei einträgt.
        Hier bekomme ich (wenn ich ein Count über die Tabelle lege) die gleiche Anzahl an Zeilen zurück, wie Files zu kopieren gewesen wären, was wiederum mit dem Ordner wo die kopien abgelegt wurden nicht übereinstimmt.
        Sprich: (vorlangenordneranzahl == db_count) != kopierordneranzahl

        Bekräftigt meine Meinung...
        Copy wartet nicht bis die Datei wirklich kopiert wurde, sonder führt Code einfach aus.
        Ist Kopiervorgang zu langsam gewesen... Pech und er mach einen neuen Kopiervorgang...
        Datei kommt nicht mehr nach

        Wenn ich jedoch jedesmal den Code mit sleep(1) stoppe, schaff ich in einer Stunde max 3600 Datei.
        Viel zu langsam, wenn mir diese Menge Pro Sekunde passieren könnte.

        @ AmicaNoctis

        Die Originale sind mir egal, wenn ich damit zu 1000% garantieren kann, dass alle in dem Ordner verschoben und umbenannt wurden.
        Wobei ich hier sogar, selbst wenn Sie nicht umbenannt wären, im Anschluss noch einmal Prüfen könnte und nochmals versuchen könnte mit einem anderen Namen zu versehen.
        Ich lösch so oder so im Anschluss (wenn alles geklappt hat) die Files aus dem Vorlagenordner.

        Nur wie mach ich das...
        Move denk ich mal klingt gut aber falsch.
        Da komm ich immer nur in Foren wo wiederum steht, so wie ich es mache... Zuerst copy dann unlink.

        Oder meinst du rename?
        Würde das dann so funktionieren:
        PHP-Code:
        rename("./vorlangenordner/$old_filename""./zielordner/$new_filename"); 
        P.S. set_time_limit(60); Ist ein Wertvollerhinweis, welchen ich wo anders noch brauchen kann
        Vielen Dank!

        Kommentar


        • #5
          Zitat von iBumsti Beitrag anzeigen
          Ich frag nach jedem Copyvorgang ifexist $filename, wo mir bei fasst allen geschrieben wird "Gibt es noch nicht".
          Erst wenn ich den Code mit sleep(1) stoppe, bekomme ich die Meldung, dass das $filename nun existiert.
          Glaub mir, copy returned erst wenn es fertig ist. Fertig heißt, es hat vom Filesystem eine Bestätigung oder Fehlermeldung erhalten.
          Ich weiß nicht, was du mit ifexist meinst. file_exists()? Dann wäre statt sleep vielleicht clearstatcache angebracht.

          Zeig mal den Codeabschnitt, mit dem du kopierst.

          Übrigens wäre rename wirklich passender als copy. Kehrt übrigens auch erst zurück wenn es fertig ist. Löst also dein Problem nicht, erspart dir aber unlink-Operationen.

          Kommentar


          • #6
            Nein
            rename kann gut verschieben... Aber sobald ich wie bei Copy einen Namen verändere, gibts wieder probleme.

            1 zu 1 kopieren oder verschieben, funktiontioniert super... Aber so nicht:

            edit:
            "Versuch es so:
            Erzeuge 4000 PDF Datein und versuch sie zu kopieren und gleichzeitig einen anderen namen zu verpassen, ob bei dir alles funktioniert.";

            PHP-Code:
            // Von wo nach wohin soll kopiert werden?
            $copy_from_order "./test";
            $copy_in_order "./../../pdf";

            $verzeichnis openDir("./test"); // Öffnet ein Unterverzeichnis mit dem Namen "test"
                
            while ($file readDir($verzeichnis)) { // Verzeichnis lesen
                    
            if ($file != "." && $file != "..") { // Höhere Verzeichnisse nicht anzeigen!
                        
            if ((strstr($file".pdf")) OR (strstr($file".PDF"))) { // Dateityp filtern. Es werden nur .pdf-Dateien angezeigt
                            
            $name explode("."$file);  // Dateiendung vom Dateinamen filtern
                            
                            
            $trenne_file=explode(".",$file); // Datei wird von ".PDF" getrennt
                            
            $filename=$trenne_file[0];
                            
            $pdftyp=$trenne_file[1];

                            
            $trenne_filename=explode("_",$filename); // Dateiname wird aufgespittet
                            
            $zusatz_id=$trenne_filename[0];
                            
            $userid=$trenne_filename[1];
                            
            $tbo_id=$trenne_filename[2];
                            
            $saftycode=$trenne_filename[3];

                            
            $timestamp time ();
                            list(
            $usec,$sec) = explode(    " "microtime());
                            
            $millisec substr("$usec"2, -2);
                            
                            
            $gencode "$timestamp$millisec";
                            
            $c_site_code md5($gencode);
                            
            $site_code=$c_site_code;
                            
            $pdftimestamp=md5($c_site_code+1111);
                            
            $site_code_file="$pdftimestamp.pdf";
                                    
                                
                            
            // Kopiere die Datei
                            
            if (copy("$copy_from_order/$file""$copy_in_order/$site_code_file")) {
                                
            // sleep(0.5);
                                
            echo "Kopiert";
                                
            mysql_query("
                                    INSERT INTO `tabelle` (
                                        `id`, 
                                        `userid`, 
                                        `zusatz_id`, 
                                        `tbo_id`,
                                        `site_code`
                                    )VALUES(
                                        '', 
                                        '
            $userid', 
                                        '
            $zusatz_id', 
                                        '
            $tbo_id', 
                                        '
            $saftycode'
                                    )
                                "
            );
                                if (
            file_exists($filename)) {
                                                        
                                    
            // Lösche die Datei
                                    
            if (@unlink("$copy_from_order/$file")) {
                                        echo 
            "Gelöscht";
                                    } else {
                                        echo 
            "Fehler beim Löschen!";
                                    }
                                    
                                    echo
            " <b>--> Alles OK</B>";
                                } else {
                                    echo
            " <b>--> NICHT GUT NOCHMAL</B>";
                                    if (
            copy("$copy_from_order/$file""$copy_in_order/$site_code_file")) {
                                        echo 
            "Kopiert";
                                    }else{
                                        echo 
            "Fehler beim Import!";
                                }

                                
                            }else{
                            
            // Nichts machen...
                            
            }
                        }
                    }
                }
            closeDir($verzeichnis); // Verzeichnis schließen 
            Zuletzt geändert von iBumsti; 10.12.2009, 19:05.

            Kommentar


            • #7
              Zitat von onemorenerd Beitrag anzeigen
              Übrigens wäre rename wirklich passender als copy. Kehrt übrigens auch erst zurück wenn es fertig ist. Löst also dein Problem nicht, erspart dir aber unlink-Operationen.
              Erspart auch (unter normalen Umständen) das Umkopieren der Dateiinhalte.
              Statt KB- oder gar MB-weise erst umzukopieren, braucht eine Umbenennung nur einen FAT-Eintrag umhängen/neu schreiben, und kann die Daten dabei an Ort und Stelle belassen. Das dürfte sich bei entsprechender Menge an Operationen auch in der Geschwindigkeit bemerkbar machen.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Was $filename wohl enthält, wenn es file_exists() übergeben wird?

                Kommentar


                • #9
                  Zitat von onemorenerd Beitrag anzeigen
                  Was $filename wohl enthält, wenn es file_exists() übergeben wird?
                  Da hast du wohl recht.

                  Löst aber immer noch nicht mein generelles Problem, dass ALLE DATEN tatzächlich teilweise gar nicht kopiert wurden / werden bzw. gilt dies auch für die Funktion rename. (schon probiert)

                  Wenn ich mit rename die Daten verschiebe und umbenenne, habe ich den Effekt, dass er mir weit mehr als mit copy abarbeitet jedoch nach rund 100 - 600 Datein abbricht.
                  Error sagt aus, dass es den Namen schon einmal gibt.
                  Kann doch gar nicht sein?!?!
                  Ich hab als Dateinamen md5 UND timestemp + millisec ganz ganau.
                  So schnell kann nie im Leben etwas abgearbeitet werden.
                  Zur Info $millisec = substr("$usec", 2, -2);
                  Die letzten zwei Zeichen sind eh immer 00 daher -2


                  Wenn ich jedoch hergehe, und die Daten nur verschiebe, läuft alles perfekt.

                  Meine Schlussfolgerung:

                  Entweder gibts doch noch eine Lösung dafür
                  ODER
                  ich muss die zwei Schritte dann leider einzeln durchführen lassen.
                  Das funktioniert auch, wenn man das Script oft laufen lässt.
                  Mit einer Schleife die Prüft ob ein Fehler kam und wenn ja wiederholen eigentlich kein Problem.

                  Nachteil:
                  Ein weiterer Cronjob und ein weiteres Kriterium auf welches geachtet werden muss und..
                  Der Ordner PDF wird immer größer daher wird bei mein Plan (wenn es so sein muss) die Auslastung immer höher, weil immer alles Überprüft werden muss.

                  Daher:
                  1) Script ausführen und ohne umbenennung verschieben.
                  2) Verschobene Objekte im Nachhinein umbenennen solange bis keine Datei mehr einen _ hat.
                  = if _ trifft zu dann umbenennen.

                  Bei 1.000.000 Daten dann echt schlimm

                  ODER

                  1) Script1 --> ausführen und ohne umbenennung verschieben in einem Zwischenordner
                  2) Script2 --> Zwischenordner alle Daten umbenennen und...
                  3) Script3 --> Verschiebe alle umbenannten Datein.

                  3 Cornjobs die ich mir eigentlich ersparen wollte, aber anscheinend die sicherste Variante sind.

                  Andere Vorschläge oder Lösungsansätze?

                  EDIT P.S.: Werde auch in Zukunft mit RENAME arbeiten.
                  Script schon so angepasst, da es eindeutig Vorteile hat, nicht zu kopieren.
                  Allein schon die CPU Auslastung hat mir überzeugt
                  Zuletzt geändert von iBumsti; 11.12.2009, 12:50.

                  Kommentar


                  • #10
                    Zitat von iBumsti Beitrag anzeigen
                    Error sagt aus, dass es den Namen schon einmal gibt.
                    Kann doch gar nicht sein?!?!
                    Die Frage ist in solchen Fällen für mich immer: Investiere ich mehr Zeit in meine "kann doch gar nicht sein"-Überlegung - oder glaube ich PHP/dem OS das einfach mal, und schaue mich nach einer passenderen Lösung um ...?

                    Ich hab als Dateinamen md5 UND timestemp + millisec ganz ganau.
                    So schnell kann nie im Leben etwas abgearbeitet werden.
                    Da würde ich mir gar nichts selber für basteln, sondern gleich uniqid für nutzen. In diesem Falle noch mit dem more_entropy-Parameter auf true, da Millisekunden ja ggf. problematisch werden können.

                    Wenn ich jedoch hergehe, und die Daten nur verschiebe, läuft alles perfekt.
                    Wie, ich dachte du nutzt jetzt schon rename, und bekommst dabei das Problem? Was sonst, wenn nicht rename, verstehst du jetzt unter "verschieben"?
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      zu Teil 1:
                      Da hast du Recht und das war eigentlich eine allgemeine Frage ob das überhaupt sein kann.
                      Welche ich wenn ich den Tipp aus Teil 2 gekannt hätte, gar nicht gebraucht hätte (vermute ich, muss ich aber erst testen).
                      Hab mir das mal angeschaut, anhand deines Links und finde es ein gute Lösung.
                      Schade nur, dass ich die investierte Zeit nicht wieder bekomme.

                      Zu Teil 2:
                      Wie gesagt... Kannte ich nicht... anke:

                      Zu Teil 3:
                      Nein hätte ich eigentlich nicht so verstand, dachte aber auch das ich was besseren belehrt wurde.
                      Was stimmt nun?

                      Ich hätte unter RENAME auch RENAME sprich umbenennen verstanden.
                      Eigentlich habe ich nach etwas wie move gesucht.
                      Konnte hier jedoch nichts brauchbares finden

                      Und ja.. Ich benutze schon RENAME im Test,
                      Ja... Macht auch Probleme wie Copy...
                      ABER... weniger als bei der Copyfunktion.

                      Ich vermute, dass wenn es etwas wie MOVE und oder SHIFT gibt, ich auch nur dass damit machen kann, und es nicht für eine gleichzeitige Namensänderung gemacht wurde.
                      Daher ist RENAME doch eine gute Lösung oder?

                      Wenn nein... Ich hab echt beide Augen offen und bin für neues und besseres zu haben

                      Kommentar

                      Lädt...
                      X