[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Отправка POST с помощью сокетов
Воитель
Сначала представлю код:

<?
require "sostav/config.php";
?>

<?php

//открываем сокет к http://www.example.loc на 80-й порт с таймаутом в 30 секунд
$socket = fsockopen('www.russianpost.ru', 80, $errno, $errstr, 10);

//если fsockopen вернула false, то завершаем работу скрипта и выводим текст и номер ошибки
if(!$socket)die("$errstr($errno)");

//собираем данные
$data = "name=".urlencode("John")."&surname=".urlencode("Smith");
$vr = strlen($data);
echo $vr."<br />";

//пишем в сокет метод, URI и протокол
fwrite($socket, "POST /rp/servise/ru/home/postuslug/trackingpo HTTP/1.1\r\n");
//а также имя хоста
fwrite($socket, "Host: www.russianpost.ru\r\n");

//теперь отправляем заголовки
//Content-type должен быть applicaion/x-www-form-urlencoded

fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n");
//размер передаваемых данных передаем в заголовке Content-length
fwrite($socket,"Content-length:".strlen($data)."\r\n");
//типы принимаемых данных. */* означает, что принимаем все типы данных
fwrite($socket,"Accept:*/*\r\n");
//представимся оперой
fwrite($socket,"User-agent:Opera 10.00\r\n");
fwrite($socket,"\r\n");

//теперь передаем данные
fwrite($socket,"$data\r\n");
fwrite($socket,"\r\n");

//теперь читаем и выводим ответ
$answer = '';
while(!feof($socket)){
$answer.= fgets($socket, 4000096);
}
echo $answer;

//закрываем сокет
fclose($socket);
?>


Сокеты только изучаю. История такая, на локали что-то для обучения получилось собрать. Теперь следующий этап получить данные от любого сервера. И тут проблемма: Maximum execution time of 30 seconds.
В чём именно проблемма, понять не могу, но если строку: fwrite($socket,"Content-length:".strlen($data)."\r\n"); закоментировать, то выходят ответные заголовки и 411 ошибка, которая говорит, что сервер отказывается принимать данные без "Content-length:"

но после строки fwrite($socket,"Content-length:".strlen($data)."\r\n");
система попадает в некоторое зависание, по крайней мере на все 30 сек.



Спустя 2 часа, 5 минут, 44 секунды (25.09.2011 - 18:02) Sanchopansa написал(а):
ну для начала посмотри исходный код страницы с формой и проверь адрес в action формы.. да и там куча еще параметров передается...

Спустя 1 час, 58 минут, 12 секунд (25.09.2011 - 20:00) Воитель написал(а):
Сейчас я пытаюсь отправить запрос на обычную страницу, где по идеи не должно быть данных из массива $_POST.
Т.е. хочу получить в ответ какую-нибудь сраницу.

Спустя 1 час, 2 минуты, 19 секунд (25.09.2011 - 21:03) Воитель написал(а):
Нашёл другое решение:


function tcp_send($board, $data) {

$answer = "";

// Get IP
$ip = gethostbyname($board);
// Open socket
$fp = fsockopen($ip, 80);

if ( $fp )
{
// Set HTTP header
foreach( $data as $row )
{
fputs($fp, $row);
}

// Get an answer
while( !feof($fp) )
{
$answer .= fread($fp, 512);
}

fclose($fp);
}

return $answer;
}

$data = "OP=&PATHCUR=".urlencode("rp/servise/ru/home/postuslug/trackingpo")."&PATHFROM=&WHEREONOK=&ASP=&PARENTID=&FORUMID=&NEWSID=&DFROM=&D TO=&CA=&CDAY=25&CMONTH=09&CYEAR=2011&NAVCURPAGE=&SEARCHTEXT=&BarCode=44502825607081";

echo tcp_send($host,
array(
"POST /resp_engine.aspx?Path=rp/servise/ru/home/postuslug/trackingpo/ HTTP/1.1\r\n" ,
"Host: www.russianpost.ru\r\n" ,
"User-Agent: Марсианин\r\n" ,
"Content-Type: application/x-www-form-urlencoded\r\n" ,
"Content-Length: ".strlen($data)."\r\n" ,
"Connection: close\r\n\r\n" ,
$data ,
)
);



Ответ приходит, быстро приходит, но в кодировке UTF-8 пусто а в cp-1251 каказябра примерно в 40 символов.

И что с этим делать не знаю.

Спустя 36 минут, 25 секунд (25.09.2011 - 21:39) Воитель написал(а):
Второй вариант, исправил, доработал = работает.
Но почему был тормоз в первом варианте. Мне не понятно.

Спустя 3 минуты, 41 секунда (25.09.2011 - 21:43) Winston написал(а):
Цитата (Воитель @ 25.09.2011 - 15:56)
Maximum execution time of 30 seconds.

Поcтавь в веху файла
set_time_limit(0);

Спустя 38 минут, 19 секунд (25.09.2011 - 22:21) killer8080 написал(а):
Цитата (Воитель @ 25.09.2011 - 21:39)
Но почему был тормоз в первом варианте. Мне не понятно.

Потому что не хватало заголовка Connection: close, а без него сервер оставляет соединение открытым, и цикл while(!feof($socket)) крутиться пока оно не будет закрыто, то есть дольше чем твой Maximum execution time
Другой вариант использовать протокол HTTP/1.0, он вроде не поддерживает передачу нескольких запросов по одному конекту. Хотя насчёт последнего не уверен.

Да, и заголовок
fwrite($socket,"Accept:*/*\r\n");
лучше не ставить, если не хочешь получить контент в gzip.

Спустя 31 минута, 36 секунд (25.09.2011 - 22:53) Воитель написал(а):
Всем спасибо.
На данный момент с задачей справился, но думаю при дальейшей работе в этой теме ещё могут возникнуть вопросы.

Но почему тогда без Connection: close работало на локали?

Спустя 9 часов, 36 минут, 27 секунд (26.09.2011 - 08:29) killer8080 написал(а):
Цитата (Воитель @ 25.09.2011 - 22:53)
Но почему тогда без Connection: close работало на локали?

А ты сначала исправь свой первый скрипт, и посмотри что получиться wink.gif

PS значит на локали сервер разрывал соединение, и не ждал следующих запросов.


_____________
Вечно учусь.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.