xml.yandex.ru не отдает страницу целиком

pavel83

Новичок
xml.yandex.ru не отдает страницу целиком

Не могу получить с помощью сокетов от xml.yandex.ru целый ответ (обрубается в одном месте)

Создаю сокет - отправляю и читаю
PHP:
<?php    
$query='запрос';  
$page=0;    	
$hostname="xmlsearch.yandex.ru";  
$path="/xmlsearch/";    	

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);     	
socket_connect($sock, $hostname, 80);     
$data="<?xml version=\"1.0\" encoding=\"windows-1251\"?>  
<request>  <query>{$query}</query>  
<groupings>  <groupby attr=\"d\" mode=\"deep\" groups-on-page=\"20\"  docs-in-group=\"1\" />  
</groupings>  <page>{$page}</page>  </request>\r\n";    

$headers="POST {$path} HTTP/1.0  
Host: $hostname  
Content-type: text/xml;  
Content-length: ".strlen($data)."\r\n\r\n";

socket_write($sock, $headers.$data);    	
$txt='';  	

while(!@socket_last_error($sock)){  	
if($line=socket_read($sock,512,PHP_NORMAL_READ)){  		
$txt.=$line;   	} }  	

socket_close($sock);     	  	
$pos=strpos($txt,"\r\n\r\n");  	

$header_out=substr($txt,0,$pos);  	
$txt_out=substr($txt,$pos);  	  	

header($header_out);  
$txt_out=substr($txt_out,strpos($txt_out,'<?xml'));  	
echo $txt_out;    

?>
Результат тут

Если сделать то же самое fget-ом все работает. Сокеты перестали корректно работать 5 дней назад на 3-х разных хостингах одновременно. Яша чтоли изменил что-то у себя, не пойму...

Есть идеи?
 

pavel83

Новичок
Автор оригинала: Alexandre
использую curl и не парюсь.
ЯшаXML кушает нормально...
Мне нужно с разных ip-шников собирать с помощью socket_bind() в curl-е есть что-то подобное?
 

Alexandre

PHPПенсионер
Мне нужно с разных ip-шников собирать с помощью socket_bind() в curl-е есть что-то подобное?
1) зачем? не нарушается ли Лицензионное соглашение Ya.XML?
2) curl_multi чем не подходит???
 

pavel83

Новичок
Автор оригинала: whirlwind
перепиши цикл нормально. у меня все работает
Может еще знаешь как?

while($line=socket_read($sock,512,PHP_NORMAL_READ)) $txt.=$line;

та же хрень.
(При том, что раньше со старым циклом все работало)

-~{}~ 08.09.09 12:07:

Автор оригинала: Alexandre
1) зачем? не нарушается ли Лицензионное соглашение Ya.XML?
2) curl_multi чем не подходит???
1. не нарушется, я же с одного ip не собираю больше 1000 (да мне и не дадут :) )
2. Послушал "авторитетный" источник
http://masterhost.ru/support/doc/php/#yandex-xml
Придется разбираться с curl-ом.
Странно, что раньше все работало...
 

Активист

Активист
Команда форума
pavel83
Курл умеет использовать разные ипишники - смотри манул, вопрос недавно обсуждался. (cutl_setopt)

-~{}~ 08.09.09 21:40:

да, см. именно php.net/curl_setopt ибо он всегда актуален.
 

pavel83

Новичок
Всем спасибо. Если интересно - проблема решена путем замены сокетов на курл. Рабочий код есть на мастерхосте (см. ссылку выше).
Почему не работают сокеты (а раньше работали) и как написать "нормальный" цикл, чтобы они работали не разобрался.
 

Dreammaker

***=Ф=***
pavel83, если сайт или проект для которого нужно дёргать яндексовский XML пройдёт фейс-контроль в РСЯ (рекламной сети яндекса), то можно, насколько я помню, снять ограничение на 1000 запросов.
 
Сверху