Het betreft het volgende...
Ik heb een PHP script dat ik draai vanaf de shell ( php -q /path/to/script.php ) en wat een oneindige while loop bevat. Dit scriptje moet eigenlijk 24/7 draaien... In deze loop word gecommuniceerd via non-blocking sockets...
Pseudo code achtig komt het neer op het volgende:
In principe sluit de andere kant de socket nooit maar als het gebeurd dan kan ik dat detecteren door de feof() constructie aan het begin van de loop...
Als echter mijn kabel er voor enige tijd uit dondert (5 minuten of zo)... en hij komt even later weer up dan is de socket gewoon onbruikbaar. Echter, de feof() constructie werkt dan niet omdat nooit een end-of-file is ontvangen... In dit geval blijft ie dus doorloopen maar zal nooit meer iets ontvangen...
Ik wilde het eerst oplossen met socket_set_timeout(), maar dat is alleen van toepassing op het lezen/schrijven van en naar de socket en aangezien ik een non-blocking socket gebruik returned ie gewoon bij een leespoging en werkt dit dus volgens mij niet...
Is iemand hier bekend mee? Een andere oplossing zou een soort PING PONG systeem a la IRC zijn...
Ik heb een PHP script dat ik draai vanaf de shell ( php -q /path/to/script.php ) en wat een oneindige while loop bevat. Dit scriptje moet eigenlijk 24/7 draaien... In deze loop word gecommuniceerd via non-blocking sockets...
Pseudo code achtig komt het neer op het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| while( true ) { // kijk of de andere kant de connectie gesloten heeft... if ( feof( $socket ) ) { break; // of reconnect, whatever... } // kijk of er een packet available is en idle anders even. if ( $packet = fread( $socket , 4096 ) ) { // blabla doe leuke dingen hier... } else { usleep( 5 ); } } |
In principe sluit de andere kant de socket nooit maar als het gebeurd dan kan ik dat detecteren door de feof() constructie aan het begin van de loop...
Als echter mijn kabel er voor enige tijd uit dondert (5 minuten of zo)... en hij komt even later weer up dan is de socket gewoon onbruikbaar. Echter, de feof() constructie werkt dan niet omdat nooit een end-of-file is ontvangen... In dit geval blijft ie dus doorloopen maar zal nooit meer iets ontvangen...
Ik wilde het eerst oplossen met socket_set_timeout(), maar dat is alleen van toepassing op het lezen/schrijven van en naar de socket en aangezien ik een non-blocking socket gebruik returned ie gewoon bij een leespoging en werkt dit dus volgens mij niet...
Is iemand hier bekend mee? Een andere oplossing zou een soort PING PONG systeem a la IRC zijn...