[PHP] Regel nummer console script met ctrl-c

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Consequator
  • Registratie: Juli 2000
  • Laatst online: 10-09 22:54
Ik heb wat moeite met een php script die in een while(1) lus een mysql database in de gaten houd en zo nu en dan wat dingen daar mee uit spookt. Dit script draait vanaf de prompt in een screen sessie op mijn linux 'server'.
Op een bepaald moment zit het script gewoon vast, en ik kan maar niet ontdekken waar hij nou precies vast gaat zitten of dat het daadwerkelijk vast zit of gewoon ergens in een oneindige lus terecht is gekomen.
Dit kan ergens tussen een paar uur en een paar weken gebeuren zonder aantoonbare aanleiding.

Weet iemand of het mogelijk is om het regel nummer te krijgen zodra ik op ctrl-c druk ?
Ik had al wel een __LINE__ variabele gevonden via google maar als het script vast zit dan schiet dat ook niet op :-)

Acties:
  • 0 Henk 'm!

  • frankivo
  • Registratie: Januari 2002
  • Laatst online: 02-06 13:53
op wat tactische punten wat output schrijven naar een bestand zou je al verder moeten kunnen helpen

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Geen idee, maar ik denk dat je sowieso beter kunt kijken naar een andere oplossing dan een while(1) lus. Beter is om het script als cron-job uit te laten voeren en gewoon door het OS te laten afhandelen.

Acties:
  • 0 Henk 'm!

  • frankivo
  • Registratie: Januari 2002
  • Laatst online: 02-06 13:53
HuHu schreef op maandag 30 augustus 2010 @ 11:12:
Geen idee, maar ik denk dat je sowieso beter kunt kijken naar een andere oplossing dan een while(1) lus. Beter is om het script als cron-job uit te laten voeren en gewoon door het OS te laten afhandelen.
very true

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Je kunt anders ook kijken naar: Create Daemons in PHP

Acties:
  • 0 Henk 'm!

  • Consequator
  • Registratie: Juli 2000
  • Laatst online: 10-09 22:54
Op zijn piek loopt hij elke 1 a 2 seconden in de db de zoeken, cron is dus geen optie.
Ik heb op verscheidene punten al text output staan, maar het hele script is ~1500 regels en dan wordt het nog al spammerig om te lezen.
Die 'create deamons' link is wel handig, dank daar voor, maar een regel nummer bij abort is dus niet mogelijk blijkbaar ?

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Sorry dat ik het zeg, maar een 1500 regels groot PHP script dat elke 1 à 2 seconden wordt aangeroepen met een while(1) erin klinkt toch echt als een heel slecht ontworpen iets.

Ik zou toch eens proberen van de huidige oplossing af te stappen en op een hoger niveau na te gaan denken wat er nu moet gebeuren.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Als je exact wilt weten waar je script op dat specifieke moment mee bezig is zou je met een debugger moeten verbinden met je script. Ik heb echter geen enkel idee of er een debug tool voor PHP bestaat die kan verbinden met een al draaiend script.

Bottom line is voornamelijk 'Right tool for the Job'. Php is nooit gebouwd om z'n scripts lang te laten draaien. Waarschijnlijk kun je redelijk simpel om dit probleem heen werken door je php te herschrijven zonder lus (en dus herbouwen naar een script met een eenmalige actie) en deze dan in een bash script in een lus te zetten.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Dorgaldir
  • Registratie: September 2009
  • Laatst online: 10-04 22:52

Dorgaldir

Creature of the web

zoals al gezegd denk ik dat het beter is om met cronjobs oid te werken.
Je zegt dat je het script oneindig laat werken en klaagt dat het ergens vastloopt.
Wat als je nu eens met een cronjob om het uur het script start en er een begrenzing in zetten dat hij na een uur stopt, waardoor je script eigenlijk toch altijd loopt maar toch elk uur terug word gestart.
Als het dan uitvalt is het maar tot het volgende uur, dan start het script automatisch terug op.

Dat lijkt mij een pak beter dan een while(1) loop, ik ben zelf geen php expert, ver van zelfs, maar dat durf ik toch niet gebruiken :p

Just me


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Janoz schreef op dinsdag 31 augustus 2010 @ 16:00:
Php is nooit gebouwd om z'n scripts lang te laten draaien.
Waarom niet? Je kan PHP ook voor commandline scripting gebruiken. Granted, ook daar is het onwenselijk om een while (true) in te bouwen, maar een of ander conversiescript dat 2 uur nodig heeft om te draaien is best denkbaar. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
NMe schreef op dinsdag 31 augustus 2010 @ 16:09:
[...]

Waarom niet? Je kan PHP ook voor commandline scripting gebruiken. Granted, ook daar is het onwenselijk om een while (true) in te bouwen, maar een of ander conversiescript dat 2 uur nodig heeft om te draaien is best denkbaar. :)
Dat het kan betekend niet dat het er voor gemaakt is natuurlijk. In de basis is PHP gewoon ontworpen voor kortlopende scripts.

Maar ik denk dat je er toch niet aan ontkomt om goede logging in te bouwen, zodat je kan zien wat er allemaal gebeurt. Als je een debugger aan een reeds draaiend script kan attachen is dat natuurlijk nog makkelijker, maar ik weet niet of dat mogelijk is.

[ Voor 3% gewijzigd door Woy op 31-08-2010 16:21 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • frankivo
  • Registratie: Januari 2002
  • Laatst online: 02-06 13:53
strace is misschien ook een optie, maar waarschijnlijk is dat iets teveel van het goeie 8)

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • analog_
  • Registratie: Januari 2004
  • Niet online
Dump while, gebruik cronjobs.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

NMe schreef op dinsdag 31 augustus 2010 @ 16:09:
[...]

Waarom niet? Je kan PHP ook voor commandline scripting gebruiken. Granted, ook daar is het onwenselijk om een while (true) in te bouwen, maar een of ander conversiescript dat 2 uur nodig heeft om te draaien is best denkbaar. :)
Er is natuurlijk een groot verschil tussen 'lang draaien' en 'lang draaien'. Een script dat een eenmalige langdurige actie uitvoert is niet hetzelfde als een script dat als een soort daemon blijft draaien.

Daarnaast kunt hetgeen je wilt doen ook in assembly schrijven natuurlijk.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Janoz schreef op dinsdag 31 augustus 2010 @ 16:47:
[...]

Er is natuurlijk een groot verschil tussen 'lang draaien' en 'lang draaien'. Een script dat een eenmalige langdurige actie uitvoert is niet hetzelfde als een script dat als een soort daemon blijft draaien.
Dat is inderdaad een beetje de nuance die ik in mijn vorige post wilde maken. :P PHP is net zo geschikt als elke andere scriptingtaal om dingen lang te draaien, maar net zoals elke scriptingandere taal is 't niet bepaald geschikt om dan maar iets dat permanent moet draaien in te schrijven. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Even buiten het advies dat hierboven gegeven is, ik ga bij een vraag toch altijd even kijken of het toch mogelijk is.

Je kan blijkbaar een signal opvangen in php:
http://www.phpdevblog.net...nds-and-fatal-errors.html

En als je dan elke zoveel regels de waarde van __LINE__ naar een variabele schrijft en die in de functie waar je een signal afvangt naar het scherm printen of naar een file schrijven.

Maar inderdaad zijn er betere mogelijkheden. Een cronscript bv.

Ik vraag me trouwens af;
Je doet een ctrl+C dat wil zeggen dat je proces nog aan je terminal vast hangt? Dus je moet ook ten alle tijde je terminal laten openstaan?

Acties:
  • 0 Henk 'm!

Verwijderd

kluyze schreef op dinsdag 31 augustus 2010 @ 17:02:
...
Ik vraag me trouwens af;
Je doet een ctrl+C dat wil zeggen dat je proces nog aan je terminal vast hangt? Dus je moet ook ten alle tijde je terminal laten openstaan?
Nee, het script draait in screen. :) Een must-have als je de linux commandline gebruikt als je het mij vraagt!
Consequator schreef op maandag 30 augustus 2010 @ 11:06:
...
Dit script draait vanaf de prompt in een screen sessie op mijn linux 'server'.
...

Acties:
  • 0 Henk 'm!

  • Consequator
  • Registratie: Juli 2000
  • Laatst online: 10-09 22:54
screen is idd een must have, en het 'heel slecht ontworpen iets' valt nou ook wel weer mee ..
de while lus is maar iets van 20 regels en de rest zijn losse functies die her en der worden aangeroepen, bij het starten gebruikt hij 1.3Mb ram en na 3 weken zit dat nog maar op 3mb omdat mijn php versie geen goeie garbage collector heeft en ik geen zin heb om mijn distro over hoop te halen en de laatste versie handmatig te installeren ;)

Anyways bedankt voor de input, ik pruts nog wel even verder.

  • Lulukai
  • Registratie: Maart 2007
  • Laatst online: 12:54

Lulukai

God's gift to women

Consequator schreef op woensdag 01 september 2010 @ 11:43:
de while lus is maar iets van 20 regels en de rest zijn losse functies die her en der worden aangeroepen, bij het starten gebruikt hij 1.3Mb ram en na 3 weken zit dat nog maar op 3mb omdat mijn php versie geen goeie garbage collector heeft en ik geen zin heb om mijn distro over hoop te halen en de laatste versie handmatig te installeren ;)

Anyways bedankt voor de input, ik pruts nog wel even verder.
Prutsen is inderdaad het goeie woord, ik heb ook zoiets draaien zoals jij ;) . Helaas nog geen perfecte oplossing gevonden dus doe ik het ook met een while(1)

.

Pagina: 1