LiveInternetMail.ru
Форум русской поддержки Joomla!® CMS
25.05.2012, 15:49:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 1.7 FAQ Joomla 1.5 FAQ Joomla 1.0 FAQ Правила форума Новости Joomla Войти Регистрация Помощь  
Страниц: 1 2 [Все]   Вниз
  Добавить закладку  |  Печать  
Автор Тема: Превышение кол-ва подклюбчений  (Прочитано 2976 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Joker
Давно я тут
****

Репутация: +3/-0
Offline 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 запросов, т.е у него нет логов по которым можно это отследить  Angry
Записан
boston
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #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 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
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #3 : 25.03.2010, 18:28:10 »

Явных ошибок в коде не вижу
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 383



« Ответ #4 : 25.03.2010, 18:33:38 »

n/t такая структура не должна преводить к перегрузке ?
Записан
boston
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #5 : 25.03.2010, 19:16:11 »

Нет, не должна.
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline 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 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 .

 Smiley в общем файл найти не проблема
Там есть функция 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 Offline

Пол: Мужской
Сообщений: 383



« Ответ #8 : 30.03.2010, 20:43:19 »

обезательный ли запрос на MYSQL 4

SET sql_mode = "MYSQL40" ?? чем черевато его отключение
Записан
boston
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #9 : 30.03.2010, 21:20:30 »

Joker, хостер же ругается на число подключений а не сложность и число запросов.
Добавь для эксперимента в конце index.php строки отключения от бд Azn

>SET sql_mode = "MYSQL40"
переводит базу данных  в режим MySQL 4. На что повлияет отключение - проверь, если расширения и система свежие - то будет только лучше.
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline 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
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #11 : 31.03.2010, 16:51:33 »

function getCache($group = 'default', $handler = 'callback', $storage = null,$cachetime = null, $object = null)
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline 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
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #13 : 31.03.2010, 20:06:45 »

$cache = mosCache::getCache('mosShowListMenu','function',null,36000);
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 383



« Ответ #14 : 31.03.2010, 20:10:46 »

boston, с меня пиво   drink Roll Eyes
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline 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 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
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #17 : 01.04.2010, 13:43:31 »

Joker, не стоит в одну тему собирать совсем разные вопросы.
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline 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
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #19 : 01.04.2010, 16:48:59 »

mosCache::cleanCache('mosShowListMenu2');
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline 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 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
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #22 : 02.04.2010, 13:05:23 »

 Cool круто! Молодец!

Предложи этот хак Dr.Griff для внесения в Joostina 1.2.1
Записан
doctorgrif
Живу я здесь
******

Репутация: +80/-1
Offline Offline

Пол: Мужской
Сообщений: 1304


Нудный доктор


« Ответ #23 : 02.04.2010, 15:00:45 »

Cool круто! Молодец!

Предложи этот хак Dr.Griff для внесения в Joostina 1.2.1
уже Azn
слежу типа Wink
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline 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 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
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #26 : 07.04.2010, 13:09:24 »

очень много
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 383



« Ответ #27 : 07.04.2010, 13:44:32 »

угу -( с чем это может быть связанно ?
просто если отрубаю даже все то вот такая нагрузка?-(
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 383



« Ответ #28 : 07.04.2010, 14:11:53 »

поставил JRE Cache engine
с ним
упало  до

Код:
Время генерации страницы 0.3599
Использование памяти: 22.21 MB
Число SQL запросов: 9

но по памяти мне кажется всравно много
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline 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 Offline

Пол: Мужской
Сообщений: 334


В очередь! в очередь! День Сурка © М.Борзыкин


« Ответ #30 : 07.04.2010, 18:30:10 »

Промотер пишет в базу кучу несуществующих страниц, типа строк несуществующих уязвимостей, ссылок опенстат или Google, ссылок активации аккаунта. Самый простой, просто дропни таблицу а потом пройдись каким нибудь сканером который создает карту сайта.
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 383



« Ответ #31 : 07.04.2010, 19:17:54 »

не, это я чишу. 20K чистых ссылок у меня
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 383



« Ответ #32 : 07.04.2010, 19:19:37 »

Vladzimir, сам понаблюдай. он вроде все что в БД в ОЗУ пихает, завтра буду искать где это он делает и как это оптимизировать можно ХЗ пока что
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 383



« Ответ #33 : 08.04.2010, 08:26:35 »

в конце файла index.php шаблона добавил удаление переменной ($originalAndSefUrls) где хранятся все SEF ссылки
Код:
unset($originalAndSefUrls); 
Исполльзование ОЗУ падает в 2,3 раза
Записан
Joker
Давно я тут
****

Репутация: +3/-0
Offline 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
Moderator
*****

Репутация: +222/-3
Offline Offline

Пол: Мужской
Сообщений: 2699



« Ответ #35 : 19.04.2010, 18:17:24 »

Ну лучше канечно если время меньеш 1 секунды. Но зависит много от сложности генерации всего страницы.
Записан
Страниц: 1 2 [Все]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Рейтинг@Mail.ru Rambler Top100 Powered by SMF 1.1.16 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet