MySQL server has gone away
Пришло на ум: 9 января 2010
Обнаружилась одна интересная проблема с MySQL на этом бесплатном хостинге. У меня в левой колонке установлен курсовик валют нацбанка РБ, который считывается непосредственно с сайта.
Но как в дальнешем оказалось если есть какие-то проблемы с коннектом к сайту нацбанка, или же в ихний XML закралась ошибка - весь скрипт начинает долго и нудно тупить, и в результате появляется замечательная надпись, MySQL server has gone away типа сервер ушел на перекур :).
Решение данной проблемы - создание подключения к xml данным сервера национального банка республики Беларусь в асинхронном режиме, чтобы вся страница не ждала, пока сервер нацбанка соизволит таки ответить :).
Причина MySQL server has gone away
UPD : 14.04.2011(прошло почти полтора года) Поскольку народ постоянно заходит по этому запросу - обновляю инфу в этом посте. Причина ухода сервака - прерывание сессии MySQL при запросе - mysql просто закрывает сессию через таймаут( вероятно прохой коннекшен mysql c apache). Если конфигурировать не можете - используйте по возможности асинхронные запросы. Если можете - вероятно можно выставить timeout, я не сисадмин, точно не скажу.
Mysql не умер, он просто вышел покурить...
Для начала создаем обьект xmlhttp:
//Обьект xmlHttp
var xmlhttp=createXmlHttpRequestObject();
function createXmlHttpRequestObject()
{
//ссылка на xmlhttprequest
var xmlhttp;
// If IE
if(window['ActiveXObject'])
{
try
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e)
{
xmlhttp=false;
}
}
//IF not IE
else
{
try
{
xmlhttp=new XMLHttpRequest();
}
catch(e)
{
xmlhttp=false;
}
}
if (!xmlhttp)
{
alert("Ошибка при создании XMLHttpRequest");
}
else
{
return xmlhttp;
}
}
Далее создаем функцию непосредственно передающую данные:
function load_module(module){
//checking xmlhttp
// Обьект xmlhttp не должен быть занят
if (xmlhttp['readyState'] == 4 || xmlhttp['readyState'] == 0)
{
// строка запроса
xmlhttp.open("GET","ajax.php?module="+module, true);
// фунция-приемник данных
xmlhttp.onreadystatechange=response;
// отправка данных
xmlhttp.send(null);
}
//если сервер занят
else
{
alert("Server is bisy");
}
}
И функцию обработки полученного запроса
function response(){
if (xmlhttp['readyState'] == 4 )
nbsp; {
//если успешно принято
if (xmlhttp['status'] == 200)
{
document.getElementById('module_curs').innerHTML=xmlhttp['responseText'];
}
else
{
alert("Reiciving error: "+xmlhttp['statusText']);
}
}
}
Принимающий код на php
header("Content-Type: text/html;charset=windows-1251");
#####################################################
$months=array("","января","февраля","март","апреля","мая","июня",
"июля","августа","сентября","октября","ноября","декабря");
$date = date("m/d/Y");
if ($_GET['module']=="curs") {
//Выполняем первый пункт, считываем страницу с курсами валют в переменную
$file = @file_get_contents("http://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$date);
//Разбираем страницу с помощью регулярок:
function get_course($code,$file){
preg_match("#(.*?)#is", $file, $m);
preg_match("#(.*?)#is", $m[1], $r);
return str_replace(",", ".", $r[1]);
}
$lb_dollar = get_course(145,$file);
//Пробум вчера
if (!$lb_dollar) {
$year=date("Y");
$month=date("m");
$day=date("d");
$day=$day-1;
$date=$month."/".$day."/".$year;
$file = @file_get_contents("http://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$date);
$lb_dollar = get_course(145,$file);
}
if(!$lb_dollar){
$lb_dollar=" error ";
$lb_euro=" error ";
$lb_rur=" error ";
}
else {
$lb_euro = get_course(19,$file);
$lb_rur = get_course(190,$file);
}
$month=(int)$month;
$month=$months[$month];
$lb_day=$day." ".$month;
if ($lb_dollar!=" error ") {
echo "
Курс валют нацбанка РБ
USD: {$lb_dollar}
EUR: {$lb_euro}
RUR: {$lb_rur}
(на {$lb_day})
";
}
}//if module==curs
Осталость только включить в хтмл блок вывода
Если мой пост помог вам сэкономить пару часов времени или показался полезным, думаю не лишним будет показать его друзьям через социальные сети или упомянуть в своем блоге.
|