2014-09-01 5 views
5

iWie PHP-Socket-Server unter Linux laufen zu lassen Hosting

einen Socket-Server in lokalen Host implementiert haben

Skript i verwendet von http://www.sanwebe.com/2013/05/chat-using-websocket-php-socket

Skript ist

$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)); 
} 

ich dieses Programm in XAMPP Shell ausgeführt wie

php -q Pfad-zu-Server \ server.php

Ich habe einen Server mit Shell-Unterstützung Aber wenn ich Skript

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

es funktioniert laufen, aber wenn die Shell geschlossen Server automatisch schließt

ist

so Wie führe ich diesen Server kontinuierlich ohne automatisches Schließen aus?

ich habe ein Linux-Hosting-Paket

+0

Welche Linux-Distribution? – gray

+0

Ich bin verwirrt Linux-Server, Xampp? C: \? ist es Linux oder Windows? – Dexa

Antwort

4

Verwenden Sie diesen Code ausführen kann,

php -f server.php 

wenn Sie continusely in banground ausführen möchten, können Sie verwenden nohub

nohup php server.php & 

wenn töten wollen der Prozess, den Sie verwenden töten

kill processid 
+0

Ich habe 'sudo apt-get installieren nohup' So, ' nohup' wird nicht gefunden. Ich benutze Ubuntu 14.04 – muaaz

+0

Ignorieren der Eingabe und Anhängen der Ausgabe an "nohup.out" –

1

Ich vermute, Sie auf dem Server durch SSH eine Verbindung herstellen?

Die Serversitzung wird beendet und alle offenen Prozesse werden beendet. Deshalb endet Ihre Serverinstanz, Sie führen sie von einem nicht privilegierten Benutzer aus.

Also die Art, wie ich benutze, ist Bildschirm auf dem Remote-Server zu installieren und zu verwenden.

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

Oder es sieht aus wie Sie einen Windows-Server ausgeführt werden könnten. Wenn dies der Fall ist, würde ich einen Linux-Server empfehlen, da Windows dies ein wenig schwieriger macht. Sie müssen Ihre Serverinstanz als Systemprozess ausführen.

1

sollten Sie diesen Befehl als Hintergrund proccess wie

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

Auch können Sie eine einfache sccript für die Überprüfung Ihrer bind.php crontab setzen Vorfeld ist oder nicht, wenn seine nicht erneut ausführen.

3

Sie in Terminal

php filename.php 
Verwandte Themen