Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« : 25.03.2010, 16:59:13 » |
|
Добрый день, есть сайт на Joostina 1.2 с самописным компонентом. при увеличение кол-ва посещений сайт стал отваливаться с проблемой не возможности подключения БД. а именно проблема User already has more than 'max_user_connections' active connections
ответ хостера: это не про нагрузку ошибка, эта ошибка говорит:
пользователь БД превышает установленный порог max_user_connections активных соединений.
лимит этот очень высок, т.ч. дело в плохо написанных скриптах. например, "разработчик" забыл про функцию mysql_close. все запросы выполняю примерно так $query = "INSERT INTO #__table (id_firm,fio_name,mail,text,date,type_otziv,published,ip,file_name) VALUES ('$firm_id','{$fio_name}','{$mail}','{$text}','{$Data}','{$_REQUEST['type_otziv']}','1','{$ip}','{$file_name}')"; //echo $query ; $database->setQuery($query); подскажите что сделать? и как отследить кол-во подключений к БД ? p.s: хостер не ведет учет SQL запросов, т.е у него нет логов по которым можно это отследить 
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #1 : 25.03.2010, 18:09:43 » |
|
mysql_close() закрывает соединение с MySQL-сервером, ассоциированное со специфицированным идентификатором ссылки/link_identifier. Если link_identifier не специфицирован, используется последняя открытая ссылка.
Использовать mysql_close() обычно не нужно, поскольку непостоянные открытые ссылки закрываются автоматически в конце выполнения скрипта. См. также освобождение ресурсов. Примечание: mysql_close() не закрывает постоянные ссылки, созданные функцией mysql_pconnect(). Проверь в файле в используемом классе базы данных какая именно функция используется. Число коннектов - это число заходов пользователей на сайт, трафик очень большой? Или хостер просто решил перевести на более дорогой тариф? Меня больше всего испугала прямая уязвимость - {$_REQUEST['type_otziv']}, оооченьмегаопасно.
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #2 : 25.03.2010, 18:17:57 » |
|
boston, как таковых классов не используется. просто делается запрос там где нужно получить данные запросы вида $firm_id= intval(mosGetParam($_REQUEST, 'firm_id', 0)); // получаем ID фирмы $firm_date=firm_date($firm_id); // получаем данне о фирме $region_date=region($firm_date[0]->id_region); // получаем данне о регионе! $categ_date=cat_date($firm_date[0]->id_categ ); // получаем данне о категории! где выше было function firm_date($id) // ф-я для получения данных из таблицы ИНФОРМАЦИЯ о ФИРМЕ { global $database; # БД Query $database->setQuery("SELECT * FROM table_firm WHERE published='1' AND id='{$id}' "); $rows = $database->loadObjectList(); return $rows; // }
function cat_date($id) // ф-я для получения данных из таблицы КАТЕГОРИЙ { global $database; # БД Query $database->setQuery("SELECT a.* FROM #table_categ AS a WHERE a.published='1' AND id={$id} "); $rows_cat = $database->loadObjectList(); return $rows_cat; } p.s: тарифны план и так вроде не хилый
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #3 : 25.03.2010, 18:28:10 » |
|
Явных ошибок в коде не вижу
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #4 : 25.03.2010, 18:33:38 » |
|
n/t такая структура не должна преводить к перегрузке ?
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #5 : 25.03.2010, 19:16:11 » |
|
Нет, не должна.
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #6 : 30.03.2010, 19:51:38 » |
|
boston, хостер всерано настаивает на том что слишком много подключений, и что видимо неиспользуется mysql_close. все SQL обрабатыdf. как обычно $query = "INSERT INTO #_таблица (id_firm,fio_name,mail,text,date,type_otziv,published,ip,file_name) VALUES ('$firm_id','{$fio_name}','{$mail}','{$text}','{$Data}','{$type_otziv}','1','{$ip}','{$file_name}')"; //echo $query ; $database->setQuery($query); if (!$database->query()) { echo "<script> alert('".$database->getErrorMsg()."'); window.history.go(-1); </script>\n"; exit(); }
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #7 : 30.03.2010, 19:56:05 » |
|
может кто подскажет как сделать лог SQL запросов? вот решение Довольно просто сделать самому в классе BD. В 1.5.х вот этот файл /libraries/joomla/database/database/mysql.php, если 1.0.х то includes/database.php . в Joostina 1.2 includes\database\database\database.php .  в общем файл найти не проблема Там есть функция query(, добавь в неё: $_temp_sql=str_replace("'",'"',$this->_sql); $_temp_sql=str_replace('"','\"',$_temp_sql); mysql_query("INSERT INTO `jos_stat` (`sql`) VALUES ('$_temp_sql') ", $this->_resource );
При этом я создал таблицу в БД: CREATE TABLE `jos_stat` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sql` text NOT NULL, `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; Вот так получается полный лог sql запросов от цмски. Пример работаспособный, буду сам юзать
|
|
|
|
« Последнее редактирование: 30.03.2010, 20:40:46 от Joker »
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #8 : 30.03.2010, 20:43:19 » |
|
обезательный ли запрос на MYSQL 4
SET sql_mode = "MYSQL40" ?? чем черевато его отключение
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #9 : 30.03.2010, 21:20:30 » |
|
Joker, хостер же ругается на число подключений а не сложность и число запросов. Добавь для эксперимента в конце index.php строки отключения от бд  >SET sql_mode = "MYSQL40" переводит базу данных в режим MySQL 4. На что повлияет отключение - проверь, если расширения и система свежие - то будет только лучше.
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #10 : 31.03.2010, 10:02:01 » |
|
пытаюсь все лишнее закешировать, используюв от такую структуру $menu_cache = &mosCache::getCache('mosShowListMenu'); echo $menu_cache->call('mosShowListMenu',$menu_name,intval(mosGetParam($_REQUEST, 'Itemid', 0))); boston, скажи пож-та можно ли кешировать на бесконечно долгое время например на мес, определенные элеементы. например $menu_cache->call - кеширует на месяц а $cache->call - на час, если да то какие атрибуты у &mosCache::getCache('mosShowListMenu')
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #11 : 31.03.2010, 16:51:33 » |
|
function getCache($group = 'default', $handler = 'callback', $storage = null,$cachetime = null, $object = null)
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #12 : 31.03.2010, 16:56:51 » |
|
boston, если не трудно можешь тыкнуть носом. как создать кеш допустим с кешированием на 36000 сек.? $menu_cache = &mosCache::getCache('mosShowListMenu',, $handler = 'callback', $storage = null,$cachetime = '36000' ); echo $menu_cache->call('mosShowListMenu',$menu_name,intval(mosGetParam($_REQUEST, 'Itemid', 0)));
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #13 : 31.03.2010, 20:06:45 » |
|
$cache = mosCache::getCache('mosShowListMenu','function',null,36000);
|
|
|
|
|
Записан
|
|
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #15 : 01.04.2010, 05:56:14 » |
|
boston, а можно ли закешировать значение получаемое из SQL запроса
$database->setQuery('SELECT original, SEF FROM #__jp_pages'); $result = $database->query(); if(! $result) { echo $database->stderr(); exit; } $originalAndSefUrls = $database->loadAssocList();
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #16 : 01.04.2010, 07:30:28 » |
|
$cache = mosCache::getCache('mosShowListMenu','function',null,36000);
если напрямую вот так указывать то выдается варнинг Warning: Invalid argument supplied for foreach() in W:\home\cnd.ru\www\includes\Cache\Lite.php on line 38 означающий код файла Lite.php function Cache_Lite($options = array(null)) { $availableOptions = array('automaticSerialization','fileNameProtection','memoryCaching','onlyMemoryCaching','memoryCachingLimit','cacheDir','caching','lifeTime','fileLocking','writeControl','readControl','readControlType','pearErrorMode'); foreach($options as $key => $value) { if(in_array($key,$availableOptions)) { $property = '_'.$key; $this->$property = $value; } } $this->_refreshTime = time() - $this->_lifeTime; }
что массив пуст, видемо чтото хзабыли передеть
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #17 : 01.04.2010, 13:43:31 » |
|
Joker, не стоит в одну тему собирать совсем разные вопросы.
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #18 : 01.04.2010, 16:12:49 » |
|
boston, jr/ просто нехотел сощдавать топики из одного 2х сообщений. подскажи пожалуйста можно ли удялать не всю кеш? а только отдельное ? например есть 2 кеша $cache1 = mosCache::getCache('mosShowListMenu1','function',null,36000); $cache2 = mosCache::getCache('mosShowListMenu2','function',null,36000);
можно ли по собитию очистить только кеш 2 $cache2 ? если можно то как?
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #19 : 01.04.2010, 16:48:59 » |
|
mosCache::cleanCache('mosShowListMenu2');
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #20 : 02.04.2010, 10:42:53 » |
|
boston, подскажи а все что ты выше написал про кеш, насколько я понимаю речь шла о Joostine 1.3 ? к 1.2 непременима у нее передоваемый аргумент в кеш всего 1н function &getCache($group = '') { global $mosConfig_absolute_path,$mosConfig_caching,$mosConfig_cachepath,$mosConfig_cachetime; require_once ($mosConfig_absolute_path.'/includes/joomla.cache.php'); $options = array('cacheDir' => $mosConfig_cachepath.'/','caching' => $mosConfig_caching,'defaultGroup' => $group,'lifeTime' => $mosConfig_cachetime); $cache = new JCache_Lite_Function($options); return $cache; }
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #21 : 02.04.2010, 11:19:11 » |
|
внес изменения в Joomla.php для Joostina 1.2 строка 352 старый код function &getCache($group = '') { global $mosConfig_absolute_path,$mosConfig_caching,$mosConfig_cachepath,$mosConfig_cachetime; require_once ($mosConfig_absolute_path.'/includes/joomla.cache.php'); $options = array('cacheDir' => $mosConfig_cachepath.'/','caching' => $mosConfig_caching,'defaultGroup' => $group,'lifeTime' => $mosConfig_cachetime); $cache = new JCache_Lite_Function($options); return $cache; }
код был заменен на function &getCache($group = '', $handler = 'callback', $storage = null,$cachetime = null) { global $mosConfig_absolute_path,$mosConfig_caching,$mosConfig_cachepath,$mosConfig_cachetime; require_once ($mosConfig_absolute_path.'/includes/joomla.cache.php');
if(!isset($cachetime)){$cachetime=$mosConfig_cachetime;} if(!isset($storage)) {$storage=$mosConfig_cachepath;} $options = array( 'cacheDir' => $storage.'/', 'caching' => $mosConfig_caching, 'defaultGroup' => $group, 'lifeTime' => $cachetime); $cache = new JCache_Lite_Function($options); return $cache; }
что это дает? 1) возможность изменения времени 2) возможность изменения пути в определенных кешпример : $Vash_region = &mosCache::getCache('Vash_region','function',$mosConfig_cachepath.'/Vash_region',100000); //43200 - сутки $Vash_region->call('Vash_region',intval($my->cityid)); таким образом ф-я Vash_region , будет закеширована в папке $mosConfig_cachepath.'/Vash_region' на 100 000 секунд p.s если я неправ поправте, на лок. машине работает
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #22 : 02.04.2010, 13:05:23 » |
|
 круто! Молодец! Предложи этот хак Dr.Griff для внесения в Joostina 1.2.1
|
|
|
|
|
Записан
|
|
|
|
|
doctorgrif
|
 |
« Ответ #23 : 02.04.2010, 15:00:45 » |
|
 круто! Молодец! Предложи этот хак Dr.Griff для внесения в Joostina 1.2.1 уже  слежу типа 
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #24 : 05.04.2010, 10:32:28 » |
|
с выше упомянутым изменением mosCache::cleanCache('mosShowListMenu2'); - наработало т.к в папке cache данного файла нет а он лежит cache/my_path для этого необходимо передовать аргумент в с именем папки(путь)в вот как было function cleanCache($group = false) { global $mosConfig_caching; if($mosConfig_caching) { $cache = &mosCache::getCache($group); $cache->clean($group); } } вот как стало
function cleanCache($group = false, $storage = null) { global $mosConfig_caching,$mosConfig_cachetime; if(!isset($cachetime)){$cachetime=$mosConfig_cachetime;} if($mosConfig_caching) { $cache = &mosCache::getCache($group, null, $storage,$cachetime); $cache->clean($group); } } } т.о при необходимости обнулить только часть кеши например только 1й ф-и лежащей в папке cache/my_path нужно написать вот так mosCache::cleanCache('имя ф-и','com_my/otziv'); // обнуляем кеш чтобы отзывы появились где com_my/otziv - это путь ОТНОСИТЕЛЬНО каталога Cache
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #25 : 07.04.2010, 12:28:42 » |
|
много ли это ? при выключенных ВСЕМ (т.е выключены все мамботы в CMS Joomla 1.2 и все модули) на главной пустота ни 1й новости 5.1828 _SCRIPT_MEMORY_USING: 20.72 MB Число SQL запросов: 22 главная страница без кеша 15.9315 _SCRIPT_MEMORY_USING: 22.47 MB Число SQL запросов: 50
главная страница с кешем 2.6061 _SCRIPT_MEMORY_USING: 22.46 MB Число SQL запросов: 13
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #26 : 07.04.2010, 13:09:24 » |
|
очень много
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #27 : 07.04.2010, 13:44:32 » |
|
угу -( с чем это может быть связанно ? просто если отрубаю даже все то вот такая нагрузка?-(
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #28 : 07.04.2010, 14:11:53 » |
|
поставил JRE Cache engineс ним упало до Время генерации страницы 0.3599 Использование памяти: 22.21 MB Число SQL запросов: 9 но по памяти мне кажется всравно много
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #29 : 07.04.2010, 17:46:35 » |
|
нашел в чем проблем - SEF а точнее JPromoter, разачоровался в компоненте -(((, сайт за пару лет разросса и стало в таблице jp_page порядка 20K так как раз она весит порядка 16МБ в БД и все эти 16 МБ он при выводе сует в ОЗУ хостера. т.к с включенным SEF сайт жрет Время генерации страницы 1.0297 Использование памяти: 21.21 MB Число SQL запросов: 8
с выключенным
Время генерации страницы 1.0297 Использование памяти: 6.81 MB Число SQL запросов: 8
как можно оптимизировать? может идеи у кого есть ?
Boston, дай совет в каком направление копать?
|
|
|
|
|
Записан
|
|
|
|
Vladzimir
Давно я тут
  
Репутация: +22/-0
Offline
Пол: 
Сообщений: 334
В очередь! в очередь! День Сурка © М.Борзыкин
|
 |
« Ответ #30 : 07.04.2010, 18:30:10 » |
|
Промотер пишет в базу кучу несуществующих страниц, типа строк несуществующих уязвимостей, ссылок опенстат или Google, ссылок активации аккаунта. Самый простой, просто дропни таблицу а потом пройдись каким нибудь сканером который создает карту сайта.
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #31 : 07.04.2010, 19:17:54 » |
|
не, это я чишу. 20K чистых ссылок у меня
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #32 : 07.04.2010, 19:19:37 » |
|
Vladzimir, сам понаблюдай. он вроде все что в БД в ОЗУ пихает, завтра буду искать где это он делает и как это оптимизировать можно ХЗ пока что
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #33 : 08.04.2010, 08:26:35 » |
|
в конце файла index.php шаблона добавил удаление переменной ( $originalAndSefUrls) где хранятся все SEF ссылки unset($originalAndSefUrls);
Исполльзование ОЗУ падает в 2,3 раза
|
|
|
|
|
Записан
|
|
|
|
Joker
Давно я тут
  
Репутация: +3/-0
Offline
Пол: 
Сообщений: 383
|
 |
« Ответ #34 : 18.04.2010, 15:39:33 » |
|
прошу совета: залил на поддомен test. cnd. su чистую Joostina 1.2. при первом обращение к главной странице 1.2725 Использовано памяти: 6.73 MB SQL запросов: 36 при повторном 0.337 Использовано памяти: 6.73 MB SQL запросов: 36 ни большое ли время генерации страницы при первом обращение?
|
|
|
|
|
Записан
|
|
|
|
|
boston
|
 |
« Ответ #35 : 19.04.2010, 18:17:24 » |
|
Ну лучше канечно если время меньеш 1 секунды. Но зависит много от сложности генерации всего страницы.
|
|
|
|
|
Записан
|
|
|
|
|