Eventhandler

Chris Hunter
Ich habe ein Problem. Und zwar benötige ich für ein Browsergame einen eventhandler. Der steht auch schon ganz gut und läuft auch eine gewisse Zeit, aaaber irgendwann geht der in die Knie und dann merkt das keiner... Also benötige ich ein Script das prüft ob der Handler noch läuft. Ich habe mir überlegt den Handler einfach jede minute per cronjob aufzurufen und am anfang des handlers zu überprüfen ob der handler noch läuft:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
<?php $lockFileName='pid/test.pid';
// Lockfile Anlegen, sofern es noch nicht existiert
if(!file_exists($lockFileName)) {
    touch($lockFileName);
} 

//Lockfile öffnen
if($lockFile fopen($lockFileName"w+")) 
{
    //Lockfile sperren
    if(!flock($lockFileLOCK_EX LOCK_NB)) 
    {
        die("Das Script läuft schon");
    }
} 
else 
{
    //Fehler beim öffnen des Lockfile
    die("Konnte Lockdatei nicht zur prüfung öffnen");
}  

//irgendwas langes machen
sleep(15);
echo "Irgendwas langes abgeschlossen...\n"?>


Allerdings funktioniert das überhaupt nicht. Das Script läuft aber es kommt nicht die die meldung, sondern das script läuft paralel,ich hab keine Ahnugn wo der fehler liegt.

Oder hat jemand ne bessere idee? Irgendwie bin ich ratlos...
oder hat jemand n linux shellscript das sowas erledigen kann und einfach das script neu startet wenn es abbricht. da kenne cih mich halt net so gut aus...



Der Handler bricht übrigens immer mit dieser Fehlermeldung ab:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 186 bytes) in...
survivor
Wenn ich das Script ausführe kommt bei mir immer "Irgendwas langes abgeschlossen...". Entweder bin ich unfähig, ein lock auf die Datei zu setzen, oder irgendwas stimmt bei dieser Vorgehensweise nicht.
Wie kann ich in der Shell ein lock setzen?
Chris Hunter
Hier ich hab keine ahnung was da den speicher frist aber fakt ist das sich der allocierte Speicher immer weiter und weiter erhöht.

im eventhandler läuft einfach ne while(1) schleife mit ein paar funktionsaufrufen.
ich war eigentlich immer der meinung das speicher der innerhalb der funktionen allociert wird nach verlassen der funktion wieder frei wird. oder sehe ich das falsch?
alle variabeln in der whileschleife lösche ich jetzt schon wieder über unset und trotzdem schraubt sich das immer weiter hoch:
Siehe Anhang
birthdefect
Vielleicht liegt es daran:

Auch wenn das fopen in der IF-Bedingung steht,
so wird es nach Möglichkeit ausgeführt.

.. fopen($lockFileName, "w+") ..

Aber wenn es Positiv ist, dann fehlt irgendwo das fclose ($lockFileName);

Könnte es nicht sein, daß deshalb der Kontext des Prozesses
schneller steigt, als er mit die abgebaut werden kann?

Kann man vielleicht generell den Garbage-Collector vom
PHP-Server configurieren, daß er schneller auslöst
oder öfters drüberläuft?
birthdefect
Wenn alles nicht hilft, könntest Du ja die Strategie ändern.

Du Schreibst einfach eine Routine für den Cronjob, die
in regelmäßigen Abständen den Handler überhaupt neu
startet (und den alten runterfährt/stoppt).
Dann könntest Du Dir die Abfragerei ersparen.

Wenn der Kontext in einer Datenbank steckt, wäre das ja möglich,
da an und für sich nichts verloren geht, das widerspricht vielleicht
dem Actionlistenerprinzip, müsste aber einwandfrei funktionieren,
wenn die Sache in vernünftigen Zeitabständen getaktet ist.

Idee
Hanfling
PHP Version?
Und schmiert es auch bei 64MB Memory Limit ab oder pegelt es sich vorher ein? Vllt. bleiben ja die zurückgegebenen MySQL queries als Müll im Speicher.
Chris Hunter
Das Script sollte sich zur Zeit zwischen 300-400k einpendeln wenn es ordentlich läuft.

ich vermuste auch stark das es an den Querys liegt, da der Speicherzuwachs in verbindung mit der queryanzahl eines durchlaufs steht. Alledings gebe ich die Ressourcen mit mysql_free_result jedesmal frei und ich nutze keinerlei unbuffered querys. soweit ich das sehen kann hole ich auch alle ergebnise vom server ab.
aber egal wie man es dreht eigentlich sollte sowas nicht passieren.

Wer mal bischen Zeit hat dem kann ich das gesammte cronjob gedöhns mal schicken...


zur zeit mache ich es so das ich n einfach script habe:
php:
1:
2:
3:
4:
<?php while(1)
{
   system("php cronloop.php");
} ?>


Das startet den cronloop immer wieder neu. im cronloop habe ich ne grenze von 3MB gesetzt bei der sich der loop beendet und einfach durch obiges script neu gestartet wird. Aber so will ich das eigentlich nicht für immer haben...

Die laufende phpinfo gibts hier: http://www.chris-hunter.de/phpinfo.php
PHP Version ist derzeit 4.3.10
evtl werd ich auch PHP 5.1 umstellen und schaun ob das immer noch so ist. Aber ich befürchte ja.

kennt sich jemand aus mit php.ini einstellugnen die sowas betreffen könnten . garbage collector einstellugnen oder sowas.. ich finde einfach sehr wenig darüber im netz...
Hanfling
Naja... zwischen mature Versionen würde ich nur bedingt wechseln. Aber versuch mal eine aktuellere 4.*

Ansonten für folgenden Bug einfach nen patch einspielen:
Zitat:
Version 4.3.11
[...]
Fixed bug #31444 (Memory leak in zend_language_scanner.c).

http://de.php.net/ChangeLog-4.php

http://bugs.php.net/bug.php?id=31444

Das könnte sehr gut dein Problem sein.

PHP ist halt einfach nicht wirklich drauf ausgelegt längerfristig zu laufen als Script, deswegen wirst du wohl früher oder später immer mal je nach PHP Version auf solche Probleme stoßen...
Chris Hunter
na ja ich hab mal weiter gesucht und es wird sogar noch in PHP 5.2 versioenn von diesem Problem berichtet. Ich werde wohl trotzdem mal auf ne php 5.x version umsteigen. das game wurde sowieso unter php 5 entwickelt. mal sehen ob das was bringt...