2014-09-01 57 views
5

我已經實現在本地主機套接字服務器如何運行在託管

腳本中,我採用的是從http://www.sanwebe.com/2013/05/chat-using-websocket-php-socket Linux的PHP套接字服務器

腳本

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

我在XAMPP shell中運行這個程序像

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

我有殼的支持 一個服務器,但是當我運行腳本

PHP -q路徑到服務器\ server.php

它的工作原理,但是當外殼是封閉的服務器將自動關閉

所以如何連續運行此服務器並自動關閉?

我有一個Linux主機包

+0

的Linux發佈包? – gray 2014-09-01 12:19:38

+0

我很困惑的linux服務器,xampp? C:\?它是Linux還是Windows? – Dexa 2014-09-01 12:24:09

回答

4

使用運行這段代碼,

php -f server.php 

,如果你想在banground continusely運行,你可以nohub

nohup php server.php & 

使用,如果想殺人這個過程中你使用kill

kill processid 
+0

我做'命令和apt-get安裝nohup'所以, 'nohup'是找不到的。我使用Ubuntu 14.04 – muaaz 2015-12-12 09:42:02

+0

忽略輸入並將輸出追加到'nohup.out' – 2018-02-11 10:56:31

1

我猜你是通過SSH連接到服務器?

服務器會話結束,所有開放proccesses被殺害,這就是爲什麼你的服務器實例結束,您是從非特權用戶運行它。

所以我用的方法是在遠程服務器上安裝屏幕,並使用它。

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

或者它看起來像你可能會運行Windows Server。如果是這種情況,我會建議使用Linux服務器,因爲Windows會使這一點變得更加困難。您必須將您的服務器實例作爲系統進程運行。

1

你應該爲背景proccess運行此命令狀

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

你也可以把一個簡單的sccript的crontab來檢查你的bind.php是漲還是不如果它不再次運行。

3

您可以在終端

php filename.php 
相關問題