bash.org:

Следуй за мной:

twiby

Адовый чад кутежа и трэш в комплекте

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
Осталость только включить в хтмл блок вывода

	
		

Если мой пост помог вам сэкономить пару часов времени или показался полезным, думаю не лишним будет показать его друзьям через социальные сети или упомянуть в своем блоге.


Ваше мнение:

Имя
   другие статьи с тегом MySQL

Случайная мысль:

Если хотите сохранить тайну от врага, не рассказывайте ее другу.
Бенджамин Франклин
drcreazy © 2008-2012 all rights reserved