zeromind
1.12.2012 - 21:18
Здраствуйте форумчане, хотел бы посоветоватся с вами))
пишу балансировщик нагрузки для двух серверов (статик контент) на 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
2.12.2012 - 18:15
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
2.12.2012 - 22:32
Цитата (vagrand @ 2.12.2012 - 17:15) |
zeromind
Цитата | лучше использовать Curl |
Тут вы очень правы, используйте cURL там можно ограничить время ожидания.
|
пример можете дать?
ни когда Curl'ом впринципе не пользовался
vagrand
3.12.2012 - 09:31
zeromind
function sendRequest($url)
{
$curlHandler = curl_init();
if (empty($curlHandler)) {
return false;
}
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 );
$result = curl_exec($curlHandler);
if (curl_errno($curlHandler)) {
return false;
}
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
3.12.2012 - 13:03
Цитата (vagrand @ 2.12.2012 - 17:15) |
Тут вы очень правы, используйте cURL там можно ограничить время ожидания. |
время ожидания везде можно ограничить

$context = stream_context_create(array('http' => array('timeout' => 3)));
file_get_contents($url, false, $context);
vagrand
3.12.2012 - 13:50
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
3.12.2012 - 16:19
Цитата (killer8080 @ 3.12.2012 - 12:03) |
Цитата (vagrand @ 2.12.2012 - 17:15) | Тут вы очень правы, используйте cURL там можно ограничить время ожидания. |
время ожидания везде можно ограничить  $context = stream_context_create(array('http' => array('timeout' => 3))); file_get_contents($url, false, $context); |
спасибо, сейчас попробую.. получается таким вариантом можно передавать даже хедеры?
если таймаут будет больше 4сек, что вернет file_get_contents? false ?
killer8080
3.12.2012 - 16:22
Цитата (zeromind @ 3.12.2012 - 15:19) |
спасибо, сейчас попробую.. получается таким вариантом можно передавать даже хедеры? |
можно, если нужно.
можно и прокси задействовать, много чего можно
zeromind
3.12.2012 - 16:55
Цитата (killer8080 @ 3.12.2012 - 15:22) |
Цитата (zeromind @ 3.12.2012 - 15:19) | спасибо, сейчас попробую.. получается таким вариантом можно передавать даже хедеры? |
можно, если нужно. можно и прокси задействовать, много чего можно |
так что вернет file_get_contents при таймауте? )
killer8080
3.12.2012 - 17:28
Цитата (zeromind @ 3.12.2012 - 15:55) |
ак что вернет file_get_contents при таймауте? ) |
false
кстати, file_get_contents плюется варнингом, при ошибках соединения, что не логично, желательно эту ошибку глушить. Это как раз тот самый, редкий случай, когда применение "собачки" оправдано.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.