Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Странное поведение fsockopen: рабочий сервер отдаёт 504

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Ferro777
Отправлено: 16 Августа, 2014 - 12:30:06
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Всем добрый день!

PHP:
скопировать код в буфер обмена
  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!');
  24.  


При запуске скрипта через браузер, он работает (или висит) 60 сек, затем мой сервер выдаёт заголовок "504 Gateway Time-out nginx" и всё.
НО: в логе я вижу 'OK!', т.е. скрипт на этом не останавливается.
Хочу также отметить, что с некоторыми сайтами fsockopen всё же нормально работает без этой ошибки.

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

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

PHP:
скопировать код в буфер обмена
  1. while($d = fread($f, 4096)) {
  2.         $response .= $d;
  3. }


на

PHP:
скопировать код в буфер обмена
  1. while(!feof($f)) {
  2.         $response .= fread($f, 4096);
  3. }


PHP, игнорируя default_socket_timeout, выполняется 60 сек и возвращает "504 Gateway Time-out nginx".

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

(Отредактировано автором: 16 Августа, 2014 - 12:45:44)

 
 Top
Мелкий Супермодератор
Отправлено: 16 Августа, 2014 - 12:42:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ferro777 пишет:
"Connection: keep-alive\r\n";

Собственно, сами попросили.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB