PHP Socket de gehele sessie openhouden.
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
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.
Kevin, er zit een verschil tussen de persistant fsockopen en de normale fsockopen ;-)
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)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
for(;;) {
$data = leesVanSocket();
if(er is data) {
handel data af;
} else {
handel browser calls/shit af
}
}
$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
\"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:
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..
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)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
for(;;) {
$data = leesVanSocket();
if(er is data) {
handel data af;
} else {
handel browser calls/shit af
}
}
$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.
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.
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