Sockets
Wat is beter voor een chat bijvoorbeeld?
Steeds een ajax request doen met javascript of PHP sockets gebruiken?
Hoe doe je iets verzonden naar een socket? Ik neem aan dat je nog steeds javascript nodig hebt als je met een socket werkt, maar ik zou niet weten hoe je nu communiceert.
Hoe is een socket eigenlijk verbonden over het internet? is het een soort verbinding die pas sluit als er opdracht voor wordt gegeven?
Als iemnd in de chat iets zegt, dan komt dat ook bij de ander natuurlijk op het beeldscherm, maar PHP kan toch niks met de browser, de server kan niks sturen naar de client, maar wel andersom.
En heb je dus daarom javascript nodig?
Kan iemand me dus uitleggen hoe zoiets werkt? ik wist eerst niet eens dat sockets in PHP bestonden (wel in JAVA)
uitleg
script
(zijn wel engelstalig)
Heel het internet draait trouwens op sockets. Als bijvoorbeeld een http server on line komt opent die een server socket. Als iemand een url in een browser opvraagt opent die een client socket die verbinding legt met die server socket. Die verbinding is een soort tweeweg buis waar je tekst doorheen kunt sturen. De browser stuurt een tekstje dat we een 'http request' noemen door die socket. Dat moet wel aan bepaalde standaarden voldoen anders gaat de server het natuurlijk niet snappen. De server leest dat tekstje door en stuurt afhankelijk van wat daar in staat de inhoud van een pagina terug. De browser beeldt die inhoud af op het scherm. Zo'n soort verhaal kun je ook over e-mail vertellen, over DNS, en al het andere: onder de oppervlakte worden er strings via sockets heen en weer gestuurd. Het versturen zelf is vrij ingewikkeld, gelukkig hoef je dat niet te begrijpen om met sockets te werken. Wat wel handig is om te weten:
- je kunt de verbinding open houden (sneller)
- je kunt als de verbinding nog open staat ook van de server strings naar de client pushen. De server hoeft dus niet te wachten tot de client weer met een request komt. Dat is wel handig voor chat applicaties.
Als je toch wilt weten hoe de verzending werkt zie packet switching.
Gewijzigd op 12/12/2012 11:18:52 door Henk Verhoeven
Maar bij sockets kwam ik in de war.
Ik wil dus ook echt een soort verbinding die zo min mogelijk belastend is, zo min mogelijk dataverkeer kost, en ook nog eens door vele mensen kan worden gebruikt.
Dan moet je natuurlijk goed nadenken.
Als ik nou bijvoorbeeld 2 bezoekers op dezelfde pagina (de chat) heb, op een website.
Dan heb ik 2 clients.
Als ik nu van de ene client data (tekst) wil versturen naar de andere client, dan gaat die data via de webserver naar de andere client.
De server is dus een doorgeefluik. Dat doorgeefluik kan dus ook controles uitvoeren (grootte van data, etc.)
Als ik dit bovenstande wil doen, hoe maak ik dat dan? En heb je nog iets speciaals nodig naast PHP?
Het is natuurlijk ook mogelijk om d.m.v computerprogramma's via internet tussen computers te communiceren (via internet, of via LAN in het zelfde gebouw), maar dat is
iets anders als via een website.
Toevoeging op 12/12/2012 20:42:28:
En hoe weet je eigenlijk welke server poort je moet gebruiken?
Kijk op PHP.net of zoek een voorbeeld op internet. Ik heb eigenlijk weinig kunnen vinden, maar ik weet dat het best vaak wordt gebruikt voor chats. Het is zelfs beter dan elke seconde javascript een request te laten doen, omdat dat veel belastender is.
http://www.flynsarmy.com/2012/02/php-websocket-chat-application-2-0/
Het zijn maar 60 regels code serverside en 68 regels client-side.
OK, de code van de WebSocket class is een stuk lasiger, die begrijp ik ook zo snel niet, en de documentatie op php.net is ook niet echt duidelijk over wat er nu precies gebeurt in blocken en in non-blocking mode, maar alle begin is moeilijk, waarom probeer je het niet gewoon uit en probeer je door ervaring te leren?
En denken jullie dat een host dit wel leuk vindt als ik hiermee ga experimenteren? Of maakt dat helemaal niks uit?
Als je het in het echt wilt gaan doen, aan het internet, wordt het een ander verhaal. Sommige providers hebben misschien een firewall. Firewalls kunnen zowiezo roet in het eten gooien voor socket-verbindingen. Niet de firewalls die de meeste mensen thuis in hun router hebben, maar wel die op kantoren enzo. En niet bij alle providers kun je de command line gebruiken. Je kunt dan een gewoon php script via http starten door het met je browser op te vragen, met daarin set_time_limit(0), maar dat zal bij veel providers niet werken (safe mode) en als het wel werkt kan het leiden tot allerlei nooit-eindigende threads, dus als dat mis gaat kan ik mij voorstellen dat je provider daar niet blij mee zal zijn. En tenslotte ondersteunen niet alle browsers html 5...
Maar het blijft natuurlijk een interessante techniek en problemen zijn er om op te lossen ;-)
Als ik het goed begrijp heb je dus ook javascript nodig om ajax requesten te doen? Omdat het PHP script dat voor de socket verbinding zorgt niet opnieuw voor een client moet worden opgestart (dus de pagina waar de PHP op staat mag niet worden herladen)
Je hebt toch geen html 5 nodig? Het gaat er toch om dat je het PHP script kan laten weten wat er moet worden doorgegeven aan de andere clients? Dan geef je dat door met een ajax request aan de PHP pagina. Maar dan vind ik het wel weer raar dat een ajax request eigenlijk ook de PHP pagina herlaadt. Dat vind ik nou zo raar. Is een PHP socket zoiets als een session? Ik dacht altijd dat PHP alleen kan worden uitgevoerd op het moment dat een pagina laadt.
Gewijzigd op 23/12/2012 21:22:39 door Mark Hogeveen