2014-09-01 29 views
5

ho implementato un server socket in localhostCome eseguire server socket php in hosting linux

script che ho usato è da http://www.sanwebe.com/2013/05/chat-using-websocket-php-socket

script è

$host = "localhost"; //host 
    $port = 9099; //port 
    if(isset($argv[1])) 
    { 
     $host = $argv[1]; 
    } 
    if(isset($argv[2])) 
    { 
     $port = $argv[2]; 
    } 
    $null = NULL; //null var 
    $ips=array(); 
    //Create TCP/IP sream socket 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    //reuseable port 
    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); 

    //bind socket to specified host 
    socket_bind($socket, 0, $port); 

//listen to port 
socket_listen($socket); 

//create & add listning socket to the list 
$clients = array($socket); 
$clients_ip=array(); 
//start endless loop, so that our script doesn't stop 
while (true) { 
    //manage multipal connections 
    $changed = $clients; 
    //returns the socket resources in $changed array 
    socket_select($changed, $null, $null, 0, 10); 


    //check for new socket 
    if (in_array($socket, $changed)) { 
     $socket_new = socket_accept($socket); //accpet new socket 
     socket_getpeername($socket_new, $ip); 
     $clients[] = $socket_new; //add socket to client array 
     $clients_ip[$ip] = $socket_new; 
     $header = socket_read($socket_new, 1024); //read data sent by the socket 
     perform_handshaking($header, $socket_new, $host, $port); //perform websocket handshake 

     //get ip address of connected socket 

      $ips[]=$ip; 
     $response = mask(json_encode(array('ip'=>$ip,'type'=>'c', 'message'=>$ip.' connected','ips'=>$ips))); //prepare json data 

     send_message($response); //notify all users about new connection 

     //make room for new socket 
     $found_socket = array_search($socket, $changed); 
     unset($changed[$found_socket]); 
    } 
//print_r($changed);exit; 

    if(count($changed)>0) 
    { 
    //loop through all connected sockets 
    foreach ($changed as $changed_socket) { 

     //check for any incomming data 
     while(socket_recv($changed_socket, $buf, 1024, 0) >= 1) 
     { 
      $received_text = unmask($buf); //unmask data 
      $tst_msg = json_decode($received_text); //json decode 
      //$user_name = $tst_msg->name; //sender name 
      //$user_message = $tst_msg->message; //message text 
      //$user_color = $tst_msg->color; //color 

      //prepare data to be sent to clientjson_encode(array('type'=>'usermsg', 'name'=>$user_name, 'message'=>$user_message, 'color'=>$user_color)) 
      $response_text = mask($received_text); 
      if(isset($tst_msg->type)) 
      { 
       if($tst_msg->type=="n") 
       { 
        @socket_write($clients_ip[$tst_msg->to_ip],$response_text,strlen($response_text)); 
       } 
      } 



      //send_message($response_text); //send data 
      break 2; //exist this loop 
     } 

     $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ); 
     if ($buf === false) { // check disconnected client 
      // remove client for $clients array 
      $found_socket = array_search($changed_socket, $clients); 
      socket_getpeername($changed_socket, $ip); 
      unset($clients[$found_socket]); 
      if (($key = array_search($ip, $ips)) !== false) 
      { 
       unset($ips[$key]); 
      } 
      $ips=array_values($ips); 
      //notify all users about disconnected connection 
      $response = mask(json_encode(array('ip'=>$ip,'type'=>'d', 'message'=>$ip.' disconnected','ips'=>$ips))); 

      send_message($response); 
     } 
    } 
    } 

} 
// close the listening socket 
socket_close($sock); 

function send_message($msg) 
{ 
    global $clients; 
    foreach($clients as $changed_socket) 
    { 
     @socket_write($changed_socket,$msg,strlen($msg)); 
    } 
    return true; 
} 


//Unmask incoming framed message 
function unmask($text) { 
    $length = ord($text[1]) & 127; 
    if($length == 126) { 
     $masks = substr($text, 4, 4); 
     $data = substr($text, 8); 
    } 
    elseif($length == 127) { 
     $masks = substr($text, 10, 4); 
     $data = substr($text, 14); 
    } 
    else { 
     $masks = substr($text, 2, 4); 
     $data = substr($text, 6); 
    } 
    $text = ""; 
    for ($i = 0; $i < strlen($data); ++$i) { 
     $text .= $data[$i]^$masks[$i%4]; 
    } 
    return $text; 
} 

//Encode message for transfer to client. 
function mask($text) 
{ 
    $b1 = 0x80 | (0x1 & 0x0f); 
    $length = strlen($text); 

    if($length <= 125) 
     $header = pack('CC', $b1, $length); 
    elseif($length > 125 && $length < 65536) 
     $header = pack('CCn', $b1, 126, $length); 
    elseif($length >= 65536) 
     $header = pack('CCNN', $b1, 127, $length); 
    return $header.$text; 
} 

//handshake new client. 
function perform_handshaking($receved_header,$client_conn, $host, $port) 
{ 
    $headers = array(); 
    $lines = preg_split("/\r\n/", $receved_header); 
    foreach($lines as $line) 
    { 
     $line = chop($line); 
     if(preg_match('/\A(\S+): (.*)\z/', $line, $matches)) 
     { 
      $headers[$matches[1]] = $matches[2]; 
     } 
    } 

    $secKey = $headers['Sec-WebSocket-Key']; 
    $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))); 
    //hand shaking header 
    $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" . 
    "Upgrade: websocket\r\n" . 
    "Connection: Upgrade\r\n" . 
    "WebSocket-Origin: $host\r\n" . 
    "WebSocket-Location: ws://$host:$port/demo/shout.php\r\n". 
    "Sec-WebSocket-Accept:$secAccept\r\n\r\n"; 
    socket_write($client_conn,$upgrade,strlen($upgrade)); 
} 

ho eseguito questo programma in guscio xampp come

php -q path-to-server \ server.php

ho un server con supporto per la shell Ma quando ho eseguito lo script

php -q path-to-server \ server.php

funziona, ma quando scocca è assistente chiuso si chiuderà automaticamente

così come eseguire questo server continuamente senza chiudere automaticamente?

Ho un pacchetto di hosting linux

+0

Quale linux distibution? – gray

+0

Sono confuso server Linux, xampp? C: \? è linux o windows? – Dexa

risposta

4

utilizzare questo codice,

php -f server.php 

se si desidera eseguire continusely in banground è possibile utilizzare nohub

nohup php server.php & 

se vogliono uccidere il processo che si usa uccidere

kill processid 
+0

Ho fatto 'sudo apt-get install nohup' Quindi, ' nohup' non viene trovato. Sto utilizzando Ubuntu 14.04 – muaaz

+0

ignorando di ingresso e di uscita aggiungendo a 'nohup.out' –

1

Sto indovinando ci si connette al server ssh?

La sessione di server sta finendo e tutti proccesses aperti vengono uccisi è per questo che l'istanza del server sta finendo, si esegue da un utente non privilegiato.

Quindi il modo che uso è quello di installare schermo sul server remoto e usare quella.

https://www.gnu.org/software/screen/manual/screen.html

O Sembra che si potrebbe essere in esecuzione un server Windows. In questo caso, consiglierei di utilizzare un server Linux poiché Windows lo rende un po 'più difficile. Dovrai eseguire l'istanza del server come processo di sistema.

1

si dovrebbe eseguire questo comando come sfondo proccess come

nohup php -f myBind.php > /dev/null & 

Inoltre è possibile mettere un semplice sccript a crontab per controllare il vostro bind.php è o no se non eseguirlo nuovamente.

3

è possibile eseguire nel terminale

php filename.php