[PHP] Uitvoering script pauzeren

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • edie
  • Registratie: Februari 2002
  • Laatst online: 15:35
Ondanks zoektochten op internet en informatie te hebben gelezen over semaphores en shared memory, ben ik nog steeds niet een oplossing voor mijn 'probleem' tegengekomen. Hopelijk kan iemand hier mij helpen.

Semaphores en shared memory doen niet echt wat ik wil (hoewel semaphores dicht in de buurt komt en ik shared memory wellicht kan gebruiken).

Mijn probleem: ik wil de uitvoering/executie van een script pauzeren, totdat een variabele een bepaalde waarde heeft gekregen (of een functie wordt aangeroepen o.i.d., niet zo relevant), waarna de uitvoering verder gaat. De plek waar gepauzeerd moet worden zit binnen een infinite loop.

sleep is geen oplossing, aangezien deze niet direct kan reageren op de wijziging.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//-- een.php
$s = shm_attach(1);
shm_put_var($s, 3, rand());

//-- twee.php
$b = 0;
$s = shm_attach(1);
while(true)
{
  wait_for(defined(@shm_get_var($s, 3))); // wacht op wijziging
  echo shm_get_var($s, 3) . "\n"; // andere statements
  flush();
  shm_remove_var($s, 3);
}
?>

(ik weet niet of de code opzicht uitvoerbaar is, maar het gaat om het idee)

Voor de duidelijkheid: het gaat dus om regel 11. Het wachten moet zo min mogelijk processortijd in beslag nemen.

Het idee is dus dat een.php een willekeurige waarde in het geheugen stopt, en dat direct daarna twee.php de willekeurige waarde output (bijvoorbeeld naar een browser).

Is zoiets mogelijk in PHP? Zo niet, kan het met een andere omgeving/taal, zoals .NET, JAVA, Perl etc?

"In America, consumption equals jobs. In these days, banks aren't lending us the money we need to buy the things we don't need to create the jobs we need to pay back the loans we can't afford." - Stephen Colbert


Acties:
  • 0 Henk 'm!

  • geez
  • Registratie: Juni 2002
  • Laatst online: 18-09 21:41
Niet echt een manier om te pauzeren, maar kan een.php niet gewoon doorverwijzen naar twee.php?

[ Voor 30% gewijzigd door geez op 17-12-2007 18:06 ]


Acties:
  • 0 Henk 'm!

  • edie
  • Registratie: Februari 2002
  • Laatst online: 15:35
Doorverwijzen is nu juist niet de bedoeling :p De scripts moeten onafhankelijk van elkaar kunnen worden gebruikt.

"In America, consumption equals jobs. In these days, banks aren't lending us the money we need to buy the things we don't need to create the jobs we need to pay back the loans we can't afford." - Stephen Colbert


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Curl / XML- RPC geen optie dan?

Overigens krijg ik het gevoel dat je iets probeert te doen met PHP waar het niet voor gemaakt is. Webservers en PHP zijn gemaakt om stateless te opereren, als je iets anders ermee wilt kun je maar beter zorgen dat je van tevoren precies weet wat dat is en hoe je het voor elkaar wilt krijgen, want simpel is het niet ;)

[ Voor 83% gewijzigd door FragFrog op 17-12-2007 18:45 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • edie
  • Registratie: Februari 2002
  • Laatst online: 15:35
Wat ik probeer te doen (met PHP): Event Streaming to Web Browsers, ook bekend als Server Sent Events. En ik weet het, bij Opera hebben ze het over 'nog geen scalable oplossing voor PHP' en hebben zelf een mogelijke oplossing gemaakt in Java.

"In America, consumption equals jobs. In these days, banks aren't lending us the money we need to buy the things we don't need to create the jobs we need to pay back the loans we can't afford." - Stephen Colbert


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Zoek dan eens op Comet, dat is hoe de rest van de wereld pushed AJAX updates noemt ;)

Prima te implementeren ook onder PHP, zei het nog steeds ietwat tricky :P

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • edie
  • Registratie: Februari 2002
  • Laatst online: 15:35
Ook Comet heeft hetzelfde probleem wat ik heb; er wordt sleep en/of usleep gebruikt om uitvoering van het script tijdelijk te stoppen. En dat wil ik juist (proberen te) vermijden :)
This script will do an infinite loop and will return the server time as long as the client is connected.
PHP:
1
2
3
4
5
6
7
8
9
<?php
while(1) {
  echo '<script type="text/javascript">';
  echo 'comet.printServerTime('.time().');';
  echo '</script>';
  flush(); // used to send the echoed data to the client
  sleep(1); // a little break to unload the server CPU
}
?>

"In America, consumption equals jobs. In these days, banks aren't lending us the money we need to buy the things we don't need to create the jobs we need to pay back the loans we can't afford." - Stephen Colbert


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Waarom gebruik je geen polling dan? Je server gaat t niet leuk vinden als voor iedere user een process blijft draaien.

Acties:
  • 0 Henk 'm!

  • edie
  • Registratie: Februari 2002
  • Laatst online: 15:35
Polling zorgt voor (veel?) overhead; cookies worden meegestuurd, er moet een handschake e.d. worden opgezet, headers worden weer verzonden, etc.

Wellicht is er ergens een break-even punt, maar dat boeit mij op dit moment niet ;)

"In America, consumption equals jobs. In these days, banks aren't lending us the money we need to buy the things we don't need to create the jobs we need to pay back the loans we can't afford." - Stephen Colbert


Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
Als je script toch single CPU draait zit er geen verschil in het gebruik van sleep, of het gebruiken van een process met lage prioriteit. Windows is geen realtime systeem...

Als je multi-cpu draait kan je eens googlen op "thread interrupt", dit word door alle moderne talen ondersteunt ...

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 12:32

CyBeRSPiN

sinds 2001

Je wilt complexe I/O gebruiken (interrupts, synchronisatie ed), met een scripting taal. PHP is totaal niet ingericht voor dit soort oplossingen.

Wat je eigenlijk wil is dat hetgene wat zorgt voor de verandering van de variabele ook een functie aanroept, dan hoef je niks te pollen of wat dan ook. Dus ipv $x = 1, roep je de functie
setXandTrigger(1);

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Gebruik een while in je while om continue te checken of er output is. Zet hier een usleep van 1000 ( of willekeurige andere waarde ) in om je cpu niet continue te pollen en dus een redelijk rustige cpu te krijgen.

Het gaat toch alleen maar om output naar een browser als ik je verhaal begrijp ( dus human readable, dus is zelfs een usleep van 1000000 nog acceptabel waarschijnlijk ).

Edit , ik zie nu pas dat jij comet afkeurt omdat deze een sleep van 1 sec heeft, enige zin om uit te leggen waar je output voor gebruikt wordt? Want als het door mensen gelezen / gebruikt wordt is een sleep van 1 sec imho meer dan voldoende... Instant response klinkt leuk, maar als het 1 sec duurt merkt bijna niemand het en het scheel je berg processorkracht......

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
edie schreef op maandag 17 december 2007 @ 20:29:
Polling zorgt voor (veel?) overhead; cookies worden meegestuurd, er moet een handschake e.d. worden opgezet, headers worden weer verzonden, etc.
Overhead daarop heb ik liever dan voor elke gebruiker continu applicatie te laten draaien en een http verbinding open te houden. Denk eens hoeveel resources dat allemaal kost. Een polling request kan gewoon een '0' terugsturen en anders een JSON object met daarin de update die nodig is. Serieus, denk er eens over na. Zoals eerder gezegd is door andere users: PHP is niet bedoeld voor zulke dingen.

Acties:
  • 0 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 12:32

CyBeRSPiN

sinds 2001

Je oplossing staat trouwens in je sig :P

Denk eerst eens even heel goed na wat je precies wilt bereiken, en waarom je geen "doorverwijzing" wilt gebruiken.
Een php-script op je server doet namelijk uitzichzelf een sleep() totdat je het aanroept, waarna het direct reageert ;)

Acties:
  • 0 Henk 'm!

  • edie
  • Registratie: Februari 2002
  • Laatst online: 15:35
Thread-interrupts gaan niet werken, aangezien je niet kan weten welke thread nou bij welke connectie hoort (en alle variabelen gaan out-of-scope aan het einde van het script).

Naar mijn idee hoef ik helemaal geen 'complexe' I/O interrupts o.i.d... ik wil simpelweg dat de uitvoering van een script stopt en later weer verder gaat, zonder sleep te gebruiken. En of dit via events gebeurt, via een message queue, via een databasetrigger of op een andere manier maakt mij niet zoveel uit, zolang de uitvoering maar tijdelijk stopt.

In de loop gebeurt nog meer, zoals selecties naar een database, en het doen van nutteloze selecties wil ik voorkomen. Onder andere daarom wil ik geen fixed interval gebruiken.

Zoals eerder gezegd wil ik ook geen polling gebruiken; afgezien van het extra dataverkeer (cookies, headers, etc) levert ook polling nutteloze selecties op de database op en worden objecten voor het grootste gedeelte van de tijd nuteloos aangemaakt (m.a.w.: er is niks gewijzigd waar de client wat mee moet doen).

En als laatste: ik wil gewoon proberen of ik gebruik kan maken van server-sent events.

Het lijkt erop dat dit (nog) niet mogelijk is met PHP 5 en dat ik moet overgaan naar een andere taal/omgeving. Wellicht heb ik zelfs een aparte applicatieserver nodig welke zorgt voor hetgeen ik wil. En waarschijnlijk wordt het dan .NET of JAVA.

"In America, consumption equals jobs. In these days, banks aren't lending us the money we need to buy the things we don't need to create the jobs we need to pay back the loans we can't afford." - Stephen Colbert


Acties:
  • 0 Henk 'm!

  • AaroN
  • Registratie: Februari 2001
  • Laatst online: 16-08-2023

AaroN

JayGTeam (213177)

kan je niet aan de slag met c? Het lijkt me goed mogelijk om shared_memory uit te lezen dmv c en dan op deze manier jouw producer/consumer probleem op te lossen, zoals ik het probleem begrijp. Vervolgens kan je c bestand weer php aanroepen of gewoon de benodigde verrichtingen uitvoeren.

JayGTeam (213177)


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
edie schreef op dinsdag 18 december 2007 @ 10:54:
In de loop gebeurt nog meer, zoals selecties naar een database, en het doen van nutteloze selecties wil ik voorkomen. Onder andere daarom wil ik geen fixed interval gebruiken.

Zoals eerder gezegd wil ik ook geen polling gebruiken; afgezien van het extra dataverkeer (cookies, headers, etc) levert ook polling nutteloze selecties op de database op en worden objecten voor het grootste gedeelte van de tijd nuteloos aangemaakt (m.a.w.: er is niks gewijzigd waar de client wat mee moet doen).

En als laatste: ik wil gewoon proberen of ik gebruik kan maken van server-sent events.

Het lijkt erop dat dit (nog) niet mogelijk is met PHP 5 en dat ik moet overgaan naar een andere taal/omgeving. Wellicht heb ik zelfs een aparte applicatieserver nodig welke zorgt voor hetgeen ik wil. En waarschijnlijk wordt het dan .NET of JAVA.
Ook al ga je naar .Net of Java. Als je niet gebruik wilt maken van polling of set intervals loop je uiteindelijk tegen dezelfde muur aan.
Serieus, ga eens terug naar het begin van het probleem. WAT wil je bereiken hiermee. Post anders hier eens wat precies het probleem is wat je denkt op te lossen door de executie/uitvoering van een script te pauzeren. Dan kunnen wij je misschien vertellen in welke richting je de oplossing moet zoeken, want volgens mij zit je nu echt in de verkeerde hoek te zoeken.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Je kunt eens kijken naar Python, het Twisted framework is naar mijn weten erg geschikt voor Comet achtige applicaties.
Pagina: 1