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

Форум PHP

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

 

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

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

тема: Странное поведение fsockopen: рабочий сервер отдаёт 504
 
 автор: Ferro777   (16.08.2014 в 13:37)   письмо автору
 
 

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

[php]<?php

$q = '';
$q .= "GET / HTTP/1.1\r\n";
$q .= "Host: {$domain}\r\n";
$q .= "Connection: keep-alive\r\n";
$q .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n";
$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";
$q .= "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n\r\n";

$f = fsockopen($domain, 80, $errno, $errstr);
fwrite($f, $q);

if(!empty($errstr)) exit($errstr);

$response = '';
while($d = fread($f, 4096)) {
$response .= $d;
}

echo $response;

error_log('OK!');
[/php]

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

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

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

[php]while($d = fread($f, 4096)) {
$response .= $d;
}[/php]

на

[php]while(!feof($f)) {
$response .= fread($f, 4096);
}[/php]

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

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

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

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