PHP bezwungen

S

spezies5618

Guest
jaaa, ich habe es geschafft. :(

Fatal error: Maximum execution time of 30 seconds exceeded in c:\apache\htdocs\home\html\trek\galerien\top10.php on line 1357

Braucht PHP etwa solange für so ca. 10.000 Schleifendurchläufe. Wenn ich das Script fertigstellen könnte wären es ca. 20.000 Schleifendurchläufe (grobe Schätzung).
 
kommt auf die schleifen an. und auf den effizienz-quotienten der schleifenkonfiguration... will sagen: wie sauber die sache programmiert ist ;)
aber ich hab hier ein skript, das macht knapp 45.000 Durchläufe.. und braucht weniger als 30 Sekunden.
Du kannst aber in der php.ini die maximalzeit auch hochsetzen.. ;)

Nachtrag

Code:
max_execution_time = 30
einfach mal auf 60 oder so setzen.. ;)
 
was bringt es mir wenn ich die Zeit auf meinem localhost verstelle aber dann vielleicht die Zeit die mein Provider eingestellt hat zu geringt ist?

Hab mich übrigens leicht verrechnet, es sind im extremen Fall ca. 500.000 Schleifendurchläufe... :bibber:
 
hmm.. korrigier mich.. aber konnte man die runtime nicht auch nur für ein skript hochsetzen? mit ner eigenen php.ini? da gab's doch ne möglichkeit.. ähnlich wie du mit der .htaccess ja auch die apache-config noch beeinflussen kannst.. :confused:

und ne halbe million durchläufe is definitiv zu viel... *g*
 
keine Anhnung ob das geht

finde keine andere Möglichkeit es kürzer zu machen, aber ich lass es auch besser, denn scheinbar dauert es auch etwas lange eine 100 Kb Counter-txt-datei zu erstellen.

naja, was solls
 
Was genau wolltest du denn machen? Das problem ist sicherlich zu lösen... Vielleicht kann dir hier jemand helfen...
 
Alles meins schrieb:
Was genau wolltest du denn machen? Das problem ist sicherlich zu lösen... Vielleicht kann dir hier jemand helfen...

es geht darum das er eine Counterdatei ausließt wo die counterstände von ca. 900 Bildern momentan drin sind, jede Zeile ein Counterstand. eine andere Datei enthält ID Nummern.

Er muß also erst die ID Nummern, im extremfall ca. abenfalls ca. 900.

Diese 900 wird mal auf 1000 steigen, also sind das am Ende 500.000 durchläufe. Und Die Fehlermeldung kam bei gerade mal 500 Counterständen -> 125.000 Durchläufe

Nun ließt er erst die ID Nummer aus durch eine schleife. Dann nimmt diese Nummer, erstellt daraus einen Bildnamen und sucht ihn, ebenfalls durch eine schleife in dem array, in das die Counterdatei ausgelesen wurde, hat er sie gefunden macht er ein break.

D.h. 900 durchläufe durch dieses ID-array, und das * durchschnittlich 450 durchläufe pro Counterstand (den muß er erstmal finden. Dann muß er nebenbei noch diese Zeile ein paar mal mit explode() zerlegen um die richtigen Daten zu finden.

Das is übrigens der counter den ich dir mal geschickt habe. Wollte ihn mal weiterentwickeln. Das automatische erstellen des counter klappt prima. Das auslesen der statistik klappt auch super. Bloß wenn ich das Ding dann mit meiner Top-Liste kopple, und halt die counterstände für alle ausgeben lasse, da gehts nicht.
 
Hmm: A Du solltest es mal mit mySQL Versuchen.
oder B: Mach für jedes bild eine eigene Counter-Datei in die du nur die relevanten informationen schreibst. Dazu machst du noch ne Highscore-Datei ind die du die Highscore schreiben lässt (schon schön sortiert und so). Wenn sich nun was bei den bildern ändert datest du erst die Counter-Datei up und sortierst danach die higscore-Datei neu... Damit solltest du mit 1000 Schleifendurchläufen locker hinkommen...
 
Alles meins schrieb:
Hmm: A Du solltest es mal mit mySQL Versuchen.
oder B: Mach für jedes bild eine eigene Counter-Datei in die du nur die relevanten informationen schreibst. Dazu machst du noch ne Highscore-Datei ind die du die Highscore schreiben lässt (schon schön sortiert und so). Wenn sich nun was bei den bildern ändert datest du erst die Counter-Datei up und sortierst danach die higscore-Datei neu... Damit solltest du mit 1000 Schleifendurchläufen locker hinkommen...

hab kein mySQL

ich hab ja schon für jedes Bild eine eigene Counterdatei, blos wenn ich die immer wöchentlich zur Sicherung runterlade dauert mir das zu lange, deswegen wollte ich es so machen. Aber da hab ich gerade eine Idee.

Und ich habe schon nur die relevanten Daten in der Datei, irgendwie sind bei der toplist alle Daten relevant. Denn ich lasse ja gesammt sortieren oder pro Monat oder pro Auflöäsung, also alles relevant, und da will ich nix dran ändern, denn ich bin statistik Fetischist.


NACHTRAG: man kann doch die laufzeit eines scriptes ermitteln indem man am anfang einen microtime() setzt und am ende den microtime() von dem aktuellen abzieht. Da kommt irgendwie immer was mit 0,x raus.

Wenn ich aber statt microtime() einfach mal date("U") nehme da komme ich auf mehrere Sekunden ! Und es dauert auch mehrere Sekunden.
 
A) für Heimgebrauch mySQL downloaden
B) für online-Gebrauch auf einen Server mit DB wechseln

sorry, aber anders herum ist es völlig sinnlos. Selbst wenn du unterhalb 30 Sekunden bleibst: wartest du oder deine Freunde/Kunden etc. 28 Sekunden auf einen Counterstand?
Mit MySQL kriegst du über einen self-join das selbe Ergebnis mit nur einer (!!) Abfrage, sind dann die Spalten noch indiziert, dann geht das trotz 1000 IDs noch im Millisekundenbereich. Dein Quellcode schrumpft zudem auch auf ca. 30 Zeilen (ohne Design). Da gibt's einfach keine Alternative zu! Nicht für den Anwendungszweck.

microtime() liefert dir sowohl einen Timestamp als auch einen Mikrosekundenzähler zuürck (zuerst die Mikrosekunden und dann durch Leerzeichen getrennt die Sekunden). Willst du die Laufzeit im bekannten Format haben, musst du zuerst bei beiden Zeitnahmen Mikrosekunden und Sekunden addieren und dann beide Ergebnisse voneinander subtrahieren. Kannst meine Lösung verwenden:

Code:
$startoutput = microtime();
.
.
.
function pagetime($startoutput) {
   $endoutput = microtime();
   list($startmsec,$startsec) = explode(" ", $startoutput);
   list($endmsec,$endsec) = explode(" ", $endoutput);
   $pagetime = ($endmsec+$endsec) - ($startmsec+$startsec);
   return $pagetime;
}
Kann jetzt noch gerundet werden (hat viele Nachkommastellen), wenn du bcscale() verwendest (ab PHP 4.0.4) oder indem du die Position das Punktes mit strpos() ermittelst und 4 oder 5 zuzählst und dann an der Stelle den String trennst.
 
schon wieder Serverwechsel, ach nee,

hab das Problem jetzt auf im extremen Fall ca. 150.000 durchläufe gebracht, und im Normalfall so ca. 6.000

Hmm, dein script sagt mir so maximal 3 Sekunden, aber es dauert 6 - 7 Sekunden bis das Ding fertig ist. Komisch


mySQL, hab ich ja auf dem localhost, aber noch nie rumprobiert, wäre mal eine Idee wert.


auf 30 Zeilen? glaub ich nicht, dazu hab ich zuviele Möglichkeiten in der Datei drin, bin jetzt bei 2250 Zeilen.
 
Zurück
Oben