Home arrow PHP arrow Page 2 - Emulating a Basic Web Server with Sockets in PHP

Taking a quick look at the previous TCP server - PHP

Do you think that programming sockets with PHP is really hard work? Not at all. If you’re still not convinced, read this final part of the series “Handling sockets with PHP.” In three parts, this series shows how to work with low-level sockets in PHP. It introduces some of the typical tasks, such as creating sockets, as well as reading and writing socket data.

TABLE OF CONTENTS:
  1. Emulating a Basic Web Server with Sockets in PHP
  2. Taking a quick look at the previous TCP server
  3. Emulating a Web server
  4. Putting the Web server to work
By: Alejandro Gervasio
Rating: starstarstarstarstar / 10
June 05, 2006

print this article
SEARCH DEV SHED

TOOLS YOU CAN USE

advertisement

Before I start coding the Web server, I’d like you to recall how the previous TCP server was developed. Since the Web server I plan to build will use most of the PHP functions that you learned in the previous installments, you shouldn’t have any problems understanding how it will work.

That said, here is the full source code that corresponds to the previous TCP server, including both procedural and object-oriented approaches:

/*
/****************************************************************
/ procedural script for building a multi-request TCP server
/****************************************************************
*/

// define  TCP port & local host
$port=12345;
$host='127.0.0.1';
set_time_limit(0);
// create low level socket
if(!$socket=socket_create(AF_INET,SOCK_STREAM,0)){
    trigger_error('Error creating new socket',E_USER_ERROR);
}
// tie up socket to TCP port
if(!socket_bind($socket,$host,$port)){
    trigger_error('Error binding socket to TCP port',E_USER_ERROR);
}
// begin listening connections
if(!socket_listen($socket)){
    trigger_error('Error listening socket connections',E_USER_ERROR);
}
// create comunication socket
if(!$comSocket=socket_accept($socket)){
    trigger_error('Error creating communication
socket',E_USER_ERROR);
}
$message='This is a simple TCP/IP server created with PHP
sockets!'."\r\n";
socket_write($comSocket,$message,strlen($message));
// start a loop and continue reading user input
do{
    // delay loop execution
    sleep(10);
    // read socket input
    $socketInput=socket_read($comSocket,1024);
    if(trim($socketInput)!=''){         
        // if user did not entered the 'STOP" command continue
reading data
        if(trim($socketInput)!='STOP'){
            // build socket output 
            $socketOutput='The string you entered was
'.$socketInput."\r\n";
            // write data back to socket server
            socket_write($comSocket,$socketOutput,strlen
($socketOutput));
            echo 'The string you entered is '.$socketOutput;
        }
        else{
            // if 'STOP' command was entered close communication
socket & terminate all the connections
            socket_close($comSocket);
            break;
        }
    }
}
while(true);
// close global socket
socket_close($socket);

/*
/****************************************************************
/ 'createSocketServer()' function for building a multi-request
TCP server
/****************************************************************
*/
function createSocketServer($host='127.0.0.1',$port=12345){
    set_time_limit(0);
    // create low level socket
    if(!$socket=socket_create(AF_INET,SOCK_STREAM,0)){
        trigger_error('Error creating new socket',E_USER_ERROR);
    }
    // tie up socket to TCP port
    if(!socket_bind($socket,$host,$port)){
        trigger_error('Error binding socket to TCP
port',E_USER_ERROR);
    }
    // begin listening connections
    if(!socket_listen($socket)){
        trigger_error('Error listening socket
connections',E_USER_ERROR);
    }
    // create communication socket
    if(!$comSocket=socket_accept($socket)){
        trigger_error('Error creating communication
socket',E_USER_ERROR);
    }
    $message='This is a simple TCP/IP server created with PHP
sockets!'."\r\n";
    socket_write($comSocket,$message,strlen($message));
    // start a loop and continue reading user input
    do{
        // delay loop execution
        sleep(10);
        // read socket input
        $socketInput=socket_read($comSocket,1024);
            if(trim($socketInput)!=''){ 
            // if user did not entered the 'STOP" command
continue reading data
            if(trim($socketInput)!='STOP'){
                // convert to uppercase socket input 
                $socketOutput='The string you entered was
'.$socketInput."\r\n";
                // write data back to socket server
                socket_write($comSocket,$socketOutput,strlen
($socketOutput));
                echo 'The string you entered is '.$socketOutput;
            }
            else{
                // if 'STOP' command was entered close
communication socket & terminate all the connections
                socket_close($comSocket);
                break;
            }
        }
    }
    while(true);
    // close global socket
    socket_close($socket);
}

/*
/**************************************************************
/  'SocketServer()' class for creating a multi-request TCP server
/**************************************************************
*/
class SocketServer{
    var $host;
    var $port;
    var $delay=10;
    var $message="This is a simple TCP/IP server created with PHP
sockets!\r\n";
    function SocketServer($host='127.0.0.1',$port=12345){
        if(!is_int($port)||$port<1||$port>65535){
            trigger_error('Invalid port number',E_USER_ERROR);
        }
        $this->host=$host;
        $this->port=$port;
        $this->connect();
    }
    function connect(){
        set_time_limit(0);
        // create low level socket
        if(!$socket=socket_create(AF_INET,SOCK_STREAM,0)){
            trigger_error('Error creating new
socket',E_USER_ERROR);
        }
        // tie up socket to TCP port
        if(!socket_bind($socket,$this->host,$this->port)){
            trigger_error('Error binding socket to TCP
port',E_USER_ERROR);
        }
        // begin listening connections
        if(!socket_listen($socket)){
            trigger_error('Error listening socket
connections',E_USER_ERROR);
        }
        // create communication socket
        if(!$comSocket=socket_accept($socket)){
            trigger_error('Error creating communication
socket',E_USER_ERROR);
        }
        socket_write($comSocket,$this->message,strlen($this-
>message));
        // start a loop and continue reading user input
        do{
            // delay loop execution
            sleep($this->delay);
            // read socket input
            $socketInput=socket_read($comSocket,1024);
            if(trim($socketInput)!=''){ 
                // if user did not entered the 'STOP" command
continue reading data
                if(trim($socketInput)!='STOP'){
                    $socketOutput='The string you entered was
'.$socketInput."\r\n";
                    // write data back to socket server
                    socket_write($comSocket,$socketOutput,strlen
($socketOutput));
                    echo 'The string you entered is
'.$socketOutput;
                }
                else{
                    // if 'STOP' command was entered close
communication socket & terminate all the connections
                    socket_close($comSocket);
                    break;
                }
             }
        }
        while(true);
        // close global socket
        socket_close($socket);
    }
}

Right, as you can see, I listed above the complete source code for implementing a multi-request TCP server, including a raw procedural script, and of course adding the corresponding “createSocketServer()” function and the “CreateSocket” PHP class. Whether you’re using a procedural approach or an object-based method for coding your applications, I’m sure that one of the above listed implementations of the pertinent TCP server will meet your particular needs.

Now that I reminded you of how a multi-request TCP server can be created, join me in the next section, in order to learn how to emulate a basic Web server on your own testing machine. Go ahead and read the next section.



 
 
>>> More PHP Articles          >>> More By Alejandro Gervasio
 

blog comments powered by Disqus
escort Bursa Bursa escort Antalya eskort
   

PHP ARTICLES

- Hackers Compromise PHP Sites to Launch Attac...
- Red Hat, Zend Form OpenShift PaaS Alliance
- PHP IDE News
- BCD, Zend Extend PHP Partnership
- PHP FAQ Highlight
- PHP Creator Didn't Set Out to Create a Langu...
- PHP Trends Revealed in Zend Study
- PHP: Best Methods for Running Scheduled Jobs
- PHP Array Functions: array_change_key_case
- PHP array_combine Function
- PHP array_chunk Function
- PHP Closures as View Helpers: Lazy-Loading F...
- Using PHP Closures as View Helpers
- PHP File and Operating System Program Execut...
- PHP: Effects of Wrapping Code in Class Const...

Developer Shed Affiliates

 


Dev Shed Tutorial Topics: