Оптимизация Shop-Script

Тема в разделе "Shop-script", создана пользователем buratino, 18 апр 2009.

Статус темы:
Закрыта.
Модераторы: kadurinho
  1. buratino

    buratino Постоялец

    Регистр.:
    9 мар 2007
    Сообщения:
    59
    Симпатии:
    39
    Так как вся информация о товарах хранится в БД магазина, его работа "нагружает" MySQL сервер. В некоторых конфигурациях, снизить нагрузку помогают дополнительные индексные файлы которые можно создать следующими запросами в PHPMyAdmin

    Код:
    ALTER TABLE `SS_product_options_set` ADD INDEX ( `productID` );
    ALTER TABLE `SS_product_options_set` ADD INDEX ( `optionID` );
    ALTER TABLE `SS_product_options_set` ADD INDEX ( `variantID` );
    ALTER TABLE `SS_product_options_values` ADD INDEX ( `productID` );
    ALTER TABLE `SS_product_options_values` ADD INDEX ( `optionID` );
    ALTER TABLE `SS_product_options_values` ADD INDEX ( `variantID` );
    ALTER TABLE `SS_product_options` ADD INDEX ( `name` );
    ALTER TABLE `SS_products` ADD INDEX ( `name` ); 
    ALTER TABLE `SS_products` ADD INDEX ( `product_code` );
    ALTER TABLE `SS_products_opt_val_variants` ADD INDEX ( `optionID` );
    Также, иногда нагрузка на сервер БД снижается при переходе магазина на постоянное (persistent) соединение с ним. Для этого в коде файла /includes/database/mysql.php надо найти строку -
    Код:
    $r = mysql_connect($host,$user,$pass);
    и заменить на - 
    $r = mysql_pconnect($host,$user,$pass);

    Отключаем счетчик просмотра информации по товару. Для этого в файле /includes/product_detailed.php закомментариваем строчки:
    Код:
    if ( !isset($_GET["vote"]) )
          IncrementProductViewedTimes($productID);
    Отключаем счетчик просмотра категорий. Для этого в файле /includes/category.php надо закомментировать строчку:
    Код:
    IncrementCategoryViewedTimes($categoryID);

    Вот это все отсюда, мона почитать

    Перейти по ссылке
    Перейти по ссылке
    Перейти по ссылке
     
    SADUKEY и golesa нравится это.
  2. buratino

    buratino Постоялец

    Регистр.:
    9 мар 2007
    Сообщения:
    59
    Симпатии:
    39
    Создадим директорию cache и разрешим скрипту туда запись. Если директория в корне сайта, лучше в нее добавить файлик .htaccess со строчкой ‘Deny from all’.

    В начало index.php добавим подключение класса Cache_Lite и создание экземпляра класса. Получилось вот так:

    Код:
    $cache_options = array(
      'cacheDir'=>$_SERVER['DOCUMENT_ROOT'] . '/cache/',
      'lifeTime'=>86400);
    $cache_categories_id = 'category';
    require_once('cache/lite.php');
     
    $CacheLite = new Cache_Lite($cache_options);
    А код к БД на выборку на такой:

    Код:
    //load all categories to array $cats to avoid multiple DB queries
    //(frequently used in future - but not always!)
     
     if ($cats_str = $CacheLite->get($cache_categories_id))
     {
       $cats=unserialize($cats_str);
     }
     else
     {
       $cats = array();
       $i=0;
       $q = db_query("SELECT categoryID, name, parent,
                     products_count, description, picture
                     FROM ".
                     CATEGORIES_TABLE."
                     where categoryID<>0
                     ORDER BY sort_order, name")
           or die (db_error());
     
       while ($row = db_fetch_row($q))
       {
         $cats[$i++] = $row;
       }
       $CacheLite->save(serialize($cats), $cache_categories_id);
     }
    ну в общем верхняя часть index.php который в корне сайта
    Код:
    <?php
    session_start();
    
    $DebugMode = false;
    //core file
    $cache_options = array(
      'cacheDir'=>$_SERVER['DOCUMENT_ROOT'] . '/cache/',
      'lifeTime'=>86400);
    $cache_categories_id = 'category';
    require_once('cache/lite.php');
     
    $CacheLite = new Cache_Lite($cache_options);
    // -------------------------INITIALIZATION-----------------------------//
    	//include core files
    	include("./cfg/connect.inc.php");
    	include("./includes/database/".DBMS.".php");
    	include("./cfg/language_list.php");
    	include("./core_functions/functions.php");
    	include("./core_functions/category_functions.php");
    	include("./core_functions/cart_functions.php");
    	include("./core_functions/product_functions.php");
    	include("./core_functions/statistic_functions.php");
    	include("./core_functions/reg_fields_functions.php" );
    	include("./core_functions/registration_functions.php" );
    	include("./core_functions/country_functions.php" );
    	include("./core_functions/zone_functions.php" );
    	include("./core_functions/datetime_functions.php" );
    	include("./core_functions/order_status_functions.php" );
    	include("./core_functions/order_functions.php" );
    	include("./core_functions/aux_pages_functions.php" );
    	include("./core_functions/picture_functions.php" ); 
    	include("./core_functions/configurator_functions.php" );
    	include("./core_functions/option_functions.php" );
    	include("./core_functions/search_function.php" );
    	include("./core_functions/discount_functions.php" ); 
    	include("./core_functions/custgroup_functions.php" ); 
    	include("./core_functions/shipping_functions.php" );
    	include("./core_functions/payment_functions.php" );
    	include("./core_functions/tax_function.php" ); 
    	include("./core_functions/currency_functions.php" );
    	include("./core_functions/module_function.php" );
    	include("./core_functions/crypto/crypto_functions.php");
    	include("./core_functions/quick_order_function.php" ); 
    	include("./core_functions/setting_functions.php" );
    	include("./core_functions/subscribers_functions.php" );
    	include("./core_functions/version_function.php" );
    	include("./core_functions/discussion_functions.php" );
    	include("./core_functions/order_amount_functions.php" ); 
    	include("./core_functions/linkexchange_functions.php" ); 
    	include("./core_functions/affiliate_functions.php" );
    
    	include('./classes/xml2array.php');
    	include('./classes/class.virtual.shippingratecalculator.php');
    	include('./classes/class.virtual.paymentmodule.php');
    
    	include('./classes/class.virtual.smsmail.php');
    	include('./modules/smsmail/class.smsnotify.php');
    
    
    	MagicQuotesRuntimeSetting();
    
    	//init Smarty
    	require 'smarty/smarty.class.php'; 
    	$smarty = new Smarty; //core smarty object
    	$smarty_mail = new Smarty; //for e-mails
    
    	//select a new language?
    	if (isset($_POST["lang"]))
    		$_SESSION["current_language"] = $_POST["lang"];
    
    	//current language session variable
    	if (!isset($_SESSION["current_language"]) ||
    		$_SESSION["current_language"] < 0 || $_SESSION["current_language"] > count($lang_list))
    			$_SESSION["current_language"] = 0; //set default language
    	//include a language file
    	if (isset($lang_list[$_SESSION["current_language"]]) &&
    		file_exists("languages/".$lang_list[$_SESSION["current_language"]]->filename))
    	{
    		//include current language file
    		include("languages/".$lang_list[$_SESSION["current_language"]]->filename);
    	}
    	else
    	{
    		die("<font color=red><b>ERROR: Couldn't find language file!</b></font>");
    	}
    
    	//connect to the database
    	db_connect(DB_HOST,DB_USER,DB_PASS) or die (db_error());
    	db_select_db(DB_NAME) or die (db_error());
    
    	settingDefineConstants();
    
    	if ((int)CONF_SMARTY_FORCE_COMPILE) //this forces Smarty to recompile templates each time someone runs index.php
    	{
    		$smarty->force_compile = false;
    		$smarty_mail->force_compile = false;
    	}
    
    	//authorized access check
    	include("./checklogin.php");
    
    	//# of selected currency
    	$current_currency = isset($_SESSION["current_currency"]) ? $_SESSION["current_currency"] : CONF_DEFAULT_CURRENCY;
    	$smarty->assign("current_currency", $current_currency);
    	$q = db_query("select code, currency_value, where2show, currency_iso_3, Name from ".CURRENCY_TYPES_TABLE." where CID='$current_currency'") or die (db_error());
    	if ($row = db_fetch_row($q))
    	{
    		$smarty->assign("currency_name", $row[0]);
    		$selected_currency_details = $row; //for show_price() function
    	}
    	else //no currency found. In this case check is there any currency type in the database
    	{
    		$q = db_query("select code, currency_value, where2show from ".CURRENCY_TYPES_TABLE) or die (db_error());
    		if ($row = db_fetch_row($q))
    		{
    			$smarty->assign("currency_name", $row[0]);
    			$selected_currency_details = $row; //for show_price() function
    		}
    	}
    /**------- после добавления кеша категорий
    	//load all categories to array $cats to avoid multiple DB queries (frequently used in future - but not always!)
    	$cats = array();
    	$i=0;
    	$q = db_query("SELECT categoryID, name, parent, products_count, description, picture FROM ".
    			CATEGORIES_TABLE." where categoryID<>0 ORDER BY sort_order, name") or die (db_error());	
    	while ($row = db_fetch_row($q))
    	{
    		$cats[$i++] = $row;
    	}
    ---- end goosev ------ **/
    /**  добавление кеша кат   **/
    if ($cats_str = $CacheLite->get($cache_categories_id))
     {
       $cats=unserialize($cats_str);
     }
     else
     {
       $cats = array();
       $i=0;
       $q = db_query("SELECT categoryID, name, parent,
                     products_count, description, picture
                     FROM ".
                     CATEGORIES_TABLE."
                     where categoryID<>0
                     ORDER BY sort_order, name")
           or die (db_error());
     
       while ($row = db_fetch_row($q))
       {
         $cats[$i++] = $row;
       }
       $CacheLite->save(serialize($cats), $cache_categories_id);
     }
    
    /**  end добавление кеша кат   **/
    
    ну тут пошла остальная х она уже не важно
    
    
    Из архива папку выньте и в корень как есть засуньте, категории будут кешироваться на сутки

    У меня в магазине все это работает и ускоряет % на 50-70
    источник: Перейти по ссылке
     

    Вложения:

    • cache.rar
      Размер файла:
      4,1 КБ
      Просмотров:
      80
    SADUKEY, Oxanita, UDAV и 9 другим нравится это.
  3. Voshal

    Voshal Мизантроп

    Регистр.:
    30 мар 2009
    Сообщения:
    286
    Симпатии:
    108
    Прошу прощения, это для WebAsyst Shop-Script или для Shop-Script Premium?
     
  4. sounde

    sounde

    Регистр.:
    12 сен 2008
    Сообщения:
    391
    Симпатии:
    64
    Для Shop-Script Premium
     
  5. Welho®

    Welho® Предвестник пьянки

    Регистр.:
    4 дек 2007
    Сообщения:
    855
    Симпатии:
    331
    тебя забанить пора уже, в тему соответствующую писать надо.
    поясню для тех кто в танке: здесь про Shop-Script, а с WebAsyst создавай отдельную тему и флуди там! :mad:
     
  6. FLINT

    FLINT А пофлудить?о_О

    Регистр.:
    23 июл 2007
    Сообщения:
    429
    Симпатии:
    176
    require_once('Cache/Lite.php');
    нужно заменить на
    require_once('cache/lite.php');
     
  7. buratino

    buratino Постоялец

    Регистр.:
    9 мар 2007
    Сообщения:
    59
    Симпатии:
    39
    Да, спасибо, мой косяк, че то я в одном месте переименовал а в другом оставил....
    Получилось как проверка на сообразительность... если файл называеться с маленькой буквы то разумееться в коде тоже. В Unix это различные файлы.

    Добавлено через 7 минут
    Я вообще не советую связываться с WebAsyst Shop-Script, он конечно хороший и надёжный но в нем черт ногу сломит и там сам Shop-Script, те сам магазин устанавливаться как модуль, в оболочку WebAsyst, и тяжесть соответственно ох...ная. На хорошем хостинге еле шевелиться.

    WebAsyst - это корпоративное приложение. соответственно планируеться, что его люди будут ставить на свой сервер.

    Для нас это слишком жирно.
     
  8. Alinaki

    Alinaki Прохожие

    Кеширование на PEAR - хорошая штука, спасибо! Провел все эти операции у себя, небольшое ускорение поимел. Но медленнее всего в SS работают опции товаров.
     
  9. madcap

    madcap Постоялец

    Заблокирован
    Регистр.:
    17 сен 2006
    Сообщения:
    147
    Симпатии:
    26
    Все эти забавы с кэшем хороши если у Вас небольшой магазин.
    Если же будет кэшироваться шоп с 50.000 товаров - то будет вешалка та ещё. Создастся неимоверно большое количество файлов закэшированных страниц. В таком случае может помочь только скрипт автоматического удаления просроченных страниц в кэше.
     
  10. Welho®

    Welho® Предвестник пьянки

    Регистр.:
    4 дек 2007
    Сообщения:
    855
    Симпатии:
    331
    ты когда пишешь, ты читаешь О ЧЕМ ты написал?
    при чем тут количество товара в магазине?
    в выложенном примере кешируется не товар, а категории! :mad:
     
Статус темы:
Закрыта.