<?php
error_reporting(E_ALL);
 
$address = '127.0.0.1';
$port = 1337;
 
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
	echo "Не удалось создать сокет, причина: " . socket_strerror(socket_last_error()) . "\n";
	die;
}
 
if (socket_bind($sock, $address, $port) === false) {
	echo "Не удалось привязать сокет к адрресу, причина: " . socket_strerror(socket_last_error()) . "\n";
	die;
}
 
if (socket_listen($sock, 5) === false) {
	echo "Не удалось выполнить socket_listen(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
	die;
}
 
do {
	if (($msgsock = socket_accept($sock)) === false) {
		echo "Не удалось выполнить socket_accept(): причина: " . socket_last_error($sock) . "\n";
        continue;
	}
 
	$request = "";
 
	while (is_string($read = socket_read($msgsock, 1024))) {
		if($read == "") break;

		$request .= $read;

		if (preg_match("/\r\n\r\n/", $request)) {
			$request = implode("<br>", preg_split("/\r\n/", $request));
			break;
		}
	}
 
	if ($read === false) {
		echo "ошибка чтения из сокета, причина: " . socket_last_error($msgsock) . "\n";
	}
 
	$response = "HTTP/1.1 200 Ok\r\n";
	$response .= "Content-Type: text/html; charset=UTF-8\r\n\r\n";
	$response .= "<!DOCTYPE html><html><head></head><body>$request</body></html>";
 
	socketWrite($msgsock, $response);
} while (true);
 
socket_close($sock);
 
function socketWrite($msgsock, $buffer) {
	$length = strlen($buffer);

	while ($bytesSent = socket_write($msgsock, $buffer)) {
		if ($bytesSent == $length) {
			echo "all bytes have been sent \n";
			socket_close($msgsock);
			break;
		} else {
			$buffer = substr($buffer, $bytesSent);
		}
	}
 
	if ($bytesSent === false) {
		echo "Не удалось записать данные в сокет, причина:" . socket_strerror(socket_last_error());
		socket_close($msgsock);
	}
}