За последние 24 часа нас посетили 17812 программистов и 1683 робота. Сейчас ищут 998 программистов ...

вопрос про медленную работу сокета

Тема в разделе "PHP для новичков", создана пользователем marwin22, 27 фев 2010.

  1. marwin22

    marwin22 Активный пользователь

    С нами с:
    15 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    имеется вот такой код:
    PHP:
    1. <?php
    2. function artistGetInfo($name) {
    3.     echo "getting xml\n";
    4.     $time_start=microtime(true);
    5.     $socket=fsockopen('tcp://musicbrainz.org',80);
    6.     $query="GET /ws/1/artist/?type=xml&name=".str_replace('&','',str_replace(' ','+',$name))."&limit=1 HTTP/1.1\r\n";
    7.     $query .= "Host: musicbrainz.org\r\n";
    8.     $query .= "Connection: keep-alive\r\n\r\n";
    9.     if ($socket===false) return false;
    10.     $result=fwrite($socket,$query);
    11.     if ($result===false) {
    12.         fclose($socket);
    13.         return false;
    14.     }
    15.     $res="";
    16.     while (!feof($socket)) {
    17.         $res.=fgets($socket);
    18.     }
    19.     fclose($socket);
    20.     $time_end=microtime(true);
    21.     $time=$time_end-$time_start;
    22.     echo $time."\n";
    23.     if ($res=="") return false;
    24.     $res=parse_response(str_replace('life-span','lifespan',$res));
    25.     echo "parsing xml\n";
    26.     $time_start=microtime(true);
    27.     $xml=new SimpleXMLElement($res);
    28.     $time_end=microtime(true);
    29.     $time=$time_end-$time_start;
    30.     echo $time."\n";
    31.     $a='artist-list';
    32.     if ($xml->$a!=null) {
    33.         return $xml->$a->artist;
    34.     } else {
    35.         return false;
    36.     }
    37. }
    38. ?>
    почему то каждое получение xml занимает примерно 75 секунд, тогда как если открывать в браузере оно работает почти моментально. Загрузка компа, на котором крутится пхп минимальна, инет канал тоже свободен. Для примера можете сами проверить http://musicbrainz.org/ws/1/artist/?typ ... es&limit=1
    Кто-нибудь может подсказать с чем могут быть связаны такие задержки при получении данных?
     
  2. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    скприпт из командной строки запускаешь?
     
  3. marwin22

    marwin22 Активный пользователь

    С нами с:
    15 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    пробовал из командной и через cgi
    причем такое происходит походу именно с этим сайтом. мне просто интересно, это может быть проблема в чем-то у меня, или причина от меня не зависит?
     
  4. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    мне так мыслится, быть связано это может с тем, что. когда запускаешь скприпт на выполнение из командной строки, интерпретатор начинает открывать кучу файлов, собирать свою конфигурацию итп.
    если из браузера, то вебсервер вычитывает конфигурацию пхп и загружает все его либы в себя лишь один раз - при запуске демона (сервиса). отсюда и разница.
    выводы сделаны, исходя из наблюдений с пом. filemon.exe
     
  5. marwin22

    marwin22 Активный пользователь

    С нами с:
    15 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    не, это тут не причём, ибо таймер то показывает время для каждого действия отдельно(получение xml и создание SimpleXMLElement), и время работы скрипта через cgi и из консоли примерно одинаковое
     
  6. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    никто на меня не обидится, если я скажу, что это бред?

    marwin22
    с какой целью keep-alive шлёшь, мил человек?
     
  7. marwin22

    marwin22 Активный пользователь

    С нами с:
    15 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    А действительно, дело в keep-alive. Спасибо!

    Но по поводу keep-alive есть тоже вопрос. Просто изначально я хотел делать несколько запросов, используя один и тот же сокет, поэтому слал keep-alive. Но в результате пришел к тому, что успешно пишу в сокет следующий запрос(до этого один запрос был уже послан и успешно обработан), но ответа на него вычитать не могу. Сервер на мои запросы отвечает "Connection:keep-alive" и также указывает таймаут keep-alive. В чем может быть загвоздка?