<?
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) Воитель написал(а):
Нашёл другое решение:
Ответ приходит, быстро приходит, но в кодировке UTF-8 пусто а в cp-1251 каказябра примерно в 40 символов.
И что с этим делать не знаю.
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 работало на локали?
На данный момент с задачей справился, но думаю при дальейшей работе в этой теме ещё могут возникнуть вопросы.
Но почему тогда без Connection: close работало на локали?
Спустя 9 часов, 36 минут, 27 секунд (26.09.2011 - 08:29) killer8080 написал(а):
Цитата (Воитель @ 25.09.2011 - 22:53) |
Но почему тогда без Connection: close работало на локали? |
А ты сначала исправь свой первый скрипт, и посмотри что получиться
PS значит на локали сервер разрывал соединение, и не ждал следующих запросов.
_____________
Вечно учусь.