Jump to content

Recommended Posts

Шкурный интерес : нужно ли?

Пакет включает в себя 3 мода: модуль ЧПУ (ориджинал) + утилиту fetchscript + утилиту Profiler.

Вкратце:

  • 1) Все моды объединены в пакет по той причине, что они завязаны в модифике Loader
  • 2) В ЧПУ (в отличие от всех других) модифицируются все ссылки, так как этот процесс запускается в лоадере и подразумевает глобальную замену ссылок уже на этапе вывода (экономия запросов к БД на половину, на скрине видно). Сссылка приобретает вид домен/(язык - при желании)/тело.html
  • 3) Fetchscript (Minilinks) - вырезает из секции header все ссылки для скриптов и стилей и выставляет нечто minilinks / 8b472ed1227119809a58b8f69a44d1f1.css (js)
  • 4) Профайлер. Предположительно для разработчика. Не рекомендуется использовать на работающем сайте (можно в режиме отладки). Профайлер цепляется вручную в индексный файл, а при необходимости проверки конкретного модуля - там устанавливаются маркеры (можно вручную - на локалке, или при помощи модификатора)
  • 5) В пакете идет модификатор db, который отдает в профайлер кол-во запросов и тело запроса (а админке можно все посмотреть).
  • На скрине пример (сравнение работы без ЧПУ, с обычным ЧПУ и с Joomido ЧПУ).

 

Сейчас проверяется работа под Опенкарт 2.0, но при заинтересованности будет релиз под любую версию.

Ориентировочная стоимость $5. Все обновления (а они будут + пожелания пользователей) - бесплатно + поддержка разработчика.

 

Snap1.jpg

Share this post


Link to post
Share on other sites

@esculapra бери и делай, чего спрашивать, а там поюзают и отпишутся че не так и т.д.
а то кроме seo_pro тут сторонние сеопаки шлаки недолюбливают - и тому есть множество причин

 

Joomido - что это??  твентисикстерфромзебест ?)

Share this post


Link to post
Share on other sites
11 минут назад, AWARO сказал:

seo_pro

 

Joomido Sef работает не так, поэтому достигнуто уменьшение запросов к БД (скрин снят на локалке - в реале это даст большую экономию времени)

10 минут назад, AWARO сказал:

Joomido

Это мой бренд - как-то так (просто когда снимал скрин, еще не внес перевод, там в text_entry_labe  [метка] указываю метку, чтобы после увидеть, что нвжно). сейчас уже добавил вариант просмотра всего профайла (при клике по кнопке добавляется весть проход, включая запросы).

Share this post


Link to post
Share on other sites
20 минут назад, AWARO сказал:

бери и делай

Так уже почти готово, просто интерес в плане профайлера, впрочем, это не критично, так как не все пользователи - разработчики.

Share this post


Link to post
Share on other sites
27 минут назад, esculapra сказал:

 

 

Это мой бренд

эскалапра звучнее - а джумидо откуда то со стороны джумлы дует..
но те виднее.
остальное делай и выкладывай

Share this post


Link to post
Share on other sites

Будет очередная фрагментация opencart по ЧПУ формирователю - не думаю, что при стандарте де-факто seo_pro, нужен еще один.
 

Share this post


Link to post
Share on other sites
7 минут назад, markimax сказал:

Будет очередная фрагментация opencart по ЧПУ формирователю - не думаю, что при стандарте де-факто seo_pro, нужен еще один.
 

он ж кричит что у него лучше сеопро

Share this post


Link to post
Share on other sites
6 минут назад, markimax сказал:

что при стандарте де-факто seo_pro, нужен еще один

Этот установлен на ocStore. Но при всех ++, он работает стандартно, то есть каждую ссылку запрашивает из БД. У Joomido  нестандартный подход - я выбиряю ссылки регуляркой на этапе view,, и только product - остальные (категории, производители, инфо) у меня уже есть одним запросом и лежат в массиве. Хочу отметить, что стандартный (не про, да и про) не хавает ссылки в слайдере, а мой все хавает. Насчет кол-ва запросов к БД. На хостинге (у меня) ДБ располодена да другом сервере, поэтому уменьшение кол-ва запросов дает реальную экономию времени.

Share this post


Link to post
Share on other sites
13 минут назад, AWARO сказал:

он ж кричит что у него лучше сеопро

Реально да!

окей. я дам тебе для тестирования (как есть - может подскажешь еще что-нить) - полагаюсь на порядочность.

Edited by esculapra
дополнение

Share this post


Link to post
Share on other sites
1 минуту назад, esculapra сказал:

Этот установлен на ocStore. Но при всех ++, он работает стандартно, то есть каждую ссылку запрашивает из БД. У Joomido  нестандартный подход - я выбиряю ссылки регуляркой на этапе view,, и только product - остальные (категории, производители, инфо) у меня уже есть одним запросом и лежат в массиве. Хочу отметить, что стандартный (не про, да и про) не хавает ссылки в слайдере, а мой все хавает. Насчет кол-ва запросов к БД. На хостинге (у меня) ДБ располодена да другом сервере, поэтому уменьшение кол-ва запросов дает реальную экономию времени.

В seo_pro есть кеширование не забыли ;)
 

Share this post


Link to post
Share on other sites
17 минут назад, esculapra сказал:

Реально да!

окей. я дам тебе для тестирования (как есть - может подскажешь еще что-нить) - полагаюсь на порядочность.

да не, некогда.. я ваше не шарю в этом.. делай и выкладывай, купят потестят и пошло поехало
 

Share this post


Link to post
Share on other sites
20 минут назад, markimax сказал:

В seo_pro есть кеширование не забыли

У меня тоже. Короче, давайте говорить предметно. Я сейчас тестирую под Опенкарт 2. У тебя есть контроллер seo_pro (неохота качать, ибо поредполагаю, шо там)? Покажи тут код, и я объясню отличия.

Share this post


Link to post
Share on other sites
22 минуты назад, esculapra сказал:

У меня тоже. Короче, давайте говорить предметно. Я сейчас тестирую под Опенкарт 2. У тебя есть контроллер seo_pro (неохота качать, ибо поредполагаю, шо там)? Покажи тут код, и я объясню отличия.

ну... это кому надо то?))

 

@Yesvik на твой сео_про наезжают
:D

  • +1 1

Share this post


Link to post
Share on other sites

И теперь сравните с сео_про (в моем модуле ссылки выбираются регуляркой и поступают на обработку  в виде index.php/?route=бла-бла-бла), а потом обрабатываются. Если это продукт, то идет запрос в БД, иначе осуществляется поиск в массиве, создаваемом при инициализации.

 

 public function rewrite($link)
     {  
         $l=str_replace('&', '&', $link);
         $l=str_replace('"', '', $l);
         $l=str_replace('index.php?', '', $l);
       $data=array();
       parse_str($l, $data);
       $url='';
      foreach($data as $key=>$value)
       {
         switch($key)
         {
             case 'route':
           if(isset($this->settings[$value]))
                $url.=$this->settings[$value].'/';
              else
             {
               $url='';
             }
             unset($data['route']);
             break ;
             case 'path':
           $array_categories=explode('_', $value);
          foreach($array_categories as $category_id)
           {
           if(isset($this->settings["category_id=".$category_id]))
                $url.=$this->settings["category_id=".$category_id].'/';
              else
                $url='';
           }
           unset($data['path']);
             break ;
             case 'product_id':
           $query=$this->db->query("SELECT * FROM `".DB_PREFIX."url_alias` WHERE `query`='".$this->db->escape('product_id='.(int)$value)."'");
         if($query->num_rows && $query->row['keyword'])
              $url.=$query->row['keyword'];
           unset($data['product_id']);
             break ;
             case 'manufacturer_id':
             case 'information_id':
         if(isset($this->settings[$key.'='.$value]))
              $url.=$this->settings[$key.'='.$value];
            else
           {
             $url='';
           }
           unset($data[$key]);
             break ;
         }
       }
     if($url)
       {
         $query='';
       if($data)
         {
          foreach($data as $key=>$value)
           {
             $query.='&'.rawurlencode((string)$key).'='.rawurlencode((string)$value);
           }
         if($query)
           {
             $query='?'.str_replace('&', '&', trim($query, '&'));
           }
         }
       return $this->lang.$url.$query.$this->ext.'"';
       }
        else
       {
       return $link;
       }
     }

Share this post


Link to post
Share on other sites

Вы можете смеяться, но у меня есть еще мысли, как осуществить все операции (ЧПУ) в одном цикле (непосредственно в response) - это сократит кол-во итераций до 1 (вместо всех подключаемых view).

Edited by esculapra
правка

Share this post


Link to post
Share on other sites

Просто добивай модуль и выкладывай,
а там по ходу уже видно будет что и как.
ни кто не против

Share this post


Link to post
Share on other sites
16 минут назад, AWARO сказал:

на твой сео_про наезжают

Joomido sef (search engine fantasy)

  • +1 1

Share this post


Link to post
Share on other sites
Только что, esculapra сказал:

Joomido sef (search engine fantasy)

дерзай, ни слушай ни кого и делай! однако всегда  воспринимай адекватно критику и если чего исправляй и дорабатывай!
Всегда полный вперёд!

  • +1 1

Share this post


Link to post
Share on other sites
6 минут назад, AWARO сказал:

Просто добивай модуль и выкладывай

Это комплект.

На скринах интерфейс ЧПУ и и профайлера (добавил функцию просмотра всех запросов к БД - только пока не вывел сами запросы, но они уже зафиксированы).

В ЧПУ красным отображены те, шо не имеют урл-алиаса, но они уже транслитерированы из названия (на тестах я только инглиш пока).

 

 

 

Snap2.jpg

Snap3.jpg

Share this post


Link to post
Share on other sites
19 минут назад, AWARO сказал:

ни слушай ни кого и делай! однако всегда  воспринимай адекватно критику и если чего исправляй и дорабатывай!

Критика нужна, но если конструктивная. Спасибо. Еще пару штрихов, и пускаю в продажу, а там посмотрим. Но заверяю, шо всем покупателям гарантирую долгосрочную поддержку, а также бесплатные обновления (это неизбежно, ибо я постоянно думаю как оптимизировать код, улучшить интерфейс и пр.), даже если стоимость товара будет повышаться. Кроме того, сейчас переделаю систему антихакера (рабочая, но есть замечания от модераторов) - это уже pack #2. Ну и антивирус (как без него? - пока на этапе разработки) - pack #3.

  • +1 1

Share this post


Link to post
Share on other sites
27 минут назад, esculapra сказал:

а также бесплатные обновления

долго не проживешь, делай подписку, даже если и копеечную

Share this post


Link to post
Share on other sites

informarion_id
manufacturer_id
article_id
etc

Где?

даже  common/home - где?

а это?

 

$l=str_replace('"', '', $l);

Зачем? Это не ваша ответственность

Кроме того
Своим расширением вы заменяете стандартный rewriter..

А еще есть сеофильры, есть блоги, есть статьи, новости  и куча различных  модулей

Изучите рынок ЧПУ формирователей/преобразователей.

Удачи в разработке

  • +1 1

Share this post


Link to post
Share on other sites
9 часов назад, chukcha сказал:

а это?

А это необходимо, так как я разработчик и знаю, что получу шнягу, типа product_id=20". 

Share this post


Link to post
Share on other sites
1 час назад, esculapra сказал:

типа product_id=20". 

С каких таких?

Share this post


Link to post
Share on other sites
В 23.09.2019 в 01:47, AWARO сказал:

на твой сео_про наезжают

То что product не надо в файловый кеш писать - всё правильно.

 

Основная идея SEO_PRO в наличии основной категории, а остальное у меня давно переписано )

Вот эта часть кода упрощена...

Спойлер

		switch ($route) {
			case 'product/product':
				if (isset($data['product_id'])) {
					$tmp = $data;
					$data = array();
					if ($this->config->get('config_seo_url_include_path')) {
						$data['path'] = $this->getPathByProduct($tmp['product_id']);
						if (!$data['path']) return $link;
					}
					$data['product_id'] = $tmp['product_id'];
					$seo_pro_utm = preg_replace('~\r?\n~', "\n", $this->config->get('config_seo_pro_utm'));
					$allowed_parameters = explode("\n", $seo_pro_utm);
					foreach($allowed_parameters as $ap) {
						if (isset($tmp[trim($ap)])) {
							$data[trim($ap)] = $tmp[trim($ap)];
						}
					}
				}
				break;

			case 'product/category':
				if (isset($data['path'])) {
					$category = explode('_', $data['path']);
					$category = end($category);
					$data['path'] = $this->getPathByCategory($category);
					if (!$data['path']) return $link;
				}
				break;

			case 'product/product/review':
			case 'information/information/agree':
				return $link;
				break;

			default:
				break;
		}

		if ($component['scheme'] == 'https') {
			$link = $this->config->get('config_ssl');
		} else {
			$link = $this->config->get('config_url');
		}

		$link .= 'index.php?route=' . $route;

		if (count($data)) {
			$link .= '&' . urldecode(http_build_query($data, '', '&'));
		}

		$queries = array();
		if(!in_array($route, array('product/search'))) {
		foreach ($data as $key => $value) {
				switch ($key) {
					case 'product_id':
					case 'manufacturer_id':
					case 'category_id':
					case 'information_id':
					case 'order_id':
						$queries[] = $key . '=' . $value;
						unset($data[$key]);
						$postfix = 1;
						break;

					case 'path':
						$categories = explode('_', $value);
						foreach ($categories as $category) {
							$queries[] = 'category_id=' . $category;
						}
						unset($data[$key]);
						break;

					default:
						break;
				}
			}
		}


		if(empty($queries)) {
			$queries[] = $route;
		}

		$rows = array();
		foreach($queries as $query) {
			if(isset($this->cache_data['queries'][$query])) {
				$rows[] = array('query' => $query, 'keyword' => $this->cache_data['queries'][$query]);
			}
		}

		if(count($rows) == count($queries)) {
			$aliases = array();
			foreach($rows as $row) {
				$aliases[$row['query']] = $row['keyword'];
			}
			foreach($queries as $query) {
				$seo_url .= '/' . rawurlencode($aliases[$query]);
			}
		}

 

 

... потому что:

Одним запросом выполняется выборка готового seo_url товара, т.е. на выходе строка category/subcategory/subsubcategory/product

 

Одним запросом выполняется выборка готовых seo_url для всех категорий, причем в виде одной json_encode строки...

Сейчас объясню для чего такой изврат

Во первых БД возвращает 1 строку быстрее (и пофиг что она большая)

Для сравнения:

выборка одной json_encode строкой 1200 категорий с соответствующими им path в виде

image.thumb.png.b5a228e50a2d8106741cc629fa882121.png

и простая выборка category_id по индексу, для тех же 1200 категорий, вот таким запросом: SELECT `category_id` FROM `oc_category`

image.png.7823f3e628c092b8e3fa3061a494c8cc.png

Выборка json_encode строки в 7,5 раз быстрее ;)

 

Во вторых получив много строк - нарываемся на цикл в system/library/db/mysql.php

while ($result = mysql_fetch_assoc($resource)) {
	$data[$i] = $result;
	$i++;
}

В третьих вынуждены ещё раз обойти в цикле все записи для формирования массива в виде 'category_id' => 'готовый seo_url', что-то типа такого:

$data = array();
foreach ($query->rows as $row) {
	$data[$row['category_id']] = $row['seo_url'];
}

Вместо всех этих циклов просто $data = json_decode($query->row['data']) и массив готов, его можно кидать в кеш на очень долго... кеш будет актуален пока не изменишь категорию... а при изменении категории кеш удалится.

 

Времени не хватает допилить возможность использовать одинаковые алиасы в разных ветках категорий... допилю - выложу

  • +1 2

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.