PHP Script Memory läuft voll

  • Hiho!
    Ich habe meine Raspberrys ganz neu, es sind beides B Modelle. Der eine läuft mit Openelec am TV. Am anderen versuche ich mit PHP und Mysql zu programmieren. Mehrere Projekte auf Webservern habe ich schon am laufen.
    Doch auf dem Raspberry PI will es nicht so wie ich. Mein Script holt sich XML Scripte (bis zu 512) nacheinander von einem Server. Das ist ein Anbieter für Fußballdaten, dort zahle ich auch Geld, daher kann ich diese Links nicht post. Nun versuche ich die XML Daten auszulesen, doch mein Script bricht nach einiger Zeit immer ab weil der Arbeitsspeicher voll läuft. Irgendwo scheine ich etwas nicht frei zugeben. Er soll bei jedem durchlauf der FOR Schleife wieder bei Null anfangen und alle Variablen leer sein, damit kein Speicher unnötig belegt wird.
    Hier mal mein Script vielleicht sieht ja jemand wo ich etwas ändern kann.
    Daten des Servers:
    Raspbian mit PHP
    PHP Version => 5.4.4-14+deb7u5




    Noch ein Top Auszug wo man das voll laufen sieht, das ist der Stand kurz vor dem abstürzen des Scripts
    top - 14:44:06 up 1:21, 2 users, load average: 0,35, 0,26, 0,14
    Tasks: 70 total, 2 running, 68 sleeping, 0 stopped, 0 zombie
    %Cpu(s): 14,9 us, 2,9 sy, 0,0 ni, 74,0 id, 5,2 wa, 0,0 hi, 2,9 si, 0,0 st
    KiB Mem: 448736 total, 440428 used, 8308 free, 13016 buffers
    KiB Swap: 102396 total, 0 used, 102396 free, 90952 cached


    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    2804 pi 20 0 296m 270m 5144 R 17,4 61,7 1:36.46 db_update_manns

  • Das Memory Limit kannst du oben im Script festlegen: http://www.php.net/manual/de/ini.core.php#ini.memory-limit zB so:[code=php]ini_set('memory_limit','64M');[/php]


    Allerdings solltest du lieber das Script fixen, zum Beispiel sehe ich ein Problem beim ersten Durchlauf der "for ($b = 0; $b < count($liga['xml_link']); $b++) {" Schleife, beim ersten Durchlauf gibt es $xml_file usw noch nicht also würde das unset() eine Fehlermeldung erzeugen (siehe: /var/log/apache2/error.log)

  • Ja aber wenn ich das Memory Limit im Script festlege bewirkt das doch nicht, dass das Script Memory spart, sondern nur das es dann abbricht sobald das Limit erreicht ist, oder?


    Das mit dem Unset werde ich bei der Stelle noch mal anschauen.

  • Ja, das erhöht das memory_limit , standardmässig ist das auf 128M eingestellt (/etc/php5/apache2/php.ini)


    Wegen unset() machst du entweder if(isset($xml_file)) davor oder du setzt vor das unset ein @ damit mögliche Fehler bzw Rückgaben unterdrückt werden


    Was genau in dem Script zu viel Ram verballert kann ich so nicht sehen, das könntest Du aber debuggen indem du an mehreren Stellen folgendes einfügst:
    [code=php]if (function_exists('memory_get_usage')) { $size=memory_get_usage(true)/1024/1024; echo "<br/>Memory Usage: ".$size."MB<br/>\n"; }[/php]
    Es gäbe auch noch memory_get_peak_usage

  • <br/>Memory Usage: 0.25MB<br/>
    <br/>Memory Usage: 0.25MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>
    <br/>Memory Usage: 0.5MB<br/>



    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    2762 pi 20 0 117m 91m 5164 S 33,2 20,8 0:12.49 db_update_manns


    Das ist die Anzeige, trotzdem geht der Verbrauch bei der Top Anzeige auf 20% hoch. Wie passt das zusammen?


    Ich denke das Problem hängt auch damit zusammen das die XML Dateien geladen werden und ja im Script temporär gespeichert werden. Diese werden von einer externen URL geladen.


    Danke schon einmal für deine Hilfe!

  • Dann probiers mal mit

    PHP
    memory_get_usage(false)[/php] anstelle von
    [code]memory_get_usage(true)



    Aber wie gesagtm ich kenn das Script nicht und weiss auch nicht wie die anderen Dateien aussehen oder gar wie die Datenbank aufgebaut ist usw

  • Wenn ich das richtig verstehe, dann bricht PHP irgendwann ab. Ich habe mal Ausschau nach der konkreten Fehlermeldung gehalten, die durch PHP ausgegeben wird. Meldet er Dir denn tatsächlich zurück, dass der Speicher voll ist? Ich überlege gerade, ob es nicht auch noch andere Ursachen haben könnte, weswegen sich das Script so verhält...


  • Ja, das erhöht das memory_limit , standardmässig ist das auf 128M eingestellt (/etc/php5/apache2/php.ini)


    Wenn das Script über die CLI aufgerufen wird ( php /pfad/zum/script.php ) dann ist nicht die


    /etc/php5/apache2/php.ini
    zuständig sondern die


    /etc/php5/cli/php.ini


    Dort steht das memory_limit per default auf -1

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?


    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

    Edited once, last by Der_Imperator ().

  • Ich werde später mal schauen, mein RaspberryPI macht gerade eine etwas lange aufgabe auf einer anderen SD Karte. Das kann leider bis zu 20h dauern Stand da.
    Ich habe jetzt mal das Memory Limit im Script auf 16 gesetzt. So ganz verstehe ich die Prozentzahl von Top noch nicht, aber das Script bricht jetzt nicht mehr ab und der RAM läuft auch nicht mehr voll. Das mit mit dem memory_get_usage(false) werde ich noch mal versuchen sobald der PI wieder frei ist.


    Das Script hatte ich aber gepostet. :) Nur die XML Dateien nicht.