Home » Php » websocket – How to run php socket server in linux hosting

websocket – How to run php socket server in linux hosting

Posted by: admin July 12, 2020 Leave a comment

Questions:

i have implemented a socket server in localhost

script i used is from http://www.sanwebe.com/2013/05/chat-using-websocket-php-socket

script is

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

i run this program in xampp shell like

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

i have a server with shell support
But when i run script

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

it works but when shell is closed server will close automatically

so how to run this server continuously with out automatically closing?

i have a linux hosting package

How to&Answers:

Use this code,

php -f server.php

if you want to run continusely in banground you can use nohub

nohup php server.php &

if want to kill the process you use kill

kill processid

Answer:

you can run in terminal

php filename.php

Answer:

I’m guessing you are connecting to the server by ssh?

The server session is ending and all open proccesses are killed that is why your server instance is ending, you are running it from a non-privileged user.

So the way I use is to install screen on the remote server and use that.

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

Or it looks like you might be running a windows server. If this is the case I would recomend using a Linux server as windows makes this a little harder. You will have to run your server instance as a system proccess.

Answer:

you should run this command as a background proccess like

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

Also you can put a simple sccript to crontab for checking your bind.php is up or not if its not run it again.