За последние 24 часа нас посетили 18967 программистов и 1617 роботов. Сейчас ищут 1028 программистов ...

file_get_contents медленно работает

Тема в разделе "PHP для новичков", создана пользователем miketm, 13 мар 2017.

  1. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Господа, подскажите, пожалуйста, не могу понять.
    Есть некоторый web server, к которому можно обратиться примерно так:

    http://website.ru/search?par1=1234&par2=5678&xml=false

    Если вбить эту строку в chrome, то команда выполняется мгновенно (доли секунд) и сервер возвращает JSON очень
    небольшого объема
    (всего 6 кб).

    А теперь есть простейший PHP скрипт, вот его фрагмент:

    PHP:
    1. ini_set('default_socket_timeout', 360);
    2.  
    3. $url="http://website.ru/search?par1=1234&par2=5678&xml=false";
    4.  
    5. file_put_contents($log_file, date("Y-m-d H:i:s") . ": Trying to get data from URL: ". $url ."\n", FILE_APPEND);
    6.  
    7. $jsondata_string = file_get_contents($url);
    8.  
    9. file_put_contents($log_file, date("Y-m-d H:i:s") . ": file_get_contents procedure finished \n", FILE_APPEND);
    В итоге в логе получаем:

    2017-03-13 17:16:45: Trying to get data from URL: http://website.ru/search?par1=1234&par2=5678&xml=false
    2017-03-13 17:22:46: file_get_contents procedure finished

    Как видно, время выполнения file_get_contents совпадает с default_socket_timeout, т.е. вместо сотни миллисекунд
    file_get_contents выполняется 360 сек.
    Что за проблема с file_get_contents?

    В этой истории есть два подозрительных момента:

    1. Раньше этот же скрипт обрабатывался быстро

    2. У меня есть другой скрипт, которые обращается к другому web серверу точно таким же образом и в этом случае,
    file_get_contents
    отрабатывает быстро, а объем возвращаемого JSON может составлять сотни килобайт, а вот с этим скриптом какая-то
    проблема.

    Самое интересное, что file_get_contents в итоге отрабатывает (т.е. переменная $jsondata_string содержит нужный json)

    Помоги те плиз.
     
    #1 miketm, 13 мар 2017
    Последнее редактирование модератором: 14 мар 2017
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    [Editors note: As of PHP 5.2.1 you can specify `timeout` context option and pass the context to file_get_contents()]

    The only way I could get get_file_contents() to wait for a very slow http request was to set the socket timeout as follows.

    PHP:
    1. ini_set('default_socket_timeout',    120);
    2. $a = file_get_contents("http://abcxyz.com");
    Other times like execution time and input time had no effect.
     
    #2 Dmitriy A. Arteshuk, 14 мар 2017
    Последнее редактирование модератором: 14 мар 2017
  3. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Спасибо за ответ. Вижу, что товарищ описывает точно такую же проблему как у меня. Это однако не дает ответа на вопрос почему это происходит при вызове file_get_contents() и не происходит, когда я забиваю запрос в браузере. Может я как-то не правильно работают с file_get_contents() ? или может это бага в какой-то из версий php?
     
  4. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    PHP:
    1. ini_set('default_socket_timeout', 360);
    Вот эту строку закомментируй и проверь
     
    #4 Dmitriy A. Arteshuk, 14 мар 2017
    Последнее редактирование модератором: 14 мар 2017
  5. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Это я уже пробовал делать. В этом случае file_get_contents() отрабатывает 60 секунд. По всей видимости 60 секунд, это дефолт, установленный в PHP. Сегодня вечером, конечно, попробую еще раз, но скорее всего не поможет.
     
  6. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Проверил еще раз. Команда выполняется за 60 секунд. В хроме при этом этот же запрос выполняется мгновенно (хром показывает около 200 мс). Господа, будут ли еще идеи? Буду рад любым озвученным гипотезам
     
  7. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    В общем, не разобрался я почему оно перестало работать. Переписал код на использование curl. Проблема решена, вопрос закрыт. Спасибо за участие!
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Я бы не успокоился не узнав в чем была проблема :)