<?php
function atomd_connect($host, $port)
{
$socket = pfsockopen($host, $port, $errno, $errstr);
if (!$socket)
{
throw new Exception("$errstr ($errno)");
}
return $socket;
}
function atomd_read_packet($socket)
{
{
throw new Exception("socket not open");
}
$command = fread($socket, 4);
if ($command === FALSE)
{
throw new Exception("got EOF while reading command from socket");
}
$payload_length = fread($socket, 4);
if ($payload_length === FALSE)
{
throw new Exception("got EOF while reading payload_length from socket");
}
$payload = "";
if ($payload_length > 0)
{
if ($payload === FALSE)
{
throw new Exception("got EOF while reading payload from socket");
}
}
return $command . $payload_length . $payload;
}
function atomd_write_packet($socket, $command, $payload)
{
{
throw new Exception("socket not open");
}
$packet = $command . str_pad(strlen($payload) + 1, 4, "0", STR_PAD_LEFT
) . $payload . "\0";
if (fwrite($socket, $packet) === FALSE)
{
throw new Exception("got error while writing payload to socket");
}
}
function atomd_data_available($socket)
{
$write = NULL;
$except = NULL;
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0)))
{
throw new Exception("could not do select on socket");
}
return $num_changed_streams > 0;
/*
$position = ftell($socket);
fseek($socket, -1, SEEK_END);
$has_data = ftell($socket) > $position;
fseek($socket, $position, SEEK_SET);
return $has_data;*/
}
/*
function atomd_data_available($socket)
{
$position = ftell($socket);
fseek($socket, -1, SEEK_END);
$has_data = ftell($socket) > $position;
fseek($socket, $position, SEEK_SET);
return $has_data;
}
*/
function atomd_initialize($host, $port)
{
$socket = atomd_connect($host, $port);
while (atomd_data_available($socket))
{
$packet = atomd_read_packet($socket); // Read initial prompt
}
return $socket;
}
function atomd_send_command($socket, $command)
{
atomd_write_packet($socket, "RESP", $command);
}
function atomd_read_command_response($socket)
{
$response = "";
while (true)
{
$packet = atomd_read_packet($socket);
if (substr($packet, 0, 4) != "TEXT")
{
break;
}
$response .= substr($packet, 8) . "\n";
}
return $response;
}
/*
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false)
{
die("Socket Creation Failed");
}
$result = socket_connect($socket, "127.0.0.1", 1202);
if ($result === false)
{
die("Connection Failed");
}
$command = "help";
$length = strlen($command) + 1;
$data = "RESP" . str_pad($length, 4, "0", STR_PAD_LEFT) . $command . "\0\n";
echo "Sending:" . $data . "<br/>";
socket_write($socket, $data, strlen($data));
do
{
$line = socket_read($socket, 1024, PHP_BINARY_READ);
$output .= $line;
}
while ($line != "");
echo $output . "<br/>";
$output = "";
echo "Done first read!<br/>";
do
{
$line = socket_read($socket, 1024, PHP_BINARY_READ);
$output .= $line;
}
while ($line != "");
echo $output . "<br/>";
$output = "";
echo "Done!<br/>";
socket_close($socket);
*/
?>