Zur Navigation

copy Befehl einer .csv Datei dauert ewig

1 Horst_Braun

Hallo,

ich bin es gleich nochmal. Ich kopiere mit eine .csv Datei (11kb) von einem http Server auf meinen FTP Server. Über:
<?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`?

15.11.2017 15:55 | geändert: 15.11.2017 15:56

2 Jörg Kruse

Man sieht das im Browser.

D.h. erst nach einer Minute erscheint die Webseite mit einer Erfolgsmeldung?

Dauert es bei einer größeren Daei noch länger, oder ist die Dateigröße unerheblich?

Hast du SSH-Zugriff auf den FTP-Server? dann könntest du mit top nachschauen, welcher Prozess da so lange läuft

Ansonsten könntest du noch mit microtime() messen, welche Stelle im PHP-Code so lange benötigt, siehe Beispiel #2:

http://php.net/manual/de/function.microtime.php

15.11.2017 16:16 | geändert: 15.11.2017 16:16

3 Horst_Braun

Hallo,

das Script brauch ca. 60 Sekunden (mit microtime gemessen). Dann lädt die Seite nicht mehr. Der obere Codeschnipsel ist das komplette Script. Der Kopiervorgang ist aber immer direkt fertig.

Eine Sekunde Laufzeit würde locker genügen. Ich weiß nicht was er dann noch macht.

SSH-Zugriff habe ich, aber da hab ich Null Erfahrungen etc.

Kann ich nicht das Skript nach x Sekunden einfach abbrechen?

15.11.2017 20:05

4 Jörg Kruse

Die Datei liegt sofort auf dem FTP Server

Sofort mit vollständigem Inhalt?

das Script brauch ca. 60 Sekunden (mit microtime gemessen). Dann lädt die Seite nicht mehr.

Das hört sich nach einem Timeout an, siehe hierzu die Werte von max_input_time und / oder max_execution_time in der php.ini. Das erklärt aber nur, warum das Script nach 60 Sekunden nicht mehr lädt, und nicht, warum es überhaupt solange lädt.

À propos php.ini - allow_url_fopen ist dort aktiviert (auf on gesetzt)?

... und auf deinem lokalen Rechner lässt sich die Datei unter dieser URL normal herunterladen?

15.11.2017 20:50

5 Horst_Braun

Hallo,

die Datei ist sofort komplett da und allow_url_fopen ist on.

Wenn ich den einfach besuche, dann kommt direkt der Download der CSV Datei. Alles geht schnell.



15.11.2017 21:00

6 Jörg Kruse

Beenden kannst du mit exit():

if (!copy($file, $newfile)) {
    echo "copy $file schlug fehl...\n";
}
exit ("Schluss jetzt!");

... was allerdings nichts nützt, wenn copy noch nicht fertig ist.

In dem anderen Thread hast du ja curl verwendet - das könntest du hier alternativ probieren. Die Antwort-Header geben ggf. Aufschluss über den Grund, wenn eine HTTP-Verbindung zwischen den beiden Servern noch nicht geschlossen wurde.

15.11.2017 21:16

7 Horst_Braun

Naja. Da bin ich nicht fit genug.

Kann ich die Scriptlaufzeit nur für die eine Funkion verkürzen?

15.11.2017 21:47

8 Horst_Braun

PS: Kannst du die einfache Funktion mal bitte auf deinem Server probieren?

Ich kann dir den Link zur csv Datei ja mailen.

15.11.2017 21:58

9 Jörg Kruse

Ja, du kannst mir die URL zusenden.

Kann ich die Scriptlaufzeit nur für die eine Funkion verkürzen?

Für eine Funktion nicht, aber du könntest mit set_time_limit() eine harte Grenze für das ganze Script setzen. Das wäre aber natürlich nur ein Dirty Hack, da damit das Grundproblem nicht gelöst wird.

15.11.2017 22:13

10 Horst_Braun

Ich habe jetzt diese Datei:
<?php
 set_time_limit(2); 
 $file = 'http://www.xyz.com/ordner/datei.csv';
 $newfile = 'neuedatei.csv';

if (!copy($file, $newfile)) {
    echo "copy $file schlug fehl...\n";
 }
?>

An der Laufzeit ändert das nichts. Und ich habe gemerkt, dass während der Laufzeit kein Zugriff auf die komplette Homepage ist. Also ist meine Seite eine Minute nicht zu erreichen.

15.11.2017 22:38