Добрый день.
Прошу помощи у гуру программистов, так как у самого уже не хватает знаний что бы оптимизировать скрипт.
В целом логика скрипта следующая: есть интернет-витрина, в котором на данный момент представлено порядка 31,197 активных на данный момент товаров. И есть 20 точек в которых данные товары продаются, но как вы понимаете товар может находиться не во всех этих точках а только в некоторых, и было принять решение используя функционал движка атрибуты реализовать показ товаров в конкретном магазине.
Пример того что в итоге получается здесь: http://postelka.tomsk.ru/tekstil/postelnoe-bele-komplekty (слева атрибут наличие - магазин)
Скрипт после своего завершения дает примерно 196,305 записей в таблице атрибутов.
Среднее время выполнение скрипта 2-3 часа по крону, делается ночью, что бы не кому не мешать.
Проблема в том что до внедрения этого функционала с атрибутами, данный скрипт отрабатывал за 20 минут и писал в каждый товар сколько товара на каком складе находится, пример тут: http://postelka.tomsk.ru/tekstil/postelnoe-bele-komplekty/komplekt-postelnogo-belya-15-spalnyy-om-feya
По всей видимости когда дописывал где-то перемудрил и он делает много лишнего раз так существенно возросло время исполнения.
Если есть идеи или советы по оптимизации кода прошу помощи.
Изначальное авторство кода не мое, за основу в самом начале был взят код costas'а с одноименного модуля CSVPrice
Позже все переросло вот в такое:
Код:
<?php
class ModelModuleCSVPrice extends Model {
private $CSV_SEPARATOR = ';';
private $CSV_ENCLOSURE = '"';
private $data = array();
public function update() {
$this->db->query("UPDATE `".DB_PREFIX."setting` SET value='1' WHERE `group` LIKE 'config' AND `key` LIKE 'config_maintenance'");
$this->db->query("DELETE FROM `".DB_PREFIX."product_to_sklad`");
$this->db->query("ALTER TABLE `".DB_PREFIX."product_to_sklad` AUTO_INCREMENT=0");
$this->db->query("DELETE FROM `".DB_PREFIX."product_special`");
$this->db->query("ALTER TABLE `".DB_PREFIX."product_special` AUTO_INCREMENT=0");
$this->db->query("UPDATE `".DB_PREFIX."product` SET stock_status_id=5 WHERE stock_status_id=6 OR stock_status_id=8 OR stock_status_id=7 OR stock_status_id=0 OR stock_status_id=9");
$this->db->query("UPDATE `".DB_PREFIX."product` SET cost=0,price=0,opt=0,rozn=0,optsp=0,quantity=0,status=0 WHERE stock_status_id=5 OR stock_status_id=6 OR stock_status_id=8 OR stock_status_id=7 OR stock_status_id=0 OR stock_status_id=9");
$this->db->query("DELETE FROM `".DB_PREFIX."product_attribute` WHERE `attribute_id`=177");
if (($handle = fopen("/var/www/postelka/data/www/postelka.tomsk.ru/import/td.csv", "r")) !== FALSE) {
$row = 0;
while (($data = fgetcsv($handle, 1000, $this->CSV_SEPARATOR, $this->CSV_ENCLOSURE)) !== FALSE) {
$num = count($data);
$row++;
$item = array();
$akciya= "";
for ($c=0; $c < $num; $c++) {
$item[] = $data[$c];
}
$quantity = $item[4];
$rezerv = $item[5];
$counts = $quantity-$rezerv;
if ($counts>0) {
$model = $item[0];
$price = $item[3]; // Опт1 = 2 ; Розница = 3
$opt = $item[1];
$rozn = $item[3];
$optsp = $opt*0.05+$opt;
$imagaz = $rozn;
$price = round($price,2);
$opt = round($opt,2);
$imagaz = round($imagaz,0);
$optsp = round($optsp,0);
$sklad_num = $item[7];
$tega = $item[6];
$tega = iconv("CP1251", "UTF-8", $tega);
if ($tega=='1') {$procent=0.1;}
elseif ($tega=='2') {$procent=0.2;}
elseif ($tega=='3') {$procent=0.3;}
elseif ($tega=='4') {$procent=0.4;}
elseif ($tega=='5') {$procent=0.5;}
elseif ($tega=='6') {$procent=0.6;}
elseif ($tega=='7') {$procent=0.7;}
elseif ($tega=='8') {$procent=0.0;}
elseif ($tega=='9') {$procent=0.15;}
elseif ($tega=='0') {$procent=0.25;}
elseif ($tega=='ц') {$procent=0.0;}
elseif ($tega=='А') {$procent=0.0;}
//elseif ($tega=='е') {
//if ($sklad_num=='145') {$procent=0.20;}
//else {$procent=0.0;}
//}
//elseif ($tega=='ъ') {
//if ($sklad_num=='48') {$procent=0.10;}
//else {$procent=0.0;}
//}
else { $procent=0.0; }
$product_id = $this->db->query("SELECT product_id as product_id1 FROM `".DB_PREFIX."product` WHERE model='".$model."'");
$product_id = $product_id->row['product_id1'];
if ($product_id) {
$text_attribute = $this->db->query("SELECT text as text_attribute FROM `".DB_PREFIX."product_attribute` WHERE `attribute_id`=177 AND `product_id`='".$product_id."'");
$text_attribute = $text_attribute->row['text_attribute'];
if ($text_attribute) {
if ($sklad_num=='41') { $name_sklad='пр. Фрунзе, 77б - Альбом'; }
elseif ($sklad_num=='141') { $name_sklad='Асино - ул. Станционная, 40/1'; }
elseif ($sklad_num=='111') { $name_sklad='ул. Дальне-Ключевская, 6'; }
elseif ($sklad_num=='43') { $name_sklad='пр. Мира, 21в'; }
elseif ($sklad_num=='48') { $name_sklad='ул. Красноармейская, 122'; }
elseif ($sklad_num=='136') { $name_sklad='ул. Иркутский тракт, 110'; }
elseif ($sklad_num=='79') { $name_sklad='ул. Киевская, 76 (Посуда)'; }
elseif ($sklad_num=='46') { $name_sklad='ул. Иркутский тракт, 142/3'; }
elseif ($sklad_num=='145') { $name_sklad='пр. Ленина, 200'; }
elseif ($sklad_num=='125') { $name_sklad='ул. Нахимова, 15'; }
elseif ($sklad_num=='93') { $name_sklad='пер. Мариинский, 4'; }
elseif ($sklad_num=='83') { $name_sklad='пр. Фрунзе, 24 - Марка'; }
elseif ($sklad_num=='94') { $name_sklad='пр. Мира, 72а'; }
elseif ($sklad_num=='134') { $name_sklad='ул. Новосибирская, 6'; }
elseif ($sklad_num=='35') { $name_sklad='ул. Киевская, 76 (Одежда)'; }
elseif ($sklad_num=='57') { $name_sklad='ул. Иркутский тракт, 76'; }
elseif ($sklad_num=='143') { $name_sklad='Северск - пр. Коммунистический, 120'; }
elseif ($sklad_num=='180') { $name_sklad='ул. Елизаровых, 22'; }
elseif ($sklad_num=='176') { $name_sklad='ул. Междугородная, 28'; }
elseif ($sklad_num=='98') { $name_sklad='Товар в дороге'; }
elseif ($sklad_num=='26') { $name_sklad='Оптовый склад'; }
elseif ($sklad_num=='114') { $name_sklad='ул. Богдана Хмельницкого, 43';
} else {
}
//if ($sklad_num!='26') {
$this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET text=CONCAT(text,';".$name_sklad."') WHERE `attribute_id`=177 AND `product_id`='".$product_id."'");
//} else {
//}
} else {
if ($sklad_num=='41') { $name_sklad='пр. Фрунзе, 77б - Альбом'; }
elseif ($sklad_num=='141') { $name_sklad='Асино - ул. Станционная, 40/1'; }
elseif ($sklad_num=='111') { $name_sklad='ул. Дальне-Ключевская, 6'; }
elseif ($sklad_num=='43') { $name_sklad='пр. Мира, 21в'; }
elseif ($sklad_num=='48') { $name_sklad='ул. Красноармейская, 122'; }
elseif ($sklad_num=='136') { $name_sklad='ул. Иркутский тракт, 110'; }
elseif ($sklad_num=='79') { $name_sklad='ул. Киевская, 76 (Посуда)'; }
elseif ($sklad_num=='46') { $name_sklad='ул. Иркутский тракт, 142/3'; }
elseif ($sklad_num=='145') { $name_sklad='пр. Ленина, 200'; }
elseif ($sklad_num=='125') { $name_sklad='ул. Нахимова, 15'; }
elseif ($sklad_num=='93') { $name_sklad='пер. Мариинский, 4'; }
elseif ($sklad_num=='83') { $name_sklad='пр. Фрунзе, 24 - Марка'; }
elseif ($sklad_num=='94') { $name_sklad='пр. Мира, 72а'; }
elseif ($sklad_num=='134') { $name_sklad='ул. Новосибирская, 6'; }
elseif ($sklad_num=='35') { $name_sklad='ул. Киевская, 76 (Одежда)'; }
elseif ($sklad_num=='57') { $name_sklad='ул. Иркутский тракт, 76'; }
elseif ($sklad_num=='143') { $name_sklad='Северск - пр. Коммунистический, 120'; }
elseif ($sklad_num=='180') { $name_sklad='ул. Елизаровых, 22'; }
elseif ($sklad_num=='176') { $name_sklad='ул. Междугородная, 28'; }
elseif ($sklad_num=='98') { $name_sklad='Товар в дороге'; }
elseif ($sklad_num=='26') { $name_sklad='Оптовый склад'; }
elseif ($sklad_num=='114') { $name_sklad='ул. Богдана Хмельницкого, 43';
} else {
}
//if ($sklad_num!='26') {
$this->db->query("INSERT INTO `".DB_PREFIX."product_attribute` (`product_id`,`attribute_id`,`language_id`,`text`) VALUES ($product_id,177,1,'$name_sklad')");
//} else {
//}
}
}
if ($procent>0) {
$akciya=$rozn-$rozn*$procent;
$akciya=round($akciya,0);
$imagaz=$akciya;
if ($optsp>$akciya) { $optsp=$akciya; }
$this->db->query("INSERT INTO ".DB_PREFIX."product_to_sklad (product_id,sklad_id,count,opt,imagaz,rozn,zakup,optsp) VALUES ('".(int)$model."','".$sklad_num."','".$counts."','".$opt."','".$imagaz."','".$akciya."','0','".$optsp."')");
} else {
if ($tega=='ц' OR $tega=='А') {
$imagaz = $rozn;
} else{
$imagaz = $rozn-($rozn*0.15);
$imagaz = round($imagaz,0);
}
if ($optsp>$rozn) { $optsp=$rozn; }
$this->db->query("INSERT INTO ".DB_PREFIX."product_to_sklad (product_id,sklad_id,count,opt,imagaz,rozn,zakup,optsp) VALUES ('".(int)$model."','".$sklad_num."','".$counts."','".$opt."','".$imagaz."','".$rozn."','0','".$optsp."')");
}
if ($procent=="0" OR $akciya==$price) {
$this->db->query("UPDATE ".DB_PREFIX."product SET price='".$price."', quantity=`quantity`+".(int)$counts." , cost='0', opt='".$opt."', optsp='".$optsp."', rozn='".$rozn."', status='1', date_modified=NOW() WHERE `stock_status_id`=5 AND model='" .(int)$model. "'");
} else {
$this->db->query("UPDATE ".DB_PREFIX."product SET price='".$price."', quantity=`quantity`+".(int)$counts." , cost='0', opt='".$opt."', optsp='".$optsp."', rozn='".$rozn."', status='1', date_modified=NOW() WHERE `stock_status_id`=5 AND model='" .(int)$model. "'");
if ($tega=='е' OR $tega=='ъ') { /*}
elseif ($tega=='н') {
if ($sklad_num=='48') {
} else {
$product_id = $this->db->query("SELECT product_id as product_id1 FROM `".DB_PREFIX."product` WHERE model='".$model."'");
$product_id = $product_id->row['product_id1'];
if ($product_id) {
$product_special_price = $this->db->query("SELECT MIN(price) as product_special_price1 FROM `".DB_PREFIX."product_special` WHERE product_id='".$product_id."'");
$product_special_price = $product_special_price->row['product_special_price1'];
if ($product_special_price!=NULL OR $product_special_price>0) {
if ($product_special_price>$akciya) {
$this->db->query("INSERT INTO `".DB_PREFIX."product_special` (`product_special_id`,`product_id`,`customer_group_id`,`priority`,`price`,`date_start`,`date_end`) VALUES (NULL,$product_id,8,1,$akciya,0000-00-00,0000-00-00)");
} else {
}
} else {
$this->db->query("INSERT INTO `".DB_PREFIX."product_special` (`product_special_id`,`product_id`,`customer_group_id`,`priority`,`price`,`date_start`,`date_end`) VALUES (NULL,$product_id,8,1,$akciya,0000-00-00,0000-00-00)");
}
}
}*/
} else {
if ($product_id) {
$product_special_price = $this->db->query("SELECT MIN(price) as product_special_price1 FROM `".DB_PREFIX."product_special` WHERE product_id='".$product_id."'");
$product_special_price = $product_special_price->row['product_special_price1'];
if ($product_special_price!=NULL OR $product_special_price>0) {
if ($product_special_price>$akciya) {
$this->db->query("INSERT INTO `".DB_PREFIX."product_special` (`product_special_id`,`product_id`,`customer_group_id`,`priority`,`price`,`date_start`,`date_end`) VALUES (NULL,$product_id,8,1,$akciya,0000-00-00,0000-00-00)");
} else {
}
} else {
$this->db->query("INSERT INTO `".DB_PREFIX."product_special` (`product_special_id`,`product_id`,`customer_group_id`,`priority`,`price`,`date_start`,`date_end`) VALUES (NULL,$product_id,8,1,$akciya,0000-00-00,0000-00-00)");
}
}
}
}
}
unset($item);
}
fclose($handle);
}
$this->db->query("UPDATE `".DB_PREFIX."setting` SET value='0' WHERE `group` LIKE 'config' AND `key` LIKE 'config_maintenance'");
}
}
?>