Ankündigung

Einklappen
Keine Ankündigung bisher.

copy Befehl einer .csv Datei dauert über 60 Sekunden

Einklappen

Neue Werbung 2019

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

  • copy Befehl einer .csv Datei dauert über 60 Sekunden

    Hallo,

    ich kopiere mir eine .csv Datei (11kb) von einem http Server auf meinen FTP Server. Über:

    PHP-Code:
    <?php
    $file 
    'http://www.url.de/ornder/example.csv';
    $newfile 'example.csv';
    if (!
    copy($file$newfile))
    { echo 
    "copy $file schlug fehl...\n"; }
    ?>
    Die Datei liegt sofort auf dem FTP Server, aber der Server arbeitet noch ca. eine Minute weiter. Man sieht das im Browser. Der arbeitet noch und lässt auch keine anderen Tätigkeiten in der Zeit zu.

    Was kann das Problem sein?

    Wenn ich den http Link der csv Datei Besuch, dann wird diese automatisch herunterladen. Und das ganz schnell.

    In der Minute Wartezeit ist meine Homepage dazu tot. Erst danach kann man diese wieder besuchen.

    Habt ihr irgendwelche Ideen? Warum ist die Datei sofort kopiert und die Funktion braucht trotzdem noch eine Minute?

  • #2
    Zeige den ganzen Code inklusive der URL, so wie du ihn verwendest 1:1, wie sonst soll man dem auf die Spur kommen,

    Gib dir beim programmieren mehr Mühe und schalte das Error-Reporting ein, damit dir Fehler angezeigt werden.
    ornder soll wohl ordner heissen, oder?

    Kommentar


    • #3
      Hallo,

      vielen Dank für die Antwort. Der Code oben ist komplett. Mehr ist da nicht. Die genaue URL kann ich leider nicht veröffentlichen. Die Datei ist zwar nicht passwortgeschützt etc., aber der Anbieter der Datei möchte das sicherlich trotzdem nicht. Es handelt such um eine Lagerbestandsdatei.

      PHP Fehler entstehen keine, sonst hätte ich diese hier mit geschrieben. Es funktioniert ja grundsätzlich auch alles. Die Datei ist umgehend kopiert. Löst aber eben einen ca. 60 Sekunden Ausfall aus.

      "ornder" sollte Ordner heißen, aber das ist ohnehin nicht so wichtig, weil die URL nur eine Beispiel-URL ist.

      Ich werde mal eine andere csv von einem anderen Server probieren.

      Kommentar


      • #4
        Zitat von Dombi Beitrag anzeigen
        Hallo,

        vielen Dank für die Antwort. Der Code oben ist komplett. Mehr ist da nicht. Die genaue URL kann ich leider nicht veröffentlichen. Die Datei ist zwar nicht passwortgeschützt etc., aber der Anbieter der Datei möchte das sicherlich trotzdem nicht. Es handelt such um eine Lagerbestandsdatei.

        PHP Fehler entstehen keine, sonst hätte ich diese hier mit geschrieben. Es funktioniert ja grundsätzlich auch alles. Die Datei ist umgehend kopiert. Löst aber eben einen ca. 60 Sekunden Ausfall aus.

        "ornder" sollte Ordner heißen, aber das ist ohnehin nicht so wichtig, weil die URL nur eine Beispiel-URL ist.

        Ich werde mal eine andere csv von einem anderen Server probieren.
        Wie groß ist die CSV? Sind es exakt 60 Sekunden?
        Versuch es alternativ auch mal mit file_get_contents().

        Kommentar


        • #5
          #1
          Zitat von Dombi Beitrag anzeigen
          ich kopiere mir eine .csv Datei (11kb) von einem http Server auf meinen FTP Server.
          The string "()()" is not palindrom but the String "())(" is.

          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            So ich habe die manuell herunterladen Datei auf einen anderem Server gelegt und das Script nochmal probiert.

            Dort geht es perfekt.

            Somit gehe ich davon aus, damit die csv auf dem ursprünglichem http Server noch nicht richtig geschlossen ist. Dann müsste ich an den Anbieter der csv herantreten.

            Kann das sein?

            Es sind 60,23 Sekunden (mit microtime gemessen).

            file_get_contents probier ich gleich noch.

            Vielen Dank.

            Kommentar


            • #7
              Bei file_get_contents () bleibt alles wie bei copy().

              Kommentar


              • #8
                Was passiert wenn du das Script zweimal hintereinader ausführst? Ist der zweite Aufruf auch langsam?


                Kann das sein?
                Nein

                Kommentar


                • #9
                  Ich würde versuchen file_get_contents einen passenden Requst-Header (über $context -Parameter) mitzugeben.
                  Denn per Browser kommt das ja vom Server ohne Verzögerung wenn ich das so richtig verstanden habe.
                  Und mal die echten Zeiten vom Start bis zum Ende mitloggen.

                  Kommentar


                  • #10
                    Zitat von erc Beitrag anzeigen
                    Was passiert wenn du das Script zweimal hintereinader ausführst? Ist der zweite Aufruf auch langsam?
                    Ja. Immer gleich. Etwas über 60 Sekunden. Die kopierte Datei ist immer sofort bei mit auf dem Server. Und diese ist auch komplett.

                    Und ja, über den Browser geht der Download perfekt und schnell.

                    Kommentar


                    • #11
                      Zitat von Dombi Beitrag anzeigen

                      Ja. Immer gleich. Etwas über 60 Sekunden. Die kopierte Datei ist immer sofort bei mit auf dem Server. Und diese ist auch komplett.

                      Und ja, über den Browser geht der Download perfekt und schnell.
                      Also 60 Sekunden klingt stark nach einem Timeout. Welcher Art auch immer.

                      Was passiert bei
                      PHP-Code:
                      $ctx stream_context_create([
                          
                      'http' => ['timeout' => 10]
                      ]);

                      echo 
                      file_get_contents('http://example.com/test.csv'false$ctx); 
                      Hast du SSH-Zugang? Versuch mal
                      Code:
                      $ curl http://example.com/test.csv
                      Wenn das funktioniert, könntest du es notfalls so machen:
                      PHP-Code:
                      exec('curl http://example.com/test.csv -o test.csv'); 
                      Wobei es wahrscheinlich besser wäre der Wurzel des Problems auf die Spur zu gehen.

                      Kommentar


                      • #12
                        Zitat von sboesch Beitrag anzeigen

                        Also 60 Sekunden klingt stark nach einem Timeout. Welcher Art auch immer.

                        Was passiert bei
                        PHP-Code:
                        $ctx stream_context_create([
                        'http' => ['timeout' => 10]
                        ]);

                        echo 
                        file_get_contents('http://example.com/test.csv'false$ctx); 
                        Das ist schon ganz gut. Nach 10 Sekunden ist Abbruch. Der Inhalt ist schon längst komplett da. Also genügen auch 2 Sekunden. Vielen Dank.

                        Zitat von sboesch Beitrag anzeigen
                        Wenn das funktioniert, könntest du es notfalls so machen:
                        PHP-Code:
                        exec('curl http://example.com/test.csv -o test.csv'); 
                        Wobei es wahrscheinlich besser wäre der Wurzel des Problems auf die Spur zu gehen.
                        Hier steht folgendes in der text.csv: "301 Moved Permanently"

                        Komisch.

                        Kommentar


                        • #13
                          Zitat von Dombi Beitrag anzeigen
                          Hier steht folgendes in der text.csv: "301 Moved Permanently"

                          Komisch.
                          Ok, dann hol dir mal die neue URL und versuch es noch einmal.

                          Kommentar


                          • #14
                            Oder mit cURL und followlocation .. sollte dann auch gehen glaub ich.

                            PHP-Code:
                            $targetFilePath 'meineDatei.csv';
                            $sourceFilePath 'http://example.com/test.csv';

                            $ch curl_init();
                            $fp fopen($targetFilePath'w');
                            curl_setopt($chCURLOPT_URL$sourceFilePath);
                            curl_setopt($chCURLOPT_FILE$fp);
                            curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
                            if (
                            curl_exec($ch) === false) {
                                echo 
                            'Curl-Fehler: ' curl_error($ch);


                            EDIT: Oder sowas fertiges: https://github.com/guzzle/guzzle
                            The string "()()" is not palindrom but the String "())(" is.

                            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                            PHP.de Wissenssammlung | Kein Support per PN

                            Kommentar


                            • #15
                              Du kannst dir die Header anzeigen lassen mit curl und unter location steht die neue URI die du verwenden musst.

                              PHP-Code:
                              function get_headers_curl($url)
                              {
                                  
                              $ch curl_init();

                                  
                              curl_setopt($chCURLOPT_URL,            $url);
                                  
                              curl_setopt($chCURLOPT_HEADER,         true);
                                  
                              curl_setopt($chCURLOPT_NOBODY,         true);
                                  
                              curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
                                  
                              curl_setopt($chCURLOPT_TIMEOUT,        15);
                                  
                              curl_setopt($chCURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.13) Gecko/2009073022 Firefox/3.5.2');

                                  
                              $r curl_exec($ch);
                                  
                              $r explode("\n"$r);
                                  return 
                              $r;
                              }

                              var_dump(get_headers_curl("http://www.example.com")); 
                              Für var_dump(get_headers_curl("http://www.php.de")) kommt dann folgendes Ergebnis
                              Code:
                              array (size=7)
                                0 => string 'HTTP/1.1 301 Moved Permanently' (length=31)
                                1 => string 'Date: Thu, 16 Nov 2017 15:36:24 GMT' (length=36)
                                2 => string 'Server: Apache' (length=15)
                                3 => string 'Location: https://www.php.de/' (length=30)
                                4 => string 'Content-Type: text/html; charset=iso-8859-1' (length=44)
                                5 => string '' (length=1)
                                6 => string '' (length=0)
                              Hier sieht man deutlich das man auf https umgeleitet wird.

                              Kommentar

                              Lädt...
                              X