За последние 24 часа нас посетили 18578 программистов и 1632 робота. Сейчас ищут 1086 программистов ...

Странное поведение fsockopen: рабочий сервер отдаёт 504

Тема в разделе "Прочие вопросы по PHP", создана пользователем Ferro7, 16 авг 2014.

  1. Ferro7

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

    С нами с:
    16 авг 2014
    Сообщения:
    5
    Симпатии:
    1
    Всем добрый день!

    Код (Text):
    1. <?php
    2.  
    3. $q = '';
    4. $q .= "GET / HTTP/1.1\r\n";
    5. $q .= "Host: yandex.ru\r\n";
    6. $q .= "Connection: keep-alive\r\n";
    7. $q .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n";
    8. $q .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36\r\n";
    9. $q .= "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n\r\n";
    10.  
    11. $f = fsockopen('yandex.ru', 80, $errno, $errstr);
    12. fwrite($f, $q);
    13.  
    14. if(!empty($errstr)) exit($errstr);
    15.  
    16. $response = '';
    17. while($d = fread($f, 4096)) {
    18.     $response .= $d;
    19. }
    20.  
    21. echo $response;
    22.  
    23. error_log('OK!');
    При запуске скрипта через браузер, он работает (или висит) 60 сек, затем мой сервер выдаёт заголовок "504 Gateway Time-out nginx" и всё.
    НО: в логе я вижу 'OK!', т.е. скрипт на этом не останавливается.
    Хочу также отметить, что с некоторыми сайтами fsockopen всё же нормально работает без этой ошибки.

    Пробовал установить default_socket_timeout в 5 сек и это помогало, причём, скрипт работал ровно столько секунд, сколько было в default_socket_timeout, и нормально возвращался ответ сайта, к которому обращаются. Хотя если указать default_socket_timeout 60 и более - опять ошибка!

    НО: если заменить

    Код (Text):
    1. while($d = fread($f, 4096)) {
    2.     $response .= $d;
    3. }
    на

    Код (Text):
    1. while(!feof($f)) {
    2.     $response .= fread($f, 4096);
    3. }
    PHP, игнорируя default_socket_timeout, выполняется 60 сек и возвращает "504 Gateway Time-out nginx".

    Пробовал обращаться к сайту не по домену, а по ip, и это помогло и всё стало работать нормально.
    В чём причина такого поведения php?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    А прочитать? :D
     
  3. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Connection: keep-alive поменяйте на Connection: close