Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

halfhope

Користувачі
  
  • Публікації

    1 750
  • З нами

  • Відвідування

Повідомлення, опубліковані користувачем halfhope

  1. Здравствуйте! Поддерживает ли модуль резиновый дизайн?

     

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

  2. А можно сделать так чтобы Превьюшка и Большое изображения были разными ?

    Например - превьюшка - фото или логотип клиента

    Большое разворачивалось, а там кейс (развернутые отзыв в виде картинки)

    ?

     

    Добрый вечер. Нет, нельзя.

  3. Обновил до версии 1.3

    1. Добавлена совместимость LazyLoad с мобильными устройствами.
    2. Добавлен независимый SEO контроллер
    3. Исправлены мелкие баги
    4. Изменения в лицензии для веб-студий
    В общем ничего серьезного, был добавлен только seo контроллер. Жду предложений. 
  4. подскажите, пожалуйста, где смотреть эти логи???

     

    Имеются ввиду access логи сервера. Либо они доступны по FTP, либо из панели управления хостингом. Чаще всего находятся рядом с логом ошибок (не путать с логом ошибок OpenCart, это отдельные логи). Если их нигде нет, то запросите их у тех. поддержки за тот период, когда произошло вторжение.

  5. я ждал не таких тестов. ни тесты ab, ни тесты одной php функции fileatime/file_get_contents не покажут ясной картины

    кеш в opencart выполняет 3 функции : get, set и delete

    причём set должен вызываться сразу если get вернул пустое значение

     

    нужен тест который делает set например 10,000 значений, затем get эти 10,000 значений

     

    Бессмысленный тест, очевидно же, что новый класс быстрее, тем более при 10 тыс файлов. 

     

    https://github.com/halfhope/OpenCart-cache.php-without-glob

  6. Кстати, можно попробовать рассмотреть вариант с массивом запрошенных данных, чтобы не дублировался повторный запрос

    Пример - дочернии категории

     

    Я не рассматривал такой вариант т.к. процент таких запросов очень мал. 

  7. Рекомендуемый вариант класса с filemtime:

    <?php
    
    class Cache {
    	private $expire = 3600;
    
    	public function get($key) {
    		
    		$file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
    		
    		if (file_exists($file)) {
    			$fp = fopen($file, 'r');
    			flock($fp, LOCK_SH);
    			$data = unserialize(fread($fp, filesize($file))); 
    			flock($fp, LOCK_UN);
    			fclose($fp);
    
    			if ((filemtime($file) + $this->expire) < time()) {
    				if (file_exists($file)) {	
    					unlink($file);
    				}
    				return false;
    			}
    			
    			return $data;
    		}else{
    			return false;
    		}
    		
    	}
    
    	public function set($key, $value) {
    		$this->delete($key);
    		
    		$file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
    		
    		if (!$fp = fopen($file, 'w')) return false;
    		if (flock($fp, LOCK_EX)){  
    			fwrite($fp, serialize($value));  
    			flock($fp, LOCK_UN);
    			fclose($fp);
    			
    			clearstatcache();
    			
    			return true;
    		} else {
    
    			return false;  
    		}
    	}
    
    	public function delete($key) {
    		$file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
    		if (file_exists($file)) {
    			unlink($file);
    		}
    	}
    	
    	public function validate(){
    		$files = glob(DIR_CACHE . 'cache.*.cache', GLOB_NOSORT );
    		
    		error_reporting(0);
    
    		foreach ($files as $file) {
    			if (file_exists($file)) {
    				if ((filemtime($file) + $this->expire) < time()) {
    					unlink($file);
    				}
    			}
    		}
    	}
    	
    	function __destruct() {
    		if (mt_rand(0, 600) == 15) {
    			$this->validate();
    		}
    	}
    
    }
    ?>
    

     

    Для тех, кто у кого стоит модуль Блог | Новости | Галерея | Отзывы и решит заменит свой класс на этот, то в файле system/library/agoo/cache.php нужно заменить функции get, set, delete на те, что находятся в этом классе.

  8. Тут вся соль в инвалидации данных. С файлтайм. Если дата протухла - инвалид. С датой в файле. Получить десериализовать. Проверить время.

    Так же, указанные вами данные, как по мне, легко укладываются в статистическую ошибку.

     

    Никакой статистической ошибки тут нет. Все дело в самой статистике и частоте запросов (кол-ве посетителей), а в нашем случае с ApacheBenchmark. При низкой частоте запросов (реальный проект) хранение времени в файле - минус, т.к. если данные протухли, то зря тратится время на unserialize. При большой (в нашем случае, 500 запросов за 3 минуты) - плюс т.к. данные десериализуются не зря (кэш не протух) и меньше работы с диском. Отсюда и экономия 10 сек, т.е. filemtime (10 запросов на страницу) занимает ~0.002 сек, что недалеко от истины. 

     

    Исходя из этого я думаю, что правильней будет использовать filemtime т.к. проектов на opencart с такой нагрузкой, чтобы хранение даты в файле выходило в плюс - просто нет.

     

    Я сам немного не понял, что написал, но мозг думает, что все правильно. Так что готов расписать более подробно-непонятно для тех кто не понял.

  9. а разве filemtime() не дисковая операция?

    Тем более, что данные все равно проходят чрез unserialize()

    Другой вопрос, что данные можно сжимать, но этот вопрос требует исследования для разного хостинга, что быстрее чистая запись/чтение или zip-запись/чтение-unzip

     

    По поводу сжатия. Еще зависит от среднего размера файлов и частоты запросов к большим файлам. Так что, думаю, не все так однозначно.

     

    По поводу тестов. Использовался ApacheBenchmark, думаю, его будет достаточно.

    Кол-во файлов в кэше на время начала тестирования каждого класса - 500, по окончании 600-800 (посетителей много).

     

    Стандартный класс кэширования

    post-27725-0-00180800-1431522533_thumb.png

    Кэширование без использования функции glob (с использованием filemtime). 

    post-27725-0-66952500-1431522552_thumb.png

     

    Кэширование без использования функции glob (хранение даты в массиве с данными). 

    post-27725-0-68954100-1431522569_thumb.png

  10. Почти заключительная версия класса:

    <?php
    
    class Cache {
    	private $expire = 3600;
    
    	public function get($key) {
    		
    		$file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
    		
    		if (file_exists($file)) {
    			$fp = fopen($file, 'r');
    			flock($fp, LOCK_SH);
    			$data = unserialize(fread($fp, filesize($file))); 
    			flock($fp, LOCK_UN);
    			fclose($fp);
    
    			if ($data['time'] < time()) {
    				if (file_exists($file)) {	
    					unlink($file);
    				}
    				return false;
    			}
    			
    			return $data['data'];
    		}else{
    			return false;
    		}
    		
    	}
    
    	public function set($key, $value) {
    		$this->delete($key);
    
    		$data = array(
    			'time' => time() + $this->expire,
    			'data' => $value
    		);
    		
    		$file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
    		
    		if (!$fp = fopen($file, 'w')) return false;
    		if (flock($fp, LOCK_EX)){  
    			fwrite($fp, serialize($data));  
    			flock($fp, LOCK_UN);
    			fclose($fp);
    			
    			clearstatcache();
    			
    			return true;
    		} else {
    
    			return false;  
    		}
    	}
    
    	public function delete($key) {
    		$file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
    		if (file_exists($file)) {
    			unlink($file);
    		}
    	}
    	
    	public function validate(){
    		$files = glob(DIR_CACHE . 'cache.*.cache', GLOB_NOSORT );
    		
    		error_reporting(0);
    
    		foreach ($files as $file) {
    			if ($fp = @fopen($file, 'r')){
    
    				flock($fp, LOCK_SH);
    				$data = unserialize(fread($fp, filesize($file)));
    				flock($fp, LOCK_UN);
    				fclose($fp);
    				
    				if ($data['time'] < time()) {
    					if (file_exists($file)) {
    						unlink($file);
    					}
    				}
    			}
    		}
    	}
    	
    	function __destruct() {
    		if (mt_rand(0, 600) == 15) {
    			$this->validate();
    		}
    	}
    
    }
    ?> 
  11. Если с башем не в ладах, то выкачивайте сайт на локальный компьютер с сохранением дат модификаций файлов. Для поиска зловреда используйте.

    • Clamav Scanner
    • ai-bolit.php
    • PHP Shell Detector
    • Yandex Manul
    • И прямые руки

    Если найдете зараженный файл, то смотрите его дату. Ищите файлы с той же датой/размером, смотрите их. Делайте так до тех пор, пока все не очистите.

     

    Удаляйте все файлы с сервера и заливайте те, что копировали на комп и очищали. Если по логам видно где произошло проникновение на сервер, то закрывайте дыру. Далее остается ждать последующего заражения, после того как повторное заражение произошло (если произошло) по логам будет видно откуда. Снова заливайте чистые файлы, закрывайте обнаруженную дыру и делайте так до тех пор, пока заражения не прекратятся.

     

    Обычно взломанные сайты используют для рассылки писем или перехвата мобильного траффика, так что такой подход при очистке от зараженного кода вполне оправдан. 

    • +1 1
  12. Прошу поправить, если сделал что-то не так. Подсказать. Т.к. валидация кэша должна происходить в пределах класса было решено добавить ее в деструктор с условием mt_rand(0,600) == 15; (@sv2109).

    Только не пойму куда воткнуть clearstatcache(), она здесь нужна т.к. используются кэшируемые функции filesize() и file_exists(), а функция unlink сама выполняет clearsatcache().

    Вот этот участок:

    'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache'

    оставил для совместимости с модулями, которые работают с кэшем. Расширение - для удобства.

    <?php
    
    class Cache {
    	private $expire = 3600;
    
    	public function get($key) {
    		
    		$file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
    
    		if (!$fp = @fopen($file, 'r')) return false;		
    		flock($fp, LOCK_SH);
    		$data = unserialize(fread($fp, filesize($file))); 
    		flock($fp, LOCK_UN);
    		fclose($fp);
    
    		if ($data['time'] < time()) {
    			if (file_exists($file)) {
    				unlink($file);
    			}
    			return false;
    		}
    		
    		return $data['data'];
    		
    	}
    
    	public function set($key, $value) {
    		$this->delete($key);
    		
    		$data = array(
    			'time' => time() + $this->expire,
    			'data' => $value
    		);
    		
    		$file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
    		
    		if (!$fp = fopen($file, 'w')) return false;
    		if (flock($fp, LOCK_EX)){  
    			fwrite($fp, serialize($data));  
    			flock($fp, LOCK_UN);
    			fclose($fp);
    		} else {
    			return false;  
    		}
    	}
    
    	public function delete($key) {
    		$file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.cache';
    		if (file_exists($file)) {
    			@unlink($file);
    		}
    	}
    	
    	public function validate(){
    		$files = glob(DIR_CACHE . 'cache.*.cache', GLOB_NOSORT );
    
    		foreach ($files as $file) {
    			if ($fp = @fopen($file, 'r')){
    
    				flock($fp, LOCK_SH);
    				$data = unserialize(fread($fp, filesize($file)));
    				flock($fp, LOCK_UN);
    				fclose($fp);
    				
    				if ($data['time'] < time()) {
    					@unlink($file);
    				}
    			}
    		}
    	}
    	
    	function __destruct() {
    		if (mt_rand(0, 600) == 15) {
    			$this->validate();
    		}
    	}
    
    }
    ?> 
  13. Нашла это место (функцию upload). А за что она отвечает-то? А то удалю, а потом может проблемы будут.

     

    Она дает возможность клиентам при покупке товара загрузить файл на сервер, чтобы администратор при проверке заказа смог скчать и просмотреть этот файл. Если такой функционал не используется и использоваться не будет, то смело комментируйте функцию или удаляйте. 

  14. Первое исправлю, не заметил :-) . Второе было в стандартном классе. Если Вы имеете ввиду расширение cache, то просто так, его убирать не буду, уберу cache в начале. preg_replace для того, чтобы оставить только буквы и цифры в ключе. Это есть в стандартном классе, в принципе - тоже можно убрать. Т.к. имена в основном (в модулях) генерятся из хешей, слов на латинице, точек и числовых значений.

  15. sv2109,
     
    Я все еще думаю над правильной реализацией, на которую не будут ругаться другие программисты(решение в пределах класса). Еще пытаюсь решить проблему с не атомарными операциями, т.к. запрашиваемый файл может удалиться в промежуток между проверкой и удалением. 
     
    Кстати, изменение класса очень сильно повлияло на скорость. 16 тыс файлов было из-за кэширования в ненужных местах, сейчас файлов в районе 2к.

  16. Cо своим ЧПУ формирователем намного проще, там особо не надо ничего выдумывать (и 100% совместимость по URL со всеми другими и со всеми патчами и даже с самыми кривыми). В opencart это в принципе очень хорошо продумано.

    Просто повеситься обработчиком на контроллер not_found и если это "твоя" страница то обработать своим ЧПУ формирователем и выдать её уже своим контроллером (т.е. уже не передавать назад управление в контроллер not_found, а полностью перехватить на себя (она же СВОЯ страница!)) . В принципе реализация очень легкая, как раз в этом случае. 

    Намного сложнее перехватывать модели, вызовы контроллеров, но там тоже в принципе все стандартно согласно парадигме php. Т.е. "взял"  посмотрел, если твое - обработал и вызвал "оригинал" вызова. Если не твое - то сразу оригинал вызывается. Причем со всеми vqmod и изменениями, т.е. тоже 100% совместимость и даже более!

    Если надо подробности - обращайтесь в ЛС, я помогу чем смогу.

     

    Я как раз думал как передать управление своему контроллеру, за наводку спасибо. Я до not_found не додумался) Вопросы точно будут, но не сегодня. Еще часик посижу и отдыхать. Большое Спасибо.

  17. Потому что ваш seo_url уже "пропатчен" вдоль и поперек другими модулями (что считаю не правильным подходом к архитектуре своих модулей разработчиков, надо не патчить seo_url, seo_pro, а для своих страниц делать свой ЧПУ формирователь, чтобы он не пересекался со стандартным и не мешали работать другим "патчам" ) . А "патч" теперь видно привязывается не к "тому" коду.

    Получился конфликт.

    Это частая проблема модулей с патчами через vqmod seo_url или seo_pro

    Идеальное решение для модулей со своими страницами - свой не зависимый ЧПУ формирователь и адаптер тем. Остальное костыли, которые рано или поздно сломаются, что и произошло в вашем случае.

     

    Какая же жесть этот чпу контроллер. Думал все намного проще будет, за основу брал seo_pro ссылок в модуле мало, иерарии нет. Только что доделал нормальную перезапись ссылок без бесконечных переадресаций и понял, что я дошел всего-то до схем и перезаписи config_layout_id. Походу еще и свой layout, config, лоадер тянуть придется. Столько подводных камней я еще нигде не видел, думал, что хорошо знаю opencart. А еще ведь ругался на agoo, оказывается, что ничего лишнего там нет. Ну ладно, впереди еще много интересного, не поминайте лихом)

    Последнее «Прости» висит, дрожа,

    Стекая в никуда лениво, тихо

    Босой душой по лезвию ножа:

    -ухожу,

    -не

    -поминайте

    -лихом…

    Застиранное время. Горький яд

    Истёртых слов проснувшегося Лиха.

    Последние пять пуль в десятку, в ряд:

    -я - ухожу, - не – поминайте - лихом…

    И память в никуда уходит вдруг,

    Град по стеклу отстукивая лихо

    Меня выводит на повторный круг:

    - Я - ухожу,

    - не -поминайте

    -лихом…

    Ну, кто же знал, что будет всё вот так-

    Вспотевший взгляд законченного психа

    В пяти строках сгоревшего листа:

    -ухожу,

    -не

    -поминайте

    -лихом…

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.