enix

Добавление в атрибуты точки продаж конкретного товара

Рекомендуемые сообщения

enix    1

Добрый день.

Прошу помощи у гуру программистов, так как у самого уже не хватает знаний что бы оптимизировать скрипт.

 

В целом логика скрипта следующая: есть интернет-витрина, в котором на данный момент представлено порядка 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'");
		
	}
}
?>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
toporchillo    425

1. Очистка таблиц делается SQL-запросом TRUNCATE TABLE (он и очищает, и автоинкремент обнуляет)

 

2. INSERT INTO ... заменяем на INSERT DELAYED INTO

 

3. Чтение из CSV надо не по одной строке, а с буфером в 100-1000 строк

 

Ну и это, почитайте про ассоциативные массивы

 

Вот это, в нескольких местах:

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'; }
...

ну очень сложно читать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу