Знатокам HTTP

MisterX

Guest
Знатокам HTTP

Мне нужно посылать несколько запросов GET серверу. Для ускорение этого процесса я не принимаю ответ от сервера, т.к. он меня абсолютно не интересует. Делаю я это так:
...
$fp = fsockopen($url, 80, &$errno, &$errstr, 300);
if(!$fp) { print "Error: $errstr ($errno)<br>\n"; exit; }

fputs($fp,$zapros);
//fgets($fp, 1);
fclose($fp);
...

Меня интересуют гарантии того что запрос будет обработан сервером. Ведь сервер может быть загружен и на обработку запроса у него уйдет время, а я СРАЗУ после посылки закрываю сокет. Разумеется с случае fgets($fp, 1) это гарантируеться, но тратиться куча времени, т.к. GET идут подряд друг за другом. Интересно ТЕОРЕТИЧЕСКОЕ мнение, тех кто хорошо знает как устроен HTTP протокол. На практике у меня вроде работает, но мне нужно ТЕОРЕТИЧЕКОЕ обоснование, т.к. "вроде должно работать" меня не устраивает.
 

MisterX

Guest
Да нет это не спам. Я не собираюсь отправлять формы на сервер, с целью его завала сообщениями. Мне нужно совсем другое - отправлять заполненную форму на несколько различных серверов, лишь с целью уменьшения времени, затрачиваемого на заполнение каждой формы. Хотя конечно можно таким макаром и сервер завалить, но только совсем ламерский - без защиты от таких вещей хотя бы по IP-шнику.
 

ForJest

- свежая кровь
Работать будет.
Данные у тебя (в этом случае запрос) уйдут на сервер. Пока сервер не дождется \r\n 2 раза он будет ждать окончания высылки данных. После чего приступит к их обработке.
fputs тебе гарантирует, что запрос дойдет до сервера.
Дальше - никакого теоретического обоснования. Так как неизвестно, что ты подразумеваешь под словом "обработает".
Единственно что - пока сервер не подготовит ответ - не будет обнаружен обрыв связи.

На спам это совсем не похоже. Современные методы спамоотсылки очень трепетно относятся к ответам сервера.
 

MisterX

Guest
> fputs тебе гарантирует, что запрос дойдет до сервера.
Ну тогда все понятно. Просто меня беспокоило закрытие сокета сразу после посылки запроса.
> Так как неизвестно, что ты подразумеваешь под
> словом "обработает".
Если я к примеру посылаю заполненную форму с какими-то данными, то сервер должен ее разобрать и внести, например, данные в базу данных.
 

ForJest

- свежая кровь
Можно сделать только предположение.
Так как обработка данных обычно совершается до формирования ответа, то есть высокая вероятность того, что данные будут обработаны.
До того, как HTTP серверу не понадобится выслать ответ, он не узнает об обрыве соединения. Конструкция где-то у него внутрях будет
Код:
if (-1 == fwrite(socket, buffer))
{
     <действия при обрыве содединения>
}
Хотя опять же неизвестно, когда начало ответа будет сформировано. Допустим в начале скрипта на Perl может стоять print "Content-type text/html\r\n\r\n"; - это уже будет ответом. А после этого будет идти обработка.
Что будет в такой ситуации я не могу предположить, потому что не разбираюсь в тонкостях взаимодействия предположительно Apache с предположительно CGI на Perl.
Может случится, в этой ситуации, что дочерний процесс Apache упрется в обрыв связи, прибъет вызванный им Perl и помрет сам.
 

ForJest

- свежая кровь
Хотя при здравом размышлении там будет
if (-1 == fwrite(socket, buffer, 1024))
{
<действия при обрыве содединения>
}

Процесс Apache будет предварительно ждать EOF из канала к CGI или заполнения буфера вывода. Так что CGI отработает.
 

MisterX

Guest
Это точно что процесс Apache будет ждать EOF от cgi, а не сразу его убьет ?
 

ForJest

- свежая кровь
Я не лазил в исходники апачи. Я тебе привел рассуждения. Твое дело - понимать их или нет.
 

Linker

Guest
Мне недавно пришлось столкнуться с отправкой сообщений по ICQ (50-100 одновременно за один раз) понятное дело, что не всегда есть возможность запустить это дело в цикле т.к. это может затянуться надолго и превысить время отведённое для скрипта по умолчанию. У Вас не зря стоит 300, такое не везде разрешат выставить.
Так вот я поступил так:
сделал два скрипта вместо одного,
первый считывает базу в массив и запускает процедуру отправки через fsockopen() или CURL для первого адреса, затем, если всё ok header("Location: ".$второй_скрипт."?data=".$следующий _элемент_массива);
второй скрипт делает то же самое и передаёт управление обратно первому, и так до конца по списку.

Если такой вариант приемлем, то имхо это выход.
 

aloner

Guest
А вот это совсем похоже на спам.

По Аське-то.
 
Сверху