Autor | Zpráva | ||
---|---|---|---|
Nickname Profil * |
#1 · Zasláno: 3. 7. 2012, 09:37:29
Dobrý deň, mám taký špecifický problém. Mám v PHP naprogramovaný WebSocket server, ktorý súčasne počúva aj na UDP... ak prídu dáta z UDP, chcem ich hneď poslať klientom pripojeným na web socket... Avšak vyzerá to momentálne tak, že v jednej nekonečnej slučke viem zachytiť len jednu konekciu a to buď UDP alebo buď Web Socket...súčasne nejdú zachytiť obe. Myslím si, že je to z toho dôvodu, že ak mám v kóde
$buf = socket_read($socketD,1024); tak tu slučka zastane a čaká na údaje z UDP (ďalej cyklus nepokračuje až kým nemá dáta) avšak ak mám predtým v kóde
$a = socket_select($changed, $write, $except,NULL) ; čaká zase na údaje z web socketov a cyklus až na socket_read nepríde kým nepridu dáta z web socketov... Keď tam mám len jeden zo spomínaných príkazov, to čo má robiť konkrétny príkaz funguje (ak je socket_read tak číta dáta z UDP ak socket_select tak čita z web socketov).
public function run() { // main run loop $socketD = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); if($socketD === FALSE) { //omg, something went wrong echo 'socket_create failed: '.socket_strerror(socket_last_error())."\n"; exit(1); } if(!socket_bind($socketD, "0.0.0.0", 1234)) { //socket_close($socketD); echo 'socket_bind failed: '.socket_strerror(socket_last_error())."\n"; exit(1); } while(true){ $changed = $this->sockets; $write = array(); $except = array(); $buf = socket_read($socketD,1024); $a = socket_select($changed, $write, $except,NULL) ; if (false === $a) { die("socket_select() failed: ". socket_strerror(socket_last_error())); } echo $a."->".$buf; foreach($changed as $socket){ if ($socket == $this->master) { // new incoming connection, time to accept $this->log("Incoming connection request"); $client = socket_accept($this->master); if($client === false){ $this->log("socket_accept() failed: ". socket_strerror(socket_last_error())); continue; } else{ $this->connect($client); } } else { // existing connection has data to read $bytes = @socket_recv($socket, $buffer, 2048, 0); // close the connection if there was an error or no data to read if($bytes == 0) { $this->disconnect($socket); } else { $user = $this->getUserBySocket($socket); // perform the WebSocket upgrade HTTP handshake if needed if(! $user->handshake) { $this->doHandshake($buffer, $socket); $user->handshake = true; } else { //$this->log("< ". $buffer); $user->lastAction = time(); // call the callback function //$this->logFile("log.dat","run", "Got message - ready for handling", $buffer); $msg = $this->handleMessage($buffer); $this->log("< ". $msg); $this->send($user->socket,"$msg"); } } } } } } Naozaj som už zúfalý v tom, ako spraviť aby nečakali ak sa to vôbec dá... Za odpoveď ďakujem |
||
Časová prodleva: 12 dní
|
|||
Igor R. Profil * |
#2 · Zasláno: 15. 7. 2012, 20:52:59
Tohle je ztráta času, čeho tím chceš docílit? Z kodu mám pocit, že používáš jakousi knihovnu, které nerozumíš. Po letmém přelítnutí mi není jasné, kde si to uchovává aktivní připojené uživatele, tj. odkud se bere hodnota $this->sockets. PHP je bezstavové, tj. jak dokončí požadavek ukončí se a vše vyprázdní, tj. i otevřené sockety zabije. Chyba je možná jen v tom, že si to nepamatuje připojené uživatele.
Jinak doporučuji, otoč se a jdi jinou cestou, tohle bude vždy pomalé a těžko laditelné, php je mocné, ale má pevně dané hranice. Nedávno bylo experimentálně uvolněno rozšíření php o websocket http://socketo.me , v porovnání ale s pythonem nebo javou je to stonásobně pomalejší. |
||
Časová prodleva: 12 let
|
0