Ich hab nen K-sys, ca 1500 zeilen . nix besonderes.
das rechnet rundenbasiert, jeder schiesst auf jeden usw. alles in einer großen schleife..
wenn ich nen Kampf habe und z.B. 100 Runden berechne, dann dauert das ca. 0.2sec (habs mir mal ausgeben lassen..)
derselbe kampf dauert aber bei 150 runden unendlich.. sprich er haut nach 90 Sekunden (hab ich schon soweit hochgeschraubt wg. anderer off-scripte) die notbremse rein und bricht das script ab.
laut task-manager hat php während der zeit durchgehend eine größe von ca. 4-5mb..
Frage: Woran liegt das? wenn ich den kampf "häppchenweise" duchnehme - also 5*100 Runden, brauchst er insgesamt nur 1-2 sec .. mach ich das aber in eins durch, also 500 auf einmal fliegt er raus ...
die rechenlast ist während der gesamten berechnugszeit gleich gross.
alle variablen werden am anfang gesschrieben. zur laufzeit (in der schleife) also nur noch verändert.
endlosschleife fliegt raus .. funzt ja, wenn ich die runden runterstelle.. ram"vollaufen" auch ... also woran liegts?
Grenzen von PHP?
gepostet vor 19 Jahre, 3 Monate von Drezil
gepostet vor 19 Jahre, 3 Monate von neit
Ich tippe mal du hast irgendwas übersehen und produzierts ne Endlos-Schleife ... hast du dir die Variablen-Werte mal ausgeben lassen?
gepostet vor 19 Jahre, 3 Monate von Drezil
ja. alle mitgeloggt undausgegeben.
keine fehler..
endlosschleife kanns nicht sein.. weil wieso geht der code dann einmal und nen andermal wieder nicht?
kurzes bsp:
$anz_runden = (je nach kampf zwischen 1 und 1000+);
if ($anz_runden > 100)
$anz_runden = 100;
for($runde=0;$runde<=$anz_runden;$runde++) {
/* alle berechnungen */
}
lass ich das if bei 100, macht er alles. stell ich es hoch, schmiert er ab..
keine fehler..
endlosschleife kanns nicht sein.. weil wieso geht der code dann einmal und nen andermal wieder nicht?
kurzes bsp:
$anz_runden = (je nach kampf zwischen 1 und 1000+);
if ($anz_runden > 100)
$anz_runden = 100;
for($runde=0;$runde<=$anz_runden;$runde++) {
/* alle berechnungen */
}
lass ich das if bei 100, macht er alles. stell ich es hoch, schmiert er ab..
gepostet vor 19 Jahre, 3 Monate von Kampfhoernchen
Auch schon bei 101 Runden?
Lass dir mal die Ausführzeit jedes einzelnen Durchlaufs ausgeben. An PHP liegt das wohl eher nicht.
Lass dir mal die Ausführzeit jedes einzelnen Durchlaufs ausgeben. An PHP liegt das wohl eher nicht.
gepostet vor 19 Jahre, 3 Monate von mow
eventuell speicherlimit erreicht?
gepostet vor 19 Jahre, 3 Monate von Drezil
Ich hatte teilweise fälle, da hat er 10 runden in 0.5 sec gerechnet (ausgae) .. und bei 11 hat er gestreikt.
Spicherlimit hatte ich auch schon gedacht .. nur wird die php.exe zur laufzeit nie mehr als 4-5mb gross ... kann man das in der php.ini einstellen? hab da nix gefunden..
eigentlich werden uin der schleife keine variablen erstellt, sondern nur noch geändert...
ansonsten könnte ihc mir da ja auch selbst erklären =)
Spicherlimit hatte ich auch schon gedacht .. nur wird die php.exe zur laufzeit nie mehr als 4-5mb gross ... kann man das in der php.ini einstellen? hab da nix gefunden..
eigentlich werden uin der schleife keine variablen erstellt, sondern nur noch geändert...
ansonsten könnte ihc mir da ja auch selbst erklären =)
gepostet vor 19 Jahre, 3 Monate von TheUndeadable
Welche PHP-Version?
PHP 4 hat ein Problem mit vielen Referenzen.
PHP 4 hat ein Problem mit vielen Referenzen.
gepostet vor 19 Jahre, 3 Monate von OranGe
ich denke auch eher das du speicherprobleme oder etwas in der art bekommst...
gibt alle nicht mehr benötigten Variablen fein säuberlich wieder frei vieleicht löst es denn ja dein Problem (falls es wirklich daran liegt)
gibt alle nicht mehr benötigten Variablen fein säuberlich wieder frei vieleicht löst es denn ja dein Problem (falls es wirklich daran liegt)
gepostet vor 19 Jahre, 3 Monate von None
Bei Speicherproblemen kommt aber IMMER eine entsprechende Fehlermeldung...
Das kann daher schonmal ausgeschloßen sein, mit ziemlicher Sicherheit ist es Endlosschleife. Schau nochmal alles genau von vorne nach hinten druch, meistens ist es eine Kleinigkeit die man übersieht :wink:
Das kann daher schonmal ausgeschloßen sein, mit ziemlicher Sicherheit ist es Endlosschleife. Schau nochmal alles genau von vorne nach hinten druch, meistens ist es eine Kleinigkeit die man übersieht :wink:
gepostet vor 19 Jahre, 3 Monate von Drezil
über 100 zeilen mal eben .. *g*
nein.. es gibt keine endlosschleifen. ich nutze nur for-schleifen .. und der zähler wird nicht manipuliert.
referenzen nutz ich nicht.
eigentlich läuft das simpel so:
$schiff[1]['hp'] = 100;
$schiff[2]['hp'] = 100;
$schaden= 3; /*ja .. normal nen array mit waffen, etc. */
$anz_runden = (je nach kampf zwischen 1 und 1000+);
if ($anz_runden > 100)
$anz_runden = 100;
for($runde=0;$runde<=$anz_runden;$runde++) {
$schiff[2]['hp'] -= $schaden*$schiff[1]['hp']/100;
if ($schiff[2]['hp'] <= 0) {
$schiff[2]['hp'] = 0;
$runde = $anz_runden+1; /* schleife beenden */
}
$schiff[1]['hp'] -= $schaden*$schiff[2]['hp']/100;
if ($schiff[1]['hp'] <= 0) {
$schiff[1]['hp'] = 0;
$runde = $anz_runden+1; /* schleife beenden */
}
}
also beballern sich gegenseitig, bis eins tot oder die anz an runden erreicht ist (sehr schematisch und knapp).
mit nem limit von x runden funzt es .. mi nem limit von x+1 nicht ... obwohl der kampf ca. n*x runden geht (n > 2).
das ist mein problem.
php-version ist schon "älter" .. ist ne 4.xx .. ich schau nachher mal nach. Das Script läuft aber auch auf verschiedenen servern (mit verschiedenen PHP-versionen) nicht. undter php5 hab ich das noch nicht getestet.
nein.. es gibt keine endlosschleifen. ich nutze nur for-schleifen .. und der zähler wird nicht manipuliert.
referenzen nutz ich nicht.
eigentlich läuft das simpel so:
$schiff[1]['hp'] = 100;
$schiff[2]['hp'] = 100;
$schaden= 3; /*ja .. normal nen array mit waffen, etc. */
$anz_runden = (je nach kampf zwischen 1 und 1000+);
if ($anz_runden > 100)
$anz_runden = 100;
for($runde=0;$runde<=$anz_runden;$runde++) {
$schiff[2]['hp'] -= $schaden*$schiff[1]['hp']/100;
if ($schiff[2]['hp'] <= 0) {
$schiff[2]['hp'] = 0;
$runde = $anz_runden+1; /* schleife beenden */
}
$schiff[1]['hp'] -= $schaden*$schiff[2]['hp']/100;
if ($schiff[1]['hp'] <= 0) {
$schiff[1]['hp'] = 0;
$runde = $anz_runden+1; /* schleife beenden */
}
}
also beballern sich gegenseitig, bis eins tot oder die anz an runden erreicht ist (sehr schematisch und knapp).
mit nem limit von x runden funzt es .. mi nem limit von x+1 nicht ... obwohl der kampf ca. n*x runden geht (n > 2).
das ist mein problem.
php-version ist schon "älter" .. ist ne 4.xx .. ich schau nachher mal nach. Das Script läuft aber auch auf verschiedenen servern (mit verschiedenen PHP-versionen) nicht. undter php5 hab ich das noch nicht getestet.
gepostet vor 19 Jahre, 3 Monate von None
Original von Drezil
über 100 zeilen mal eben .. *g*
Stichwort OOP :roll:
Original von Drezil
php-version ist schon "älter" .. ist ne 4.xx .. ich schau nachher mal nach. Das Script läuft aber auch auf verschiedenen servern (mit verschiedenen PHP-versionen) nicht. undter php5 hab ich das noch nicht getestet.
Da sagt dir doch das etwas an deiner Programmierung nicht richtig sein kann. PHP5 wird genau dasselbe Ergebnis liefern. An PHP liegt es definitiv nicht, da kannst du meinen Vorgängern glauben...
Was noch zu einem TimeOut führen kann, ist eine "externe" Funktion die einfach nicht schnell genug mit dem Rechnen fertig wird (komplexe GD-Lib Scripte dürften einige Zeit zum durchlaufen brauchen). Ansonsten heißt es eben in den saueren Apfel beißen und Wert für Wert durchgehen...
Wette um nen Kasten Bier das es ne Endlosschleife ist :lol:
for Schleifen können übrigens sehr wohl bei falscher Programmierung (wie alle Schleifenarten) zur Endlosschleife werden...
gepostet vor 19 Jahre, 3 Monate von Drezil
klar koönnen for's auch endlos werden ... das allseits bekannte forever zum beispiel:
for (;;) {
}
.. das script ist schon "älter" .. ich muss mein spiel glaub ich eh nochmal neu coden .. alles linear, da mit oop zu überladen war .. aber langsam merke ich, dass große änderungen doch nciht mehr soo einfach sind ... *grml*
das k-sys schreib ihc schon auf oop um .. mal schaun, ob es dann noch weiter so zickt ...
außerdem hab ich mich oben vertippt .. nciht 100, sondern 1000 zeilen.. genauer 1400 .. aber so kommentiert, dass der überblich nicht flöten geht ..
externe funktionen werden nicht angesprochen..
wie gesagt:
1) lese ca 20 arrays voll aus der db
2) kämpfe in der schleife, bis einer tot oder rundenlimit erreicht
3) schreib die reste in die db
1) und 3) sind bei egal wie vielen schleifendurchläufen gleich. dauer ca. 0.2 sec.
nur der 2. teil zickt. abhängig davon, wieviele kämpfen und wieviel runden gekämpft werden.
will mal nen "timeout-skeptiker" nen blick in das script werfen (aber vorsicht .. mein code-stil ist gräßlich und an vielen stellen sind immernoch anfängerfehler)?
for (;;) {
}
.. das script ist schon "älter" .. ich muss mein spiel glaub ich eh nochmal neu coden .. alles linear, da mit oop zu überladen war .. aber langsam merke ich, dass große änderungen doch nciht mehr soo einfach sind ... *grml*
das k-sys schreib ihc schon auf oop um .. mal schaun, ob es dann noch weiter so zickt ...
außerdem hab ich mich oben vertippt .. nciht 100, sondern 1000 zeilen.. genauer 1400 .. aber so kommentiert, dass der überblich nicht flöten geht ..
externe funktionen werden nicht angesprochen..
wie gesagt:
1) lese ca 20 arrays voll aus der db
2) kämpfe in der schleife, bis einer tot oder rundenlimit erreicht
3) schreib die reste in die db
1) und 3) sind bei egal wie vielen schleifendurchläufen gleich. dauer ca. 0.2 sec.
nur der 2. teil zickt. abhängig davon, wieviele kämpfen und wieviel runden gekämpft werden.
will mal nen "timeout-skeptiker" nen blick in das script werfen (aber vorsicht .. mein code-stil ist gräßlich und an vielen stellen sind immernoch anfängerfehler)?
gepostet vor 19 Jahre, 3 Monate von Kampfhoernchen
Poste es doch einfach hier, oder schick mir ne PN
gepostet vor 19 Jahre, 3 Monate von neit
Wehe er postet seine 1000 Zeilen Code hier!
gepostet vor 19 Jahre, 3 Monate von Sarge
vllt produzierst du in deinem berechnungen ein index-out-of-bounds der bei 100 noch nicht auftritt aber halt bei 150 oder Division-by-Zero wenn der zähler irgendwo mitspielt...?
Schonmal ins phperror log geschaut ?
Das speicherlimit die einem Script zur Verfügung steht kannst du natürlich in deiner php.ini hochsetzen genauso wie die Max_execution time. Aber dadran glaub ich nicht.
Schonmal ins phperror log geschaut ?
Das speicherlimit die einem Script zur Verfügung steht kannst du natürlich in deiner php.ini hochsetzen genauso wie die Max_execution time. Aber dadran glaub ich nicht.