2014-09-01 63 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 
相关问题