Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run php socket server in linux hosting

Tags:

php

websocket

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

like image 776
user3797053 Avatar asked Sep 01 '14 12:09

user3797053


People also ask

Does PHP support websockets?

Yes, it's possible to do PHP + Websocket very simply, without any third party library (like Ratchet, often mentioned). You can find more detailed instructions about this here: How to create websockets server in PHP. It uses a constantly-running PHP server, that you start from command-line with php websockets.

How do I start a ratchet server?

Create the HTTP Server Open the file app. php and add the following code: <? php use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; use MyApp\Socket; require dirname( __FILE__ ) .

How do I setup a WebSocket server?

Creating a websocket server import express from "express"; import startup from "./lib/startup"; import api from "./api/index"; import middleware from "./middleware/index"; import logger from "./lib/logger"; import websockets from './websockets'; startup() . then(() => { const app = express(); const port = process.

Is WebSocket a protocol?

1.7. The WebSocket protocol is an independent TCP-based protocol. Its only relationship to HTTP is that its handshake is interpreted by HTTP servers as an Upgrade request. By default the WebSocket protocol uses port 80 for regular WebSocket connections and port 443 for WebSocket connections tunneled over TLS [RFC2818].


2 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
like image 103
shabeer Avatar answered Sep 27 '22 18:09

shabeer


you can run in terminal

php filename.php
like image 21
user-69843154 Avatar answered Sep 27 '22 18:09

user-69843154