SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Der CSS-Problemlöser

Der CSS-Problemlöser zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Grundlagen
Hilfe Community Kalender Heutige Beiträge Suchen

PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 03.02.2009, 16:14:32
verloren verloren ist offline
Anfänger
 
Registriert seit: Feb 2007
Beiträge: 3
Timeout bei PHP-MySQL-Script.....nicht erklärbar

Hallo an alle,

sorry, falls ich im falschen Forum bin, verschiebt den Thread einfach, falls es doch ins PHP-Anfänger- oder SQL-Forum gehört. Danke :)

Hier mein Problem:
Ich habe mir ein etwas größeres Script geschrieben, welches von einem meiner Server zweimal täglich mehrere GZ-Dateien herunterladen soll. Diese GZ-Dateien enthalten jeweils eine CSV-Datei und sollen dann lokal entpackt werden. Die nun entstandene CSV-Dateien sollen jeweils in eine MySQL-Datenbank eingetragen werden. Ich behandel immer nur jeweils eine Datei nach der anderen, also Download, entpacken, eintragen, fertig! Download, entpacken, eintragen, fertig!....

Die Größe der GZ-Dateien schwankt hierbei von wenigen KB bis hin zu mehreren hundert MB. Die CSV-Datei beinhalteen je nach Größe auch zwischen wenigen hundert bis hin zu 4 Mio Datensätzen.

Ich habe mir für jeden einzelnen Schritt eine eigene Funktion geschrieben. Somit kann ich auch zu Testzwecken jeden Schritt manuell und getrennt testen.


Hier nun ein Teilausschnitt, wie ich die GZ-Datei herunterlade:

PHP-Code:
$handle fopen($result2['downloadlink'],'r');
$handle2 fopen($tmpgzname,'w');

while(!
feof($handle)) {
 
$buffer fgets($handle9216);
 
fwrite($handle2,$buffer);
}
            
fclose($handle);
fclose($handle2); 

Hier ein Teilausschnitt, wie ich die GZ-Datei entpacke:

PHP-Code:
$handle gzopen($result2['tempgzname'],'r');
$handle2 fopen($result2['tempcsvname'],'w');

while(!
gzeof($handle)) {
 
$buffer gzread($handle9216);
 
fwrite($handle2,$buffer);
}

gzclose($handle);
fclose($handle2); 

Hier ein Teilausschnitt, wie ich die CSV-Datei in die Datenbank eintrage:

PHP-Code:
$handle fopen ($result2['tempcsvname'],"r");

while ((
$data fgetcsv ($handle9216";")) !== FALSE ) {
 
$sql3 "INSERT INTO csv (val1, val2, val3.......val67) VALUES ('".$val1."','".$val2."','".$val3."'............'".$val67."')";
 
$result3 mysql_query($sql3) OR die (mysql_error());
}

fclose ($handle); 

Ich habe bei den Teilausschnitten natürlich nur das notwendigste gepostet, der originalcode ist um einiges länger. In den ersten Zeilen der PHP-Datei habe ich folgende Einstellungen vorgenommen:

PHP-Code:
ignore_user_abort(1);
set_time_limit(0);
clearstatcache();
ini_set('implicit_flush'1); 
Tests funktionieren einwandfrei bis zu einer Größe von etwa 110.000 Datensätzen. Der Download und das Entpacken funktioniert auch mit GZ-Dateien, die knapp 400.000 Datensätze enthalten. Ich konnte mich bisher eigentlich nicht beschweren.

Nur bricht mir das Script jedesmal nach ziemlich genau 50-60 Sekunden ab....ohne Fehlermeldung....ohne alles....innerhalb dieser 50-60 Sekunden schafft es das Script etwa 110.000 Datensätze einzutragen. Wenn ich alle vorherigen Schritte durchlaufen lasse, vergehen ja auch schon etwa 2 bis 3 Minuten, die ohne Abbruch funktionieren. Nur beim letzten Schritt bricht es mir immer wieder ab. Ich habe auch schon einen kleinen do { bla } while(true); - Test geschrieben, um eventuelle andere Timeouts zu testen. Ich habe das Testscript mit kill (über die shell) nach 321 Minuten manuell beendet. Es liegt also meiner Meinung nach nicht an PHP und auch nicht am Apache. Versuche, nach jedem kleinen Schritt eine kleine Erfolgs- oder Fehlermeldung mit "echo" an den Browser zu senden lassen das Script leider trotzdem abbrechen. Ich sehe
"Download gestartet",
"Download beendet",
"Entpacken gestartet",
"Entpacken beendet",
"DB-Insert gestartet...",
"5% fertig",
"10% fertig"
...
"40% fertig"
und dann hörts auf.

Auch habe ich schon die Funktion einzeln laufen lassen, um die Zeit korrekt messen zu können. Also ohne Download und entpacken (die Dateien sind ja schon vorhanden). Es bringt alles nichts. Ich versteh einfach nicht, warum das Script hier abbricht. Liegt es (meine letzte Vermutung) an MySQL?
Oder mach ich doch etwas anderes grundlegend falsch?
Ich muss ehrlich sein, dass ich mir (leider leider) nicht so ganz sicher bin, ob ich die Buffereinstellung der ersten beiden Funktionen (9216) richtig gesetzt habe. Bei der dritten Funktion muss der Buffer auf jeden Fall über 8000 stehen, da die einzelnen Datensätze ziemlich lange Texte mit beinhalten können.
Allerdings haben die ersten beiden Funktionen ja auch nichts mit dem eigentlichen Problem zu tun.

PHP-Code:
ini_set('max_execution_time''300');
ini_set('max_input_time''10');
error_reporting(E_ALL);
ini_set'display_errors''On' ); 
Die eben genannten Einstellung habe ich Testweise mal aktiviert, bringen mich aber auch um keinen Schritt weiter.

Bin für jeden Tipp, Trick dankbar.

Grüße
Mit Zitat antworten
  #2  
Alt 03.02.2009, 16:29:12
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
AW: Timeout bei PHP-MySQL-Script.....nicht erklärbar

Mit phpinfo() kannst du prüfen, ob deine Einstellungen greifen.

Aber grundsätzlich ist die Webserver Umgebung nicht für solche Dauerläufer geeignet/vorgesehen. Verwende besser einen cronjob.
Mit Zitat antworten
  #3  
Alt 03.02.2009, 18:28:39
verloren verloren ist offline
Anfänger
 
Registriert seit: Feb 2007
Beiträge: 3
AW: Timeout bei PHP-MySQL-Script.....nicht erklärbar

Ja, ne, phpinfo hilft mir da auch nicht so recht weiter. Ich weiss ja, dass die Einstellungen greifen. Allerdings hab ich jetzt einen Weg gefunden, wie es funktioniert:
  • php5-cli nachinstalliert
  • scripte so modifiziert, dass sämtliche HTML-Ausgaben unterdrückt werden
  • script angepasst, dass es auf GET-Vars reagiert (vorher wars POST)
  • Aufruf per Kommandozeile "php script.php var1=go"

Testweise habe ich es gerade mit root-rechten aufgerufen. Aber ich denke, dass es in realer Umgebung dann auch funktioniert.

Meine Frage, WARUM der andere Weg nicht funktionert, ist damit zwar nicht beantwortet, aber der momentane "workaround" bringt mich wenigstens einen Schritt weiter.

Ich muss mich jetzt halt mal hinhängen, dass sämtliche Meldungen in ein Logfile geschrieben werden. Vielleicht klappt es dann ja auch, das irgendwie per exec('php script.php'); zu integrieren......obwohl das etwas "doppelt gemoppelt" klingt ;)

Sollte trotzdem noch irgendjemand einen Weg kennen, dass es auf eine "bessere" Art klappt, immer her mit.

Danke an alle.


Gruß
Mit Zitat antworten
  #4  
Alt 03.02.2009, 18:51:36
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
AW: Timeout bei PHP-MySQL-Script.....nicht erklärbar

Zitat:
Vielleicht klappt es dann ja auch, das irgendwie per exec('php script.php'); zu integrieren.
Nein!
Da greifen dann die selben Probleme!
Oder es bleibt sogar ein Zombie hängen und wird irgendwann gekillt.
Das HTTP ist nur für kurzlebige Request-Responst Zyklen gedacht und geeignet.


Bei deinem Problem greifen mehrere Timeouts:
1. Der Browser Timeout
2. Der Apache Timeout
3. Der PHP Timeout
4. Massenhoster haben auch oft Timeouts für jede Art von Userprozesse aktiviert.

Die ganzen Timeouts hochzudrehen/abzuschalten ist nicht sinnvoll! Sie wurden ja schließlich nicht ohne Grund eingebaut.

Wenn du root zugriff hast, dann kann dich ja auch nix daran hindern einen eigenen Daemon zu basteln. Oder das Script über xinetd zu starten.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Suche php Script zum eMail versenden. flat PHP Entwicklung und Softwaredesign 7 06.09.2008 12:37:22
PHP/ MYSQL Lernen, aber wie Newby PHP Grundlagen 1 30.03.2008 15:17:29
Strings per PHP an ein anderes Script übergeben ? quirrly PHP Grundlagen 18 23.12.2004 15:20:39
mySQL DB erstellen und unter PHP nutzen norial MySQLi/PDO/(MySQL) 1 25.10.2004 11:01:29
News script OHNE mysql Densen PHP Grundlagen 7 28.01.2004 18:57:50


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:13:30 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt