Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не получаю ожидаемого результата, fsockopen, xml, yandex
 
 автор: lgar   (26.08.2009 в 22:12)   письмо автору
 
 


<?php
header 
("Content-Type: text/html;charset=utf-8");
$query 'yandex';
$page '0';
$hostname "xmlsearch.yandex.ru";
$path "/xmlsearch";

// XML запрос
    
$doc = <<<DOC
<?xml version='1.0' encoding='utf-8'?>
<request>
    <query>
$query</query>
    <page>
$page</page>
    <maxpassages>0</maxpassages>
    <groupings>
        <groupby attr='d' mode='deep' groups-on-page='10' docs-in-group='1' curcateg='-1'/>
    </groupings>
</request>
DOC;

       
  function 
get_content($hostname$path)
  { 
    
$line "111";
    
$fp fsockopen($hostname80$errno$errstr30); 
    if (!
$fp) echo "$errstr ($errno)<br />\n"
    else
    { 
      
$headers "GET $path HTTP/1.1\r\n";  //или POST
      
$headers .= "Host: $hostname\r\n"
      
$headers .= "Content-type: application/xml"."\r\n";
      
$headers .= "Content-length:"."strlen($doc)"."\r\n"
      
$headers .= "Connection: Close\r\n\r\n";
      
$headers .= "$doc"
      
fwrite($fp$headers); 
      while (!
feof($fp))
      { 
        
$line .= fgets($fp1024); 
      } 
      
fclose($fp); 
    } 
    return 
$line
  }  
get_content($hostname$path);
var_dump($line);
//$xmldoc = simplexml_load_string($line); //simplexml_load_file
//var_dump($xmldoc);
?>


Вместо ожидаемых данных в виду XML, получаю NULL. Вроде заголовки правильные посылаю, да и сервис Яндекса успешно видит мои запросы (отображается в статистике). В чём может быть ошибка?

  Ответить  
 
 автор: heed   (26.08.2009 в 22:31)   письмо автору
 
   для: lgar   (26.08.2009 в 22:12)
 

должно быть

$line = get_content($hostname, $path);

ещё $doc не видно внутри функции , обьявите его там как
global $doc;


//upd
если изменить заголовки

$headers = "POST $path HTTP/1.1\r\n"; //или POST
$headers .= "Host: $hostname\r\n";
$headers .= 'Content-type: application/xml' ."\r\n";
$headers .= 'Content-length: '. strlen($doc) ."\r\n";
$headers .= 'Connection: Close' ."\r\n\r\n";

Всё работает

HTTP/1.1 200 OK
Date: Wed, 26 Aug 2009 19:08:34 GMT
Server: Apache/2.2.9 (Unix) mod_perl/2.0.4 Perl/v5.8.8
Set-Cookie: yandexuid=1094161251313714; path=/; domain=.yandex.ru; expires=Friday, 31-Dec-10 23:59:59 GMT
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/xml

9a



XX.XXX.XXX.XXX not found



0

За исключением того что сервис доступен только для зарегистрированных IP
(мой XX.XXX.XXX.XXX незарегистрирован)

и Transfer-Encoding: chunked
говорит о том что нужно получать цифру, затем такое колличество байт и новую цифру ,
и так пока не будет получен 0
только так можно получить контент без примесей цифр

  Ответить  
 
 автор: lgar   (26.08.2009 в 23:16)   письмо автору
 
   для: heed   (26.08.2009 в 22:31)
 

Спасибо, исправил недочёты.

Теперь появилось что-то более интересное. Теперь получается, что неправильный запрос. Вместо xml Content-Type text/html.
string(790)
"111HTTP/1.1 400 Bad Request
Date: Wed, 26 Aug 2009 19:13:15 GMT
Server: Apache/2.2.9 (Unix) mod_perl/2.0.4 Perl/v5.8.8 Vary: Accept-Encoding Content-Length: 558
Connection: close
Content-Type: text/html; charset=iso-8859-1
Bad Request

Your browser sent a request that this server could not understand.
Request header field is missing ':' separator.

<request> <query>yandex</query> <page>0</page> <maxpassages>0</maxpassages> <groupings> <groupby attr='d' mode='deep' groups-on-page='10' docs-in-group='1' curcateg='-1'/> </groupings>


upd.
От этого ошибка не изменилась. Мне кажется, это и не должно повлиять на результат. Видел рабочий скрипт, где после Connection: Close\r\n\r\n что-то отправляли и это работало. Хотя и удивительно.

$headers .= "$doc"; 
$headers .= "Connection: Close\r\n\r\n";

  Ответить  
 
 автор: heed   (26.08.2009 в 23:18)   письмо автору
 
   для: lgar   (26.08.2009 в 23:16)
 

как-раз редактировал свой пост

  Ответить  
 
 автор: lgar   (30.08.2009 в 20:39)   письмо автору
 
   для: lgar   (26.08.2009 в 22:12)
 

Исправил ещё 3 ошибки, но проблема всё равно осталась. Теперь вместо 400, 404. Хотя адрес правильный. И сервис не видит число запросов.


$hostname = 'xmlsearch.yandex.ru';
$path = '/xmlsearch';


1) Использовал GET, но запрос оформил для POST.
2) Если использовать GET, то Content-length использовать не нужно.
3) Вместо HTTP 1.1 надо использовать 1.0

В связи с этим возникло пару вопросов:
1) Путь надо записывать так $path = "/xmlsearch"; или $path = "/xmlsearch/"?
2) Порядок следования заголовков. Например, после $headers .= "Connection: Close\r\n\r\n"; можно посылать др. заголовки?
3) На что влияет "\r\n", где нужно использовать "\r\n\r\n"?


$headers = "POST $path HTTP/1.0\r\n"; 
$headers .= "Host: $hostname\r\n"; 
$headers .= "Connection: Close\r\n\r\n"; 
$headers .= "Content-Type: application/xml\r\n"; 
$headers .= "Content-Length: ".strlen($data)."\r\n".$data."\r\n";

  Ответить  
 
 автор: Trianon   (30.08.2009 в 23:50)   письмо автору
 
   для: lgar   (30.08.2009 в 20:39)
 

echo '<pre>'.$headers;

  Ответить  
 
 автор: lgar   (31.08.2009 в 10:11)   письмо автору
 
   для: lgar   (26.08.2009 в 22:12)
 


$headers = "POST $path HTTP/1.0\r\n";  //или POST
$headers .= "Host: $hostname\r\n"; 
$headers .= "Content-Type: application/xml\r\n"; 
$headers .= "Content-Length: ".strlen($data)."\r\n";
$headers .= "Connection: Close\r\n\r\n";
$headers .= $data; 


Не знаю почему, но так заработало. Отличий с предыдущим примером я не вижу (. Наверно, из-за того, что "Content-Type и Content-Length до Connection: Close.

  Ответить  
 
 автор: Trianon   (31.08.2009 в 10:45)   письмо автору
 
   для: lgar   (31.08.2009 в 10:11)
 

Я Вам сказал именно как увидеть отличия.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования