Hallo Für eine Datenauswertung habe ich acht PHP Sktipte, die sich alle sehr ähneln. Jedes Skript hat eine Laufzeit von mehr als einer Stunde. Parallel kann ich die nicht laufen lassen, das schafft der Rechner nicht. Weil ich aber auch nicht warten will bis das erste Skript fertig ist, nur um das zweite anzuklicken, dachte ich mir, dass am Ende eines Jeden das nächste aufgerufen wird. Nur bekomme ich da sofort folgende Fehlermeldung: Fatal error: Cannot redeclare zeit() Was ja auch Sinn macht, denn in der 2. Datei ist die Funktion Zeit auch enthalten. Insgesamt gibt es zwischen 4 und 8 Funktionen pro Datei, welche sich fast immer unterscheiden. Gibt es eine Möglichkeit, dass die acht Dateien nacheinander aufgerufen werden, ohne das Funktionswerte üpbergeben werden? Danke und Gruß
Wieso packst Du nicht alle in eine Datei? Du müssest halt nur die Namen von Variablen und Funktionen anpassen. Außerdem scheint es ja so sein, dass sich die Skripte alle ähneln. Hier lässt sich bestimmt auch den Programm-Code optimieren, gerade was die Ausführungszeit angeht.
Weil ich da jetzt nicht noch Zeit in das einarbeiten von den Skripten stecken möchte. An jedes Ende eines Skriptes einen Aufruf einzufügen, hält sich ja noch in Grenzen, aber jetzt noch anfangen was genau da zu optimieren ist, ginge zu weit. Shell bzw Batch ist natürlich ne Möglichkeit, aber wie kann das Batch Skript wissen, wann das PHP Skript fertig ist. Danke und Gruß
Kolja L. schrieb: > Shell bzw Batch ist natürlich ne Möglichkeit, > aber wie kann das Batch Skript wissen, > wann das PHP Skript fertig ist. es wartet doch bis der befehl ausgeführt wurde.
1 | php script1.php |
2 | php script2.php |
3 | php script3.php |
warum dauern die scripte so lange? Eventuell ist ja php dafür nicht die richtige sprache?
Hallo Peter Ob PHP die richtige Spreche dafür ist, kann ich nicht beurteilen. Die Skripte durchsuchen eine Datenbank mit 2 Millionen Einträgen und erstellen daraus CVS Dateien. Ich habe mir einfach eine Batch Datei erstellt und rufe von dort den IE mit der entsprechenden URL auf: start iexplore http://127.0.0.1:7777/uni/8_AP_DOC.php Gruß Kolja
Kolja L. schrieb: > Ob PHP die richtige Spreche dafür ist, > kann ich nicht beurteilen. Man kann mit php hat schnell irgendwas mit webseite zusammenbasteln. > Die Skripte durchsuchen eine Datenbank mit 2 Millionen Einträgen > und erstellen daraus CVS Dateien. Und dafür brauch da teil 1 Stunde? Ernsthaft? Das geht mit Sicherheit viel schneller (< 1 Min) wenn man den Code etwas optimiert und/oder die Arbeit der Datenbank gibt. Dafür sind de nämlich erfunden worden. > Ich habe mir einfach eine Batch Datei erstellt und rufe von dort den IE > mit der entsprechenden URL auf: > > start iexplore http://127.0.0.1:7777/uni/8_AP_DOC.php Na das ist doch schon brauchbar. Nimm wget an statt start iexplore und schreib die Aufrufe in einer Batch untereinander.
Kolja L. schrieb: > Ich habe mir einfach eine Batch Datei erstellt und rufe von dort den IE > mit der entsprechenden URL auf: > > start iexplore http://127.0.0.1:7777/uni/8_AP_DOC.php > > Gruß Kolja viel zu umständlich. Warum erst eine webabfrage starten? Man kann den php interpretet auch einfach so starten ohne das man ein webserver oder Client braucht. irgendwo musst du eine php*.exe haben. Diese startest du einfach und übergibst als Parameter den Dateiname von dem script. > Die Skripte durchsuchen eine Datenbank mit 2 Millionen Einträgen > und erstellen daraus CVS Dateien. das mache in Täglich in Datenbanken mit >200 Millionen Einträgen und das dauert nur Minuten.
Mit wget hatte ich es schon versucht, aber damit werden keine csv Dateien erstellt.
Kolja L. schrieb: > Mit wget hatte ich es schon versucht, aber damit werden keine csv > Dateien erstellt. schreibt die PHP-script dierekt die Datei oder wird sie als Download angeboten? Kannst du uns das PHP script zeigen?
Kolja L. schrieb: > Mit wget hatte ich es schon versucht, aber damit werden keine csv > Dateien erstellt. Und wieso nicht? Fehlermeldung? Wget macht nix anderes anderes als dein ie. Das Ergebnis der Anfrage landet halt direkt auf der Platte (vermutlich mit .php als Dateiendung). Zeige mal den Code...
Code veröffentlichen geht nicht, da es nicht meiner ist. Forschungsprojekt der Uni... So schreibt das Skript die Daten in die Datei: $fh = fopen("LP_DAT.csv", "a"); $kopfzeile = "LP;;DAT;;Leistung; \n Datum;Uhrzeit;;min;durchschn.;max \n"; fwrite($fh, $kopfzeile); Danke für die Hilfe!
Vermutlich sind die SQL-Abfragen oder das DB-Design Schrott oder die Kiste hat zu wenig Speicher, PHP hat per Webserver zu wenig RAM zugewiesen bekommen oder .... Ohne mehr Infos kann man da keine zwingend schnellere Lösung geben.
Also da kannst Du entweder die Hinweise nehmen das in ein einzelnes Script zu packen, vor allem wenn da immer wieder das gleiche gemacht wird oder Du machst einen cronjob bzw. wenn Win eine batch die dann automatisch ausgeführt wird. Und was für eine Datenbank ist das wenn die solange braucht, sollte man mal über's SQL drübergucken und vor allem ob da auch Primärkeys drin sind. Kenne da so einiges wildes vor allem im MS-Office Bereich ... Eine einfache Umstellung der Tabellen im SQL kann da schon das doppelte bis dreifache an Geschwindigkeit herausholen.
Es müssen alle 8 Dateien einmal durchlaufen. Dazu kann ich jetzt immer eine starten, warten und dann die nächste starten. Damit bin ich nach 2 tagen und 8 Klicks durch. Ich wollte mir doch nur die 8 Klicks sparen... Jetzt läuft es über Batch, den IE und nach jedem Start warte ich einfach 2 Stunden. Damit sollte es morgen abend fertig sein.
<?PHP exec("sudo /usr/bin/php /path/to/file.php > /dev/null &"); ?>
Vielleicht ein einfaches header() als Weiterleitung auf sich selbst mit übergebenem GET Parameter als Dateinamennummer für einen Array. Setzt voraus das nen Browser zum Aufruf auf ist der nicht gerade selbst schliesst.
Kolja L. schrieb: > Code veröffentlichen geht nicht, da es nicht meiner ist. > Forschungsprojekt der Uni... So musst du wohl weiter 1 Stunde auf Ergebnisse warten. Oder geh den schlagen der das verbrochen hat. > So schreibt das Skript die Daten in die Datei: > > $fh = fopen("LP_DAT.csv", "a"); > $kopfzeile = "LP;;DAT;;Leistung; \n > Datum;Uhrzeit;;min;durchschn.;max \n"; > fwrite($fh, $kopfzeile); Dann ist mir aber nicht klar warum das mit wget nicht geht. Fehlermeldung? Mit dem http-Request wird ja nur der Interpreter gestartet. Ausgabe erfolgt ja auf anderem wege. Insgesamt eine eher fragwürdige "Konstruktion". > Danke für die Hilfe! Gerne doch. Ohne Code geht aber nicht viel mehr....
Julian .. schrieb: > Mit dem http-Request wird ja nur der Interpreter > gestartet. Vielleicht ist das ein User und Rechte Problem (BASEDIR), bzw wird dann fopen Restricted, dann mal ausprobieren ob eine Hand erstellte Leere Datei befüllt wird.
Philipp K. schrieb: > Julian .. schrieb: >> Mit dem http-Request wird ja nur der Interpreter >> gestartet. > > Vielleicht ist das ein User und Rechte Problem (BASEDIR), bzw wird dann > fopen Restricted, dann mal ausprobieren ob eine Hand erstellte Leere > Datei befüllt wird. Ob der http-Request vom ie oder wget erzeugt wird, spielt für alles was danach kommt doch keine rolle (ja, theoretisch kann da was drin sein, halte ich jedoch auf Grund der Qualität des Aufbaus für unwahrscheinlich). Vermutlich läuft wget in einen timeout da keine Daten vom Script kommen. Das könnte man per --read-timeout=SECONDS aber anpassen. Alternativ das Script richtig(tm) machen. Leider ist das keine Option.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.