Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Serwer TCP w PHP
Forum PHP.pl > Forum > PHP
mar-je
Witam!

Chciałem postawić prosty serwer w php oparty na gniazdkach, i działa przez 10s (da się do niego podłączyć itd.), a potem się wyłącza - i "nasłuchiwanie" poprostu nie działa (klient nie może się już połączyć)...

Tutaj kod:
  1. <?php
  2.   if (!$sckMain=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)){
  3.       trigger_error('Error creating new socket',E_USER_ERROR);
  4.   }
  5.   //socket_set_option($sckMain, SOL_SOCKET, SO_REUSEADDR, 1);
  6.   if(!socket_bind($sckMain, '87.98.x.x', 8989)){
  7.       trigger_error('Error binding socket to TCP host:'.$host.', port:'.$port.'',E_USER_ERROR);
  8.   }
  9.   if(!socket_listen($sckMain)){
  10.       trigger_error('Error listening socket connections',E_USER_ERROR);
  11.   }
  12.   $oaClients = array();
  13.   while(true){
  14.       $sckaRead = array();
  15.       $sckaRead[0] = $sckMain;
  16.       foreach($oaClients as $x => $oClient){
  17.           if($oClient -> bClosed == true){
  18.               unset($oaClients[$x]);
  19.           }else{
  20.               $sckaRead[] = $oClient -> sckSocket;
  21.           }
  22.       }
  23.       socket_select($sckaRead, $null = null, $null = null, 0);
  24.       if(in_array($sckMain, $sckaRead)){
  25.           $sckNewClient = socket_accept($sckMain);
  26.           $oaClients[] = new clientHandler($sckNewClient);
  27.       }
  28.       foreach($oaClients as $oClient){
  29.           if(in_array($oClient -> sckSocket, $sckaRead)){
  30.               $oClient -> handle();
  31.           }
  32.       }
  33.   }
  34.   //socket_close($sckMain); //Sprawdzałem z tą linijką, jak i bez niej (odpowiada za zamknięcie głównego \"gniazdka\")
  35.   class clientHandler{
  36.       var $bClosed = false;
  37.       var $sckSocket = '';
  38.       var $bAuthenticated = false;
  39.       function clientHandler($sckSocket){
  40.           $this -> sckSocket = $sckSocket;
  41.           $this -> send('HELLO');
  42.       }
  43.       function handle(){
  44.           $sCommand = $this -> read();
  45.           list($sExecute, $sParameters) = explode(' ', $sCommand, 2);
  46.           if($sCommand != ''){
  47.           if($this -> bAuthenticated == true){
  48.           if($sCommand == 'logout'){
  49.           $this -> disconnect();
  50.           }elseif($sExecute == 'echo'){
  51.           $this -> send($sParameters);
  52.           }elseif($sExecute == 'time'){
  53.           $this -> send(date('Y-m-d H:i:s'));
  54.           }else{
  55.           $this -> send('unknown command');
  56.           }
  57.           }elseif($sExecute == 'login'){
  58.           if($sParameters == 'hasło'){
  59.           $this -> bAuthenticated = true;
  60.           $this -> send('login ok');
  61.           }else{
  62.           $this -> send('login error');
  63.           $this -> disconnect();
  64.           }
  65.           }else{
  66.           $this -> send('authenticate first');
  67.           }
  68.       }
  69.       }
  70.       function send($sMessage){
  71.           socket_write($this -> sckSocket, $sMessage . &#092;"r\n\" . chr(0));
  72.       }
  73.       function read(){
  74.           return trim(@socket_read($this -> sckSocket, 1024));
  75.       }
  76.       function disconnect(){
  77.           $this -> send('bye');
  78.           $this -> bClosed = true;
  79.           socket_close($this -> sckSocket);
  80.       }
  81.   }
  82.   ?>


Prawdopodobnie któraś linijka powoduje to przerwanie, lub może to wina serwera (mam hosting na osemka.pl), chociaż gniazdka działają na nim. Z góry dzięki za pomoc w naprawieniu/odnalezieniu błędu.
legorek
Prawdopodobnie na serwerze jest ustawiony maksymalny czas działania skryptu na 10 sekund. Nic na to nie poradzisz nawet set_time_limit.
Wykladowca
Na ósemce jest włączony tryb bezpieczny. set_time_limit() nie będzie działać.
mar-je
No trudno... Trzeba będzie poszukać innego hostingu, ale thx za informację.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.