How to create a socket server in PHP

H

Ever want to build a chat application or perhaps even a game? If so, a socket server will help you get started. Once you understand the underlying functionality of creating the server, enhancing it is just as easy.

The way a socket server works is, it will be running continously and waiting for a client to connect to it. When a client connects, our server will add it to our list of clients and begin waiting for messages from that client.

Without further adieu, here is the full source code:


[code]// Set time limit to indefinite execution
set_time_limit (0);

// Set the ip and port we will listen on
$address = ‘localhost’;
$port = 10000;
$max_clients = 10;

// Array that will hold client information
$client = Array();

// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// Bind the socket to an address/port
socket_bind($sock, $address, $port) or die(‘Could not bind to address’);
// Start listening for connections
socket_listen($sock);

echo “Waiting for connections…\r\n”;

// Loop continuously
while (true) {
// Setup clients listen socket for reading
$read[0] = $sock;
for ($i = 0; $i < $max_clients; $i++) { if (isset($client[$i]['sock'])) $read[$i + 1] = $client[$i]['sock']; } // Set up a blocking call to socket_select() if (socket_select($read, $write = NULL, $except = NULL, $tv_sec = 5) < 1) continue; /* if a new connection is being made add it to the client array */ if (in_array($sock, $read)) { for ($i = 0; $i < $max_clients; $i++) { if (empty($client[$i]['sock'])) { $client[$i]['sock'] = socket_accept($sock); echo "New client connected $i\r\n"; break; } elseif ($i == $max_clients - 1) echo "Too many clients...\r\n"; } } // end if in_array // If a client is trying to write - handle it now for ($i = 0; $i < $max_clients; $i++) { // for each client if (isset($client[$i]['sock'])) { if (in_array($client[$i]['sock'], $read)) { $input = socket_read($client[$i]['sock'], 1024); if ($input == null) { echo "Client disconnecting $i\r\n"; // Zero length string meaning disconnected unset($client[$i]); } else { echo "New input received $i\r\n"; // send it to the other clients for ($j = 0; $j < $max_clients; $j++) { if (isset($client[$j]['sock']) && $j != $i) { echo "Writing '$input' to client $j\r\n"; socket_write($client[$j]['sock'], $input, strlen($input)); } } if ($input == 'exit') { // requested disconnect socket_close($client[$i]['sock']); } } } else { echo "Client disconnected $i\r\n"; // Close the socket socket_close($client[$i]['sock']); unset($client[$i]); } } } } // end while // Close the master sockets socket_close($sock); [/code]

Obviously, at first glance it might seem that a lot is going on, but let’s begin by breaking it down into a few smaller sections. The first section, is the creation of the server. Lines: 2 through 20.

This portion of code sets a few variables, our address, port, max clients, and clients array. Next up it creates the socket and binds it to the address and port we specified. Finally it begins listening for messages.

The next thing we do is perform an endless loop (yeah one that we actually made purposely!). Lines: 22 through 32. In the first part of the next code we are setting up our $read array. This array contains all of our client sockets and our main server socket. This variable is used later in our select statement telling PHP to listen for any messages from these clients.

The last parameter of socket_select() tells our server to wait a maximum of 5 seconds before returning something. If what it’s returned is less than 1, we received no data, so we just go back to the top of our loop and keep waiting.

The next part of our script, adds a new client to our array. Lines: 33 through 44.

Once we have a new client we place them at the end of the list. We also do a check to ensure we do not have more clients than we want our server to handle.

The next chunk of code is a rather large chunk and it’s the meat of our server. The following code handles when a client sends a message to the server. This message can vary from a disconnect message, our an actual disconnect, or any other message that our server needs to handle. Lines: 46 through the rest of the script.

The code loops through each client and checks if the message was received by them. If it was, we get what the input was. Based on the input we check if it’s a disconnect message, if so we remove them from our array, otherwise, if it’s a regular message our server loops through all of the clients again and writes the message to them one at a time, skipping the sender.

That’s it, enjoy creating your very own chat server!

About the author

  • http://automotivefloorjacks.wetpaint.com/ automotive floor jack

    It’s the first time I commented here and I must say that you provide us genuine, and quality information for other bloggers! Good job.
    p.s. You have a very good template for your blog. Where did you find it?

    • Jamie

      I’m glad you enjoy the content, it’s always good hearing that. As for the theme, it’s just using the default theme.

  • http://devzone.zend.com/article/1086-Writing-Socket-Servers-in-PHP Anonymous

    This is a Rip from a Zend DevZone Article from 2003

    Shame you don’t actually credit the author!

  • haxtor

    This one is easier to read, enjoy creating your very own php server!

    http://devzone.zend.com/article/1086-Writing-Socket-Servers-in-PHP

  • http://www.saleveling.com wow power leveling

    This is my first time comment at your blog.
    Good recommended website.

  • josuecarnivoro

    Hello, great job, I am new to web programming and I have a key question…
    where do you place this script? how do you run it?

    I am using WAMP as local server

    please answer me to:
    [email protected]

    and this forum as well.
    Thanx

  • http://tech.gtaero.net/ Navarr

    Thank you so much for posting this. It looks like a rip from the Zend DevZone article, but that one doesn’t even run without throwing a crapload of errors.

    This one runs without any errors in the console, but I can’t get a client to connect to it. At least this one is written properly so I’ll be able to decipher it. Going to attempt writing an IRC server in PHP just for kicks.

    Thanks for the help!

  • adebayo

    my name is adebayo whay i need is PHP server for using with indianweb proy, please I wantb to create my server to usev.
    thanks

  • http://www.synchplusconsulting.com yogik

    Hello everyone on the blog. Has anyone tried this PHP server to accept and connect to iPHONE client. This code is not able to accept bytes from iPhone client however if I try a basic PHP client with basic it accepts and receives the bytes. Please reply if someone has tried it. Thanks and regards

  • Pingback: makeup

  • Pingback: skin tags

  • Pingback: gardening recipe

  • Pingback: top rc zone

  • Pingback: online computer repair

  • Pingback: Goozle Zone

  • Pingback: bad credit loans

  • Pingback: Ania Antonette Quisumbing

  • Pingback: one buck resume

  • Pingback: ultimate power profits

  • Pingback: zig zaga

  • Pingback: Personal Injury Solicitors in Manchester

  • Pingback: personalized ink pens

  • Pingback: ZigZag

  • Pingback: new york asian escorts

  • Pingback: Movie

  • Pingback: Recycle

  • Pingback: School

  • Pingback: Web

  • Pingback: Climate

  • Pingback: Collecting

By Jamie

My Books