Здравствуйте. Мне нужно отправить два или более HTTP-запроса в рамках одного соединения, но не знаю, как это можно реализовать. Мне известно, что отправлять несколько запросов, используя одно и тоже подключение к серверу можно с помощью постоянных соединений (persistent connection), которые реализуются с использованием заголовка Connection: keep-alive в HTTP-запросе. Пробовал такой код: PHP: <?php $packet = "GET / HTTP/1.0\r\n"; $packet .= "Host: localhost\r\n"; $packet .= "Connection: Keep-Alive\r\n\r\n"; $fp = fsockopen( "127.0.0.1" , 80 , $errno , $errstr); if (!$fp) error ($errstr); fputs($fp , $packet); $resp = null; while (!feof($fp)) $resp .= fgets($fp); $packet = "GET / HTTP/1.0\r\n"; $packet .= "Host: localhost\r\n"; $packet .= "Connection: close\r\n\r\n"; fputs($fp , $packet); $resp2 = null; while (!feof($fp)) $resp2 .= fgets($fp); fclose($fp); echo $resp."\r\n".$resp2; ?> Но производится только первый запрос. Как же сделать два запроса в одном соединении?
Psih, для HTTP/1.1 keep-alive используется по умолчанию - в HTTP/1.0 keep-alive поддерживается, но нужно явно указывать тип соединения. Sergey89, а что же тогда поддерживает? socket_create?
Попробовал через socket - тот же результат Вот код: PHP: <?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket,SOL_SOCKET,SO_KEEPALIVE,1); socket_connect($socket, '127.0.0.1', 80); $packet = "GET /test.php HTTP/1.1\r\n"; $packet .= "Host: localhost\r\n"; $packet .= "Connection: keep-alive\r\n\r\n"; socket_write($socket, $packet); while ($out = socket_read($socket, 2048)) { echo $out; } $packet = "GET /test.php HTTP/1.1\r\n"; $packet .= "Host: localhost\r\n"; $packet .= "Connection: keep-alive\r\n\r\n"; socket_write($socket, $packet); while ($out = socket_read($socket, 2048)) { echo $out; } socket_close($socket); ?>
Я тоже ищу способ создать постоянное соединение, но ты делаешь как бы клиент, а я ещё и серверную часть. Мой пост можешь найти. Вообще что первый пример, что второй по сути одно и тоже. Различается только написание функций, а по работе они схожи. Функция fsockopen фактически заменяет первые функции во втором примере, создание сокета, соединение, и ещё обработка ошибок. Есть ещё функция psockopeno. Она схожа с fsockopen. Они имеют одинаковый набор параметров, но после выполнения psockopeno соединение будет сохранено даже после завершения работы сценария. Возможно тебе она подойдет. Но утверждать не берусь. А что на другой стороне, кто это принимает и обрабатывает?
Хочу порассуждать... можно ? while (!feof($fp)) - читать пока не встретится конец файла или для соединений открытых при помощи fsockopen() - тоесть правило не будет выполняться и будет висеть пока не разорвется соединение ? while ($out = socket_read($socket, 2048)) - читать пока читается ? - тут посложнее, socket_read() возвращает текст или FALSE при ошибке , замечание socket_read() возвращает текст нулевой длины если нет больше данных для чтения - вот интересно данное выражение воспримет нулевой текст как ошибку или нет ? (строго говоря это же не ошибка ??) Вообщем есть два совета: 1. Оставить в покое "KEEPALIVE" и юзать дедовским методом. 2. Вытаскивать из хедера ответа длину вложения и рвать while по прочтению данного количества байт ...
веб-сервер nimistar, спасибо, Ваши рассуждения мне помогли. действительно, feof ждал тайм-аут и второй запрос не отправлялся.