Skriptlaufzeit verlängern

Hallo,
ich habe ein par Crons die für die Artikelaufnahme meiner Lieferanten zuständig sind, diese bestehen üblicherweise aus txt oder csv Dateien. Das Problem, die Dateien haben im Schnitt um die 50 -60.000 Zeilen, bedeutet, die Aufnahme in einer DB erfolgt nicht vollständig, da die Scriptlaufzeit erreicht wurde, bei viel Glück, je nach Angaben pro Zeile, schaffe ich 15-20.000 Zeilen.
set_time_limit(0); oder ignore_user_abort(true); helfen da leider auch nicht weiter, gibt es dafür alternative Lösungen um alle Zeilen einlesen zu können?

Grüße aus Berlin

Du könntest die Dateien vorab splitten. Wenn Du weißt, dass ca. nur 15.000 Zeilen importiert werden. Könntest vorab dafür sorgen, dass die Importdateien aufgesplittet z.B. in 10.000 Zeilen und der Cron mehrmals läuft bis alle aufgesplitteten Dateien eingeladen sind.

Bei so großen Dateien kannst den Import per Zeile aufteilen, also mit Offset arbeiten oder zunächst versuchen, neben dem set_time_limit (im Loop!!!) auch das memory_limit zu erhöhen (1024),

@indianer3c, das mit dem splitten funktioniert aus diversen Gründen nicht, daher leider nicht hilfreich, trotzdem danke!

@rubbercut, was meinst du mit “Offset arbeiten”, memory_limit habe ich nur 512, mehr geht nicht und den set_time_limit in der Schleife soll was bringen? Steht bei mir am Anfang vom Script.

1 Like

Gehört in den Loop, damit die Zeit bei jedem Durchgang neu gestartet wird.

Einen Counter einrichten und mit Offset jeweils einen Teil der Rows bearbeiten, also immer von X bis Y.

Was bringt mir der Counter, wenn die csv innerhalb der Schleife abgearbeitet wird.

Ergo sowas wie
while($data = fgetcsv($handle, 6500, “\t”))
{
Zeile bis ca. 60.000 durchlaufen
}

$data wird bei jedem Durchlauf verkleinert, sodass immer nur die Offset-Zeilen von X bis Y übrig bleiben. Es dauert ein wenig länger, läuft aber durch, wenn das andere (set_time_limit) nicht klappt.

Coole Idee!!! Jetzt weiß ich wie du das meinst, danke dafür.
Kann man auch rausbekommen wieviel Zeilen eine csv hat, so dass ich das besser aufteilen kann, da die sich von Lieferant zu Lieferant und täglich in der Größe unterscheiden.

ich würde nicht über die Anzahl Zeilen gehen, sondern über Script-Laufzeit.
→ am Anfang des Scipts die Uhrzeir speichern → nach zB 5 Sek-> neustart

set_time_limit in der Schleife bringt leider gar nichts, einzig das Script scheint “warum auch immer” schneller durch zulaufen.

Nachtrag: Script läuft bis ca. 12.000 Datensätze, bringt dann seltsamer Weise aber ein Ok zurück, ist außerhalb der Schleife. Kann der Hoster das irgendwie beinflussen?

@patchwork.de , die Scriptlaufzeit am Anfang ist nicht der optimale Weg, da die Artikel aus der csv in einer tmp Table gespeichert werden, alle alten Artikel werden am Scriptanfang komplett gelöscht. Ich will nicht, dass sich die DB bis ins endlose aufbläht.

ich habe es wohl schlecht formuliert, deshalb etwas ausführlicher:
→ am Anfang des Scriptes die Uhrzeit speichern
→ einen Zähler mitlaufen lassen (txt-Zeilen bzw. DB-Tabellen-Zeilen)
→ innerhalb der while-Schleife zeitgesteuert entscheiden ob der Prozess neu gestartet werden muss (zB nach 5 Sekunden)
→ wenn Neustart dann den Zähler als Parameter übergeben und die txt-Datei mit diesem Offset weiter bearbeiten

$x = file("datei.csv");
$xcount = count($x);

@patchwork.de, danke
@rubbercut, ebenfalls danke, hatte ich schon gefunden, muss jetzt mal bissl testen ob eure Ideen funktionieren, habe soeben erfahren, das größte Problem liegt derzeit beim Hoster, der meldet ein Performanceproblem, welches sich mehrere Wochen :frowning: hinziehen kann