PHP Socket de gehele sessie openhouden.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Kevin van der Burgt

Kevin van der Burgt

17/08/2010 15:10:47
Quote Anchor link
Hallo lezers,

Ik heb een heel vervelend probleem. Ik wil graag een socket hebben die de geheletijd open blijft staan. Ik heb het volgende geprobeerd:

http://dev.kevinvdburgt.nl/test/PHP%20COMET/Test%20001/test.php
(wacht 10 seconden nadat je op de link heb geklikt)
Je krijgt dan de code te zien.

Maar wat niet wil lukken is als het script backend.php word aangeroepen is de webserver die gehele 10 seconden onberijk baar. Is daar wat aan te doen?

En hoe krijg ik iets (like ebuddy, die ook sockets openhouden) en dan met ajax (COMET / Ajax Push)?

Gr,
Kevin van der Burgt
 
PHP hulp

PHP hulp

22/12/2024 18:46:55
 
Pim -

Pim -

17/08/2010 15:12:52
 
Kevin van der Burgt

Kevin van der Burgt

17/08/2010 15:16:43
Quote Anchor link
Pim de Haan op 17/08/2010 15:12:52:


Ja Pim, ik weet hoe ik een socket kan openen ;) Het gaat meer dat het script actief blijft met while(true) o.i.d.
 
Chris -

Chris -

17/08/2010 15:19:41
Quote Anchor link
Kevin, er zit een verschil tussen de persistant fsockopen en de normale fsockopen ;-)
 
Niek s

niek s

17/08/2010 17:01:37
Quote Anchor link
Sockets zijn veel ingewikkelder als PHP ze doet vermoeden.

Ik kan uit je verhaal niet helemaal opmaken wat je wilt, maar misschien kan je iets regelen met blocking/non-blocking sockets.

Blocking betekent dat een call om te lezen uit een socket gewoon "wacht" tot er data is, en non blocking probeerd te lezen, en als er niets is dan kapt ie meteen. Standaard staat dit op blocking (!)

Je kan dan iets maken als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
for(;;) {
 $data = leesVanSocket();
 if(er is data) {
  handel data af;
 } else {
  handel browser calls/shit af
 }
}


Dan blijf je altijd bereikbaar voor de clients die de pagina bezoeken

Mocht je daar niets mee kunnen, kan je bijvoorbeeld gebruik maken van select.
Dat is echter wel effe lastig om te begrijpen. Je zult sockets dan namelijk op een andere manier aan moeten maken, en anders moeten gebruiken. Je zal dan veel informatie over sockets en hoe ze werken meoten lezen, daarvoor verwijs ik je naar de php.net site. Als je het niet erg vind een voorbeeld in C te lezen, kan ik je altijd nog doorverwijzen naar Beej's Guide To Network Programming.
C is qua syntax erg gelijk aan PHP, en de manier om select() te gebruiken is ook nagenoeg hetzelfde. Dit kan je wellicht ook helpen.
maar let op: dan moet je dus geen gebruik maken van fsockopen! Je maakt dan gebruik van de echte onderliggende system calls..
Gewijzigd op 17/08/2010 17:02:04 door niek s
 
Kevin van der Burgt

Kevin van der Burgt

17/08/2010 17:15:04
Quote Anchor link
\"Niek:
Sockets zijn veel ingewikkelder als PHP ze doet vermoeden.

Ik kan uit je verhaal niet helemaal opmaken wat je wilt, maar misschien kan je iets regelen met blocking/non-blocking sockets.

Blocking betekent dat een call om te lezen uit een socket gewoon \"wacht\" tot er data is, en non blocking probeerd te lezen, en als er niets is dan kapt ie meteen. Standaard staat dit op blocking (!)

Je kan dan iets maken als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
for(;;) {
 $data = leesVanSocket();
 if(er is data) {
  handel data af;
 } else {
  handel browser calls/shit af
 }
}


Dan blijf je altijd bereikbaar voor de clients die de pagina bezoeken

Mocht je daar niets mee kunnen, kan je bijvoorbeeld gebruik maken van select.
Dat is echter wel effe lastig om te begrijpen. Je zult sockets dan namelijk op een andere manier aan moeten maken, en anders moeten gebruiken. Je zal dan veel informatie over sockets en hoe ze werken meoten lezen, daarvoor verwijs ik je naar de php.net site. Als je het niet erg vind een voorbeeld in C te lezen, kan ik je altijd nog doorverwijzen naar Beej\'s Guide To Network Programming.
C is qua syntax erg gelijk aan PHP, en de manier om select() te gebruiken is ook nagenoeg hetzelfde. Dit kan je wellicht ook helpen.
maar let op: dan moet je dus geen gebruik maken van fsockopen! Je maakt dan gebruik van de echte onderliggende system calls..


Bedankt voor de informatie, Ik wil graag een rCon client maken. Maar dan moet die socket altijd verbonden zijn. Ebuddy bijvoorbeeld. die houd zolang je het vesnter open hebt staan verbinding met de Microsoft Nameservers.
 
Niek s

niek s

17/08/2010 23:28:21
Quote Anchor link
Nee. Het heet een NS ja, maar is geen NameServer.
NS is bij MSN Messenger de afkorting voor Notification Server. Je hebt ook een SB, die heet het switchboard. Daar is genoeg over te vinden.

maar dat ter zijde.

Ik denk dat Ebuddy of AJAX of een push techniek zal gebruiken, die ondertussen dus een 2e proces opstart.

Zelf heb ik ooit een webmessenger gebouwd, werkte aardig, en dat zat als volgt in elkaar:

We hadden een Daemon (geschreven in C), die draaide altijd en luisterde naar sockets. De "client" (HTML/JS) deed AJAX requests naar een simpel PHP scriptje wat contact maakte met de Daemon om te vragen of er voor die sessie updates waren. Deze werden dan doorgegeven.

De C server zelf was ook weer lekker opgesplitst, we hadden 1 "moeder". Deze deed de communicatie tussen de echte daadwerkelijke MSN C-clients, en de PHP scripts. Deze moeder spawnde childs (fork()), waarmee via pipes gecommuniceerd werd. Iedere keer als er een update was, werd die over de pipe opgeslagen bij de moeder. Het ajax script zocht vervolgens af en toe (iedere paar seconden) contact met de moeder om te vragen of de bepaalde child updates had. Als die er waren werd dat uit die buffer gelezen.

Dus de complete rij was dus:
HTML/JS - PHP - "Moeder" - Child

De child deed de uiteindelijke socket communicatie met MSN.
 
Laurens Dragicevic

Laurens Dragicevic

17/08/2010 23:54:52
Quote Anchor link
kan ook zijn dat jij zoiets bedoeld



set_time_limit(0);// heeft geen execute tijd limiet

dan krijg je niet meer die 10 seconde bericht

en

ignore_user_abort(0);

kan gebruikt worden als je het script wilt laten draaien zelfs wanneer de venster weg is
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.