<?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";
        break;
	}

	$request = "";

	while ($read = socket_read($msgsock, 2)) {
		//без этой функции мы повиснем на чтении из сокета навечно, но почему-то если объявить её до этого цикла, то даные из сокета не прочтутся
		socket_set_nonblock($msgsock);
		$request .= $read;
	}

	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);
	$bytesSent = socket_write($msgsock, $buffer, $length);

	if ($bytesSent === false) {
		echo "Не удалось записать данные в сокет, причина:" . socket_strerror(socket_last_error());
		socket_close($msgsock);
	} elseif ($bytesSent < $length) {
		$newBuffer = substr($buffer, $bytesSent);
		socketWrite($msgsock, $newBuffer);
	} else {
		echo "all bytes have been sent \n";
		//здесь был sleep(10) до того, как я стал читать данные из сокета. Без socket_read или sleep сокет как будто закрывается до того, как клиент успевает принять респонс, что приводит к ошибке в браузере
		socket_close($msgsock);
	}
}