[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: file_get_contens
zeromind
Здраствуйте форумчане, хотел бы посоветоватся с вами))
пишу балансировщик нагрузки для двух серверов (статик контент) на php..
логика такая: собираю информацию о наличии файла + кол-во коннектов на двух серверах.. и если файл есть на одном сервере, а на втором нету - отдаем естественно ссылку на 1ый сервер, и наооборот.. но если файлы есть и там и там - тут определяем где меньше коннектов - на тот сервер и передаем ссылку..

Эта схема впринципе очень хорошо работает, кол-во коннектов в реальном времени делит поровну и каналы забиты одинаково +-2-5%.. появилась маленькая нагрузка на процессор (5-10% на один тред XEON e3-1240) - процесс netstat.. я думаю статистику можно кэшировать на секунды 3-5, а не запрашивать каждый раз netstat при реквесте.. но такая нагрузка - это просто мелочь.. не в этом проблема.

Проблема, возникает тогда, когда один из серверов долго отвечает или выкидывает вообще 502 bad gateway, собственно вопрос.. я получаю информацию с серверов тупо с помощью file_get_contents.. мне наверно лучше использовать Curl или другое средство, чтобы можно было ждать ответ в течении 5-10 секунд ?
сейчас получается, если один из серверов долго отвечает, то страница грузится до пол минуты (редко бывает), ожидая ответ с другово сервера, именно file_get_contens в этом случае мне не подходит..
vagrand
zeromind
Цитата
лучше использовать Curl


Тут вы очень правы, используйте cURL там можно ограничить время ожидания.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
zeromind
Цитата (vagrand @ 2.12.2012 - 17:15)
zeromind
Цитата
лучше использовать Curl


Тут вы очень правы, используйте cURL там можно ограничить время ожидания.

пример можете дать?
ни когда Curl'ом впринципе не пользовался
vagrand
zeromind


function sendRequest($url)
{
// Init curl
$curlHandler = curl_init();
if (empty($curlHandler)) {
return false;
}

// Set cURL options
curl_setopt($curlHandler, CURLOPT_URL, $url);
curl_setopt($curlHandler, CURLOPT_HEADER, 0);
curl_setopt($curlHandler, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlHandler, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($curlHandler, CURLOPT_TIMEOUT, 60 );

// Send request
$result = curl_exec($curlHandler);

// Save curl error
if (curl_errno($curlHandler)) {
return false;
}

// Close cURL
curl_close($curlHandler);

return $result;
}


_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
killer8080
Цитата (vagrand @ 2.12.2012 - 17:15)
Тут вы очень правы, используйте cURL там можно ограничить время ожидания.

время ожидания везде можно ограничить user posted image
$context = stream_context_create(array('http' => array('timeout' => 3))); 
file_get_contents($url, false, $context);
vagrand
killer8080
век живи век учись, не знал про такое.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
zeromind
Цитата (killer8080 @ 3.12.2012 - 12:03)
Цитата (vagrand @ 2.12.2012 - 17:15)
Тут вы очень правы, используйте cURL там можно ограничить время ожидания.

время ожидания везде можно ограничить user posted image
$context = stream_context_create(array('http' => array('timeout' => 3))); 
file_get_contents($url, false, $context);

спасибо, сейчас попробую.. получается таким вариантом можно передавать даже хедеры?
если таймаут будет больше 4сек, что вернет file_get_contents? false ?
killer8080
Цитата (zeromind @ 3.12.2012 - 15:19)
спасибо, сейчас попробую.. получается таким вариантом можно передавать даже хедеры?

можно, если нужно.
можно и прокси задействовать, много чего можно smile.gif
zeromind
Цитата (killer8080 @ 3.12.2012 - 15:22)
Цитата (zeromind @ 3.12.2012 - 15:19)
спасибо, сейчас попробую.. получается таким вариантом можно передавать даже хедеры?

можно, если нужно.
можно и прокси задействовать, много чего можно smile.gif

так что вернет file_get_contents при таймауте? )
killer8080
Цитата (zeromind @ 3.12.2012 - 15:55)
ак что вернет file_get_contents при таймауте? )

false

кстати, file_get_contents плюется варнингом, при ошибках соединения, что не логично, желательно эту ошибку глушить. Это как раз тот самый, редкий случай, когда применение "собачки" оправдано.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.