[PHP] Script oneindig runnen en memory

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
In een PHP bestand heb ik een oneindige loop gezet die permanent moet blijven draaien. Ik zet dit script op het moment aan door middel van de command line in een screen van Linux. Dit werkt allemaal prima, alleen na een dag of 2 stopt het script er mee in verband met de memory.

De oorzaak hiervan is waarschijnlijk dat de output die wordt bewaard steeds groter wordt, er wordt namelijk elke loop aangegeven hoe deze is verlopen d.m.v. een echo.

Nu is mijn vraag, hoe kan ik er voor zorgen dat alles wat door het script is gegenereerd d.m.v. de echo's uit het geheugen wordt gegooid zodat het script er niet mee stopt na een dag of 2?

Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 16-09 02:11
Wat heb je zelf al geprobeerd? Heb je al naar cron gekeken? PHP is niet bedoeld om eindeloos te runnen.

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb flush() en varianten daarvan geprobeerd, zonder resultaat. Ook heb ik een functie geprobeerd die het scherm schoonveegt, maar dit zorgt er alleen voor dat het scherm leeg wordt, niet dat het gebruikte geheugen wordt vrijgegeven.

Het gaat om een crawler, dus die zou in principe eindeloos moeten draaien.

Acties:
  • 0 Henk 'm!

  • ERIKvanPAASSEN
  • Registratie: September 2006
  • Laatst online: 09-08 17:46

ERIKvanPAASSEN

Bug Killer

Misschien kun je de code posten? Anders blijft het natuurlijk gewoon gokken. Maar zoals _eXistenZ_ al zegt, is PHP hier eigenlijk gewoon niet voor bedoeld.

Acties:
  • 0 Henk 'm!

  • Emmeau
  • Registratie: Mei 2003
  • Niet online

Emmeau

All your UNIX are belong to us

ik zou een bash script eromheen bouwen

code:
1
2
while (!doomsday)
  run (your script)



kan php mooi de zaak opruimen naar iedere run

[ Voor 5% gewijzigd door Emmeau op 06-08-2010 00:02 ]

If you choose to criticise you choose your enemies


Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024

CMG

Ik zou eens erover denken om het anders op te lossen... PHP is niet echt bedoeld om achtergrond procs te draaien...

offtopic:
vergeten te refreshen voordat ik post, sorry voor de dubbel post.

[ Voor 26% gewijzigd door CMG op 06-08-2010 00:05 ]

NKCSS - Projects - YouTube


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 17-09 20:43
Al gedacht aan cronjob?

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 17-09 14:28
Als ik jou was zou ik eens kijken naar het pakket van Kevin van Zonneveld: System_Daemon, te installeren via PEAR.

Info: Create daemons in PHP

Acties:
  • 0 Henk 'm!

  • Lulukai
  • Registratie: Maart 2007
  • Laatst online: 17-09 22:33

Lulukai

God's gift to women

Interesse in dit topic. Ik heb ook een PHP script lopen in een terminal dat elke seconde controleert of er iets nieuw binnen is.

.


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Hier zijn cronjobs gewoon voor bedoeld... gebruik ze derhalve daar ook voor :)

Acties:
  • 0 Henk 'm!

  • Lulukai
  • Registratie: Maart 2007
  • Laatst online: 17-09 22:33

Lulukai

God's gift to women

_eXistenZ_ schreef op donderdag 05 augustus 2010 @ 23:55:
Wat heb je zelf al geprobeerd? Heb je al naar cron gekeken? PHP is niet bedoeld om eindeloos te runnen.
Hoe kan je dan wel best elke seconde controleren of er nieuwe gegevens binnen zijn gekomen in een MySQL-table? Dmv een cronjob die het script aanroept?

[ Voor 5% gewijzigd door Lulukai op 06-08-2010 09:35 ]

.


Acties:
  • 0 Henk 'm!

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Misschien elk uur een cronjob starten en met set_time_limit(3600) het script afkappen na een uur. Mocht het script de neiging hebben om eerder al de mist in te gaan, dan heb je wel een probleem en kun je beter iets doen zoals Manuel voorstelt.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Acties:
  • 0 Henk 'm!

Verwijderd

PHP is inderdaad niet echt DE taal om dit in te doen,

Zelf gebruik ik hiervoor doorgaans PERL omdat dit en stabiel en krachtig is en qua syntax niet echt veel afwijkt van PHP. Ook is het daemonized opzetten van een Perl app redelijk eenvoudig en heb je meer controle en niet de beperkingen die PHP heeft in CLI mode

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

ruyckske schreef op vrijdag 06 augustus 2010 @ 09:34:
[...]

Hoe kan je dan wel best elke seconde controleren of er nieuwe gegevens binnen zijn gekomen in een MySQL-table? Dmv een cronjob die het script aanroept?
Elke seconde? Tering, hoe hoge load wil jij op je server veroorzaken?
Wat wil je uberhaupt doen dat je 3600 keer per uur je database wil controleren?

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Japius
  • Registratie: April 2003
  • Laatst online: 30-08 20:57
ruyckske schreef op vrijdag 06 augustus 2010 @ 09:34:
[...]

Hoe kan je dan wel best elke seconde controleren of er nieuwe gegevens binnen zijn gekomen in een MySQL-table? Dmv een cronjob die het script aanroept?
De gegevens komen ook IN de database. Je zou een trigger aan het die insert kunnen hangen, zodat je niet meer elke seconde hoeft te checken maar alleen als er een update van je dataset is geweest.

Acties:
  • 0 Henk 'm!

  • Lulukai
  • Registratie: Maart 2007
  • Laatst online: 17-09 22:33

Lulukai

God's gift to women

Een extern (niet open-source) programma zet ze erin, dus het is moeilijk om er zelf nog een trigger aan te hangen.

.


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ruyckske schreef op vrijdag 06 augustus 2010 @ 10:00:
Een extern (niet open-source) programma zet ze erin, dus het is moeilijk om er zelf nog een trigger aan te hangen.
ligt eraan wat je wilt doen na de insert... want vanaf bijv. mysql 5 kun je ook triggers in je database zelf zetten...

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Verwijderd schreef op donderdag 05 augustus 2010 @ 23:52:
Nu is mijn vraag, hoe kan ik er voor zorgen dat alles wat door het script is gegenereerd d.m.v. de echo's uit het geheugen wordt gegooid zodat het script er niet mee stopt na een dag of 2?
Ik weet niet of die echo's je probleem zijn, en de commentaren hierboven geven misschien betere oplossingen maar toch:

Blijft je venster waarin je het script start openstaan? Je kan een script namelijk ook in de achtergrond draaien (losmaken van je cmd) door er een & achter te plaatsen. Verder kan je ook je 'echo' of output naar een bestand wegschrijven of als je de output niet nodig hebt, wegschrijven naar /dev/null.

Alleen denk ik niet dat de echo's het probleem zijn in dit geval. de output in een cmd heeft ook een beperkt aantal regels en te veel wordt normaal automatisch uit het geheugen verwijderd. Anders kan je even naar de instelling kijken of die niet op oneindig zou staan.
Ik zou in dit geval eens kijken of je wel overal een mysql_free_result() gebruikt hebt. Of dat je andere data (array's ed.) vrij geeft met een unset() of zo.

Goed, dat gezegd zijnde wil er ik er nog eens op wijzen dat er betere wegen naar Rome zijn. Heeft de data in de database bv een timestamp? Anders zet die er op, zo kan je controleren welke nieuwe data zijn, dan kan je via een ge-cronned script werken ipv met een daemon. Of nog beter inderdaad een trigger die op de insert zit als dat mogelijk is.

Acties:
  • 0 Henk 'm!

  • Bene
  • Registratie: Augustus 2000
  • Laatst online: 17-09 11:45

Bene

list incomprehension

Buiten alle valide opmerkingen hierboven, nohup php mijnscript.php &?

[ Voor 38% gewijzigd door Bene op 06-08-2010 10:31 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Wellicht dat het maken van een daemon iets voor jou is:

Create daemons in PHP :)

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Zou eerst maar eens nagaan of het wel aan de echo functie ligt. Zou na een flush redelijk schoon moeten zijn. Laat je de boel niet ergens anders vollopen? Alternatieven genoeg trouwens voor 'echo' bijv php://temp
http://php.net/manual/en/wrappers.php.php

Als je je script een keer profiled en alle memoryleaks eruit kan halen, zie ik geen probleem om PHP te laten draaien. Iedere seconde rauw de mysql database raadplegen lijkt me wat overdreven, hoewel de load imo wel mee zal vallen, toch wel energieverspilling.

Zoals eerder gezegd, trigger on insert > insert to temptable. Temptable ophalen en flushen? Je kunt ook naar een file schrijven en die lezen in jouw script.

[ Voor 8% gewijzigd door r0bert op 07-08-2010 15:48 ]

Pagina: 1