PHP to Listen to data on port and enter into MySQL database Code Answer

Hello Developer, Hope you guys are doing great. Today at Tutorial Guruji Official website, we are sharing the answer of PHP to Listen to data on port and enter into MySQL database without wasting too much if your time.

The question is published on by Tutorial Guruji team.

I have a device 192.168.1.113 that transmits its data to 192.168.1.100

I would like PHP to listen to this incoming data and then extract it and enter into a MySQL database.

I have tried the code below to try and get the data to echo out into the browser for starters just to see if I can see the data that is being sent between the two:

<?php
error_reporting(~E_NOTICE);
set_time_limit (0);

$address = "192.168.1.100"; //ip here
$port = 8996; //port number  here
$max_clients = 10;

if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die("Couldn't create socket: [$errorcode] $errormsg n");
}

echo "Socket created n";

// Bind the source address
if( !socket_bind($sock, $address , 5000) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die("Could not bind socket : [$errorcode] $errormsg n");
}

echo "Socket bind OK n";

if(!socket_listen ($sock , 10))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die("Could not listen on socket : [$errorcode] $errormsg n");
}

echo "Socket listen OK n";

echo "Waiting for incoming connections... n";

//array of client sockets
$client_socks = array();

//array of sockets to read
$read = array();

//start loop to listen for incoming connections and process existing 
connections
while (true) 
{
//prepare array of readable client sockets
$read = array();

//first socket is the master socket
$read[0] = $sock;

//now add the existing client sockets
for ($i = 0; $i < $max_clients; $i++)
{
    if($client_socks[$i] != null)
    {
        $read[$i+1] = $client_socks[$i];
    }
}

//now call select - blocking call
if(socket_select($read , $write , $except , null) === false)
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not listen on socket : [$errorcode] $errormsg n");
}

//if ready contains the master socket, then a new connection has come in
if (in_array($sock, $read)) 
{
    for ($i = 0; $i < $max_clients; $i++)
    {
        if ($client_socks[$i] == null) 
        {
            $client_socks[$i] = socket_accept($sock);

            //display information about the client who is connected
            if(socket_getpeername($client_socks[$i], $address, $port))
            {
                echo "Client $address : $port is now connected to us. n";
            }

            //Send Welcome message to client
            $message = "Welcome to php socket server version 1.0 n";
            $message .= "Enter a message and press enter, and i shall reply 
back n";


            socket_write($client_socks[$i] , $message);
            break;
        }
    }
  }

//check each client if they send any data
for ($i = 0; $i < $max_clients; $i++)
{
    if (in_array($client_socks[$i] , $read))
    {
        $input = socket_read($client_socks[$i] , 1024);

        if ($input == null) 
        {
            //zero length string meaning disconnected, remove and close the 
socket
            unset($client_socks[$i]);
            socket_close($client_socks[$i]);
        }

        $n = trim($input);

        $output = "OK ... $input";

        echo "Sending output to client n";

        //send response to client
        socket_write($client_socks[$i] , $output);
    }
   }
}
?>

But it just hangs in the browser and doesn’t do anything. I know there is data coming across as I have a tool in Windows that listens to the data (see pic).

What am I doing wrong and how do I extract this data and get it into my MySQL database? click here for picture

Answer

Binary socket_read is blocking, see the top 2 comment on http://php.net/manual/en/function.socket-read.php. They both confirm that a PHP_BINARY_READ socket_read is blocking.

I would suggest to use a socket_select with a read timeout. Some snippets:

 $defaultRecvTimeout=750;

socket_set_option($socket6,SOL_SOCKET,SO_RCVTIMEO,$this->millisecToSolArray(self::$defaultRecvTimeout));

        // wait for data to be available, up to timeout
        $r1 = array($this->socket);
        $w = null;
        $e = array($this->socket);
        $readTimeout = socket_get_option($this->socket,SOL_SOCKET,SO_RCVTIMEO);
        $res = socket_select($r1,$w,$e,$readTimeout['sec'],$readTimeout['usec']);

        // check
        if ($res === false) throw new SocketTransportException('Could not examine socket; '.socket_strerror(socket_last_error()), socket_last_error());
        if (!empty($e)) throw new SocketTransportException('Socket exception while waiting for data; '.socket_strerror(socket_last_error()), socket_last_error());
        if (empty($r1)) return false; // Nothing to read, return;
        $d = "";
        $r = 0;
        $buf = '';
        $r += socket_recv($this->socket,$buf,1000,MSG_DONTWAIT);
        if ($r === false) throw new SocketTransportException('Could not read '.$length.' bytes from socket; '.socket_strerror(socket_last_error()), socket_last_error());
        $d .= $buf;
        return $d;

This is not my code, I found it somewhere and unfortunately forgot whom to credit for it. However sockettransport.class.php is a nice class for socket handling: https://github.com/paulv888/cronjobs/blob/3f8683ed1dff0a343dff7114fa2edc50a525c190/myclasses/sockettransport.class.php

Actually the original came from here: https://github.com/onlinecity/php-smpp

We are here to answer your question about PHP to Listen to data on port and enter into MySQL database - If you find the proper solution, please don't forgot to share this with your team members.

Related Posts

Tutorial Guruji