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

Статус
В этой теме нельзя размещать новые ответы.

buratino

Постоялец
Регистрация
9 Мар 2007
Сообщения
59
Реакции
41
Так как вся информация о товарах хранится в БД магазина, его работа "нагружает" 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);


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

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
 
Создадим директорию 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 KB · Просмотры: 83
Прошу прощения, это для WebAsyst Shop-Script или для Shop-Script Premium?
 
Для Shop-Script Premium
 
А как можно оптмизировать WebAsyst S-S?
тебя забанить пора уже, в тему соответствующую писать надо.
поясню для тех кто в танке: здесь про Shop-Script, а с WebAsyst создавай отдельную тему и флуди там! :mad:
 
require_once('Cache/Lite.php');
нужно заменить на
require_once('cache/lite.php');
 
require_once('Cache/Lite.php');
нужно заменить на
require_once('cache/lite.php');

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

Добавлено через 7 минут
Прошу прощения, это для WebAsyst Shop-Script или для Shop-Script Premium?

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

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

Для нас это слишком жирно.
 
Кеширование на PEAR - хорошая штука, спасибо! Провел все эти операции у себя, небольшое ускорение поимел. Но медленнее всего в SS работают опции товаров.
 
  • Заблокирован
  • #9
Все эти забавы с кэшем хороши если у Вас небольшой магазин.
Если же будет кэшироваться шоп с 50.000 товаров - то будет вешалка та ещё. Создастся неимоверно большое количество файлов закэшированных страниц. В таком случае может помочь только скрипт автоматического удаления просроченных страниц в кэше.
 
Все эти забавы с кэшем хороши если у Вас небольшой магазин.
Если же будет кэшироваться шоп с 50.000 товаров - то будет вешалка та ещё. Создастся неимоверно большое количество файлов закэшированных страниц. В таком случае может помочь только скрипт автоматического удаления просроченных страниц в кэше.
ты когда пишешь, ты читаешь О ЧЕМ ты написал?
при чем тут количество товара в магазине?
в выложенном примере кешируется не товар, а категории! :mad:
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху