• Оптимизация mysql 8.0.15 only innodb под 400млн запросов в сутки?

    VELIK505
    @VELIK505 Автор вопроса
    Руководитель департамента profitcentr.com
    всё таки удалось добить как надо и заставить хавать все потоки и всю ОЗУ.
    5ca0ae18d6c3e628848416.jpeg
    Рабочий действущий конфиг:
    spoiler
    [client]
    port		= 3306
    socket		= /var/run/mysqld/mysql.sock
    default-character-set = utf8mb4
    
    [mysqld_safe]
    socket		= /var/run/mysqld/mysql.sock
    nice		= 0
    
    [mysqld]
    sql-mode="NO_ENGINE_SUBSTITUTION"
    pid-file	= /var/run/mysqld/mysqld.pid
    socket		= /var/run/mysqld/mysql.sock
    datadir		= /var/lib/mysql
    log-error	= /var/log/mysql/error.log
    port		= 3306
    tmpdir      = /dev/shm
    basedir		= /usr
    user		= mysql
    skip-external-locking
    skip-log-bin
    skip_name_resolve
    connect_timeout = 80
    interactive_timeout = 80
    wait_timeout = 80
    net_write_timeout = 80
    join_buffer_size = 32M
    max_connect_errors = 30
    max_allowed_packet = 64M
    table_open_cache = 8192
    thread_stack = 384K
    thread_cache_size = 500
    max_connections = 3000
    net_buffer_length = 96K
    max_heap_table_size = 1024M
    tmp_table_size = 16384M
    read_buffer_size = 196M
    sort_buffer_size = 196M
    read_rnd_buffer_size = 196M
    #default_authentication_plugin = mysql_native_password
    #validate_password.check_user_name=OFF
    #validate_password.dictionary_file=0
    #validate_password.length=0
    #validate_password.mixed_case_count=0
    #validate_password.number_count=0
    #validate_password.policy=LOW
    #validate_password.special_char_count=0
    net_read_timeout=500
    max_binlog_size         = 100M
    log_error = /var/log/mysql/mysql_errornew.log
    log_slave_updates = OFF
    innodb_log_compressed_pages = OFF
    sync_binlog = 0
    innodb_autoinc_lock_mode = 2
    innodb_buffer_pool_size = 32768M
    innodb_log_file_size = 4096M
    innodb_log_buffer_size = 16M
    innodb_flush_log_at_trx_commit = 2
    innodb_buffer_pool_instances = 16
    innodb_buffer_pool_chunk_size = 256M
    innodb_flush_method = O_DIRECT_NO_FSYNC
    innodb_stats_on_metadata = 0
    innodb_log_spin_cpu_abs_lwm = 80
    innodb_log_spin_cpu_pct_hwm = 50
    innodb_log_wait_for_flush_spin_hwm = 400
    innodb_parallel_read_threads = 4
    innodb_open_files =	65536
    innodb_sort_buffer_size = 64M
    innodb_read_io_threads = 8
    innodb_write_io_threads = 8
    innodb_io_capacity = 1000
    innodb_doublewrite = 0
    innodb_page_cleaners = 16
    innodb_lock_wait_timeout = 80
    character-set-server=utf8mb4
    collation-server=utf8mb4_0900_ai_ci
    init-connect="SET NAMES utf8mb4"
    skip-character-set-client-handshake
    [mysqldump]
    quick
    quote-names
    max_allowed_packet	= 64M
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [isamchk]
    key_buffer=512M
    sort_buffer=512M
    read_buffer=512M
    write_buffer=512M

    Ответ написан
    1 комментарий
  • Upwork, ИП и валютный контроль - как правильно оформить документы?

    Вообщем я, к сожалению, не нашел информации на этот вопрос, поэтому опишу здесь, что я делал.
    1. Вывел через Wire Transfer (USD)
    2. Деньги пришли, я на Tinkoff
    3. Путем мучительных попток выяснить, что же и как же заполнять выяснилось:
      1. 1. Указать код валютной операции - 21500 (платеж нерезидента резиденту)
      2. 2. Скачать User Agreement (https://www.upwork.com/legal/), распечатать, подписать последнюю страницу,
        отсканировать приложить к документам.
      3. 3. Предоставить скрин Сertificate of earnings https://www.upwork.com/reports/certificate-of-earn... здесь
        указана дата когда вы присодинились к апворк.
      4. 4. Предоставить pdf-файлы ваших инвойсов, т.е. нужно зайти в отчеты -> история транзакций. Кликнуть на ref-
        ccылку - так попадете на pdf
      5. 5. Предоставить подписанный Сonfirmation of Service. Что нужно сделать для этого:
        1. 1. Скачать: https://content-static.upwork.com/blog/uploads/sit...
        2. 2. Заполнить, распечать, отсканить.
        3. 3. Написать в поддержку - https://support.upwork.com/hc/en-us
        4. 4. Отправить скан, в ответ вы получите, то что получите и прикрепите это к заявке валютного контроля.



    Вот такая краткая инстукция у меня получилась.
    Ответ написан
    1 комментарий
  • Хороший курс по Mysql?

    Не совсем про онлайн курс, но очень настоятельно рекомендую Петра Зайцева
    книга (возможно стоит посмотреть другие редакции или онлайн): https://www.ozon.ru/context/detail/id/6573935/
    Доклады на HL: www.highload.ru/moscow/2019/authors/1465
    Ответ написан
    Комментировать
  • Куда следует установить счетчик для самого точного результата?

    HelpSophie
    @HelpSophie
    Счетчики не дают точного результата. По ним смотрят динамику. Поэтому, их надо устанавливать так, чтобы это меньше всего мешало загрузке сайта, т.е. перед закрывающим body.
    Довольные пользователи значительно важнее, чем посчитанные.
    Ответ написан
    1 комментарий
  • Как работает Yii::app()?

    copist
    @copist
    Empower people to give
    1. Инициализация Yii::app()

    Смотри, в файле www/index.php такие строки
    1. $config = APP_PATH . '/protected/config/main.php';
    2. $app = \Yii::createWebApplication($config); // @var CWebApplication $app
    3. $app->run();


    При отработке строки 2 выполняется код
    1. class YiiBase {
    2. {
    3.     // ... другой код
    4. 
    5.     public static function createWebApplication($config=null)
    6.     {
    7.         return self::createApplication('CWebApplication',$config);
    8.     }
    9.
    10.    public static function createApplication($class,$config=null)
    11.    {
    12.        return new $class($config);
    13.    }
    14. }


    В строке 12 с учётом динамического связывания выполняется return new CWebApplication($config);

    Если пройти по родительским классам, то можно найти, что
    class CWebApplication extends CApplication ...

    и далее
    1. abstract class CApplication extends CModule
    2. {
    3.     // ... другой код
    4. 
    5.     public function __construct($config=null)
    6.     {
    7.         Yii::setApplication($this);
    8.         // ... и другой код
    9.     }
    10. }


    В строке 7 вызывается Yii::setApplication($this);, а если посмотреть класс Yii и его родителя YiiBase, то можно увидеть как в итоге инициализируется переменная для конструкции Yii::app()
    class Yii extends YiiBase { }

    class YiiBase {
    {
        private static $_app;
        public static function setApplication($app) // тут определяется значение self::$_app для Yii::app()
        {
            if(self::$_app===null || $app===null)
                self::$_app=$app;
            else
                throw new CException(Yii::t('yii','Yii application can only be created once.'));
        }
        public static function app() // тут можно прочитать значение self::$_app через Yii::app()
        {
            return self::$_app;
        }
    }


    Теперь понятно, что при инициализации сущности типа CWebApplication эта сущность установилась в приватную переменную YiiBase::$_app, которая доступна через вызов Yii::app()

    Это была инициализация

    2. Использование Yii::app()->module или Yii::app()->component

    Ещё раз посмотри на класс CApplication
    abstract class CApplication extends CModule
    {
        public function __construct($config=null)
        {
            Yii::setApplication($this);
    
            // ... другой код
    
            $this->configure($config);
    
            // ... другой код
        }
    }


    В методе configure($config) происходит подготовка данных, которые понадобятся позже для таких вызовов как (к примеру) Yii::app()->db

    Давай посмотрим на класс Module, в котором и реализуется логика таких вызовов
    abstract class CModule extends CComponent
    {
        public function configure($config) // сохранить всё что передали по переменным
        {
            if(is_array($config))
            {
                foreach($config as $key=>$value)
                    $this->$key=$value;
            }
        }
    
        public function __get($name) // если кто-то пытается вызвать несуществующее свойство, например Yii::app()->db
        {
            if($this->hasComponent($name)) // проверить что есть настройки или готовая сущность компоненты
                return $this->getComponent($name); // вернуть сущность компоненты
            else
                return parent::__get($name);
        }
    
        public function hasComponent($id) // проверить что есть настройки или готовая сущность компоненты
        {
            return isset($this->_components[$id]) || isset($this->_componentConfig[$id]);
        }
    
        public function getComponent($id,$createIfNull=true) // вернуть сущность компоненты
        {
            if(isset($this->_components[$id])) // если есть готовая сущность компоненты, вернуть её
                return $this->_components[$id];
            elseif(isset($this->_componentConfig[$id]) && $createIfNull)
            {
                $config=$this->_componentConfig[$id];
                if(!isset($config['enabled']) || $config['enabled'])
                {
                    unset($config['enabled']);
                    $component=Yii::createComponent($config); // создать новую сущность компоненты
                    $component->init();
                    return $this->_components[$id]=$component; // сохранить и вернуть её
                }
            }
        }
    }


    Попробуем расшифровать вызов Yii::app()->db

    Как я уже показал, Yii::app() - это сущность типа CWebApplication, а у неё нет публичного свойства $db, поэтому PHP вызывает магический метод __get() из базового класса CModule. (Посмотри в документации "магические методы")

    Итак, свойства CWebApplication->db не существует и вызывается CModule->__get('db'), далее код считает, что, возможно производится вызов компоненты.

    Метод CModule->hasComponent('db') проверяет, что ранее были заданы какие-то настройки указанной через файл конфигурации protected/config/main.php или иным способом. Если так, то то вызывается CModule->getComponent('db', ...), который вызывает Yii::createComponent($config), где $config - это найденные настройки указанной компоненты, например, параметры соединения с базой данных для компоненты db

    Посмотрим, что делает Yii::createComponent($config)
    class YiiBase
    {
        public static function createComponent($config)
        {
            // посмотри сам, тут интересно
        }
    }


    Cложный метод. Суть его в инстанциировании новой сущности какого-то класса, 5 или 6 способов. Дело в том, что этот метод CModule::createComponent() может быть вызван откуда угодно и у него куча вариантов передачи параметров.

    Итак, CModule::createComponent() создал и вернул новую сущность. И на выходе из метода CModule::getComponent() полученная сущность записывается в массив CModule->_components под именем 'db'.

    Все последующие вызовы Yii::app()->db будут проверять наличие инстанциинованной сущности в массиве CModule->_components['db'] и использовать его, если он там найден

    Заключение:

    Вызов Yii::app()->db
    А. Динамически инициализирует компоненту, по мере необходимости
    Б. Настраивает её данными, которые в частновти можно определить через файл конфигурации protected/config/main.php
    В. Инициализируют компоненту только один раз за цикл работы PHP приложения

    Надеюсь я понятно изложил механизм ленивой инициализации компонент
    Ответ написан
    1 комментарий
  • Что обязательно нужно знать в PHP и что посоветуете выучить?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    В PHP, в базовом уровне обучения - всё просто:
    Нужно уметь создавать несколько новых объектов на основе уже единственно-созданного.

    Код для любого унифицированного объекта (включая его рендер на фронте и обработчик) - мы пишем ОДНОКРАТНО!

    Например, у нас есть блог.
    На странице нужно разместить 2 формы авторизации, 2 строки поиска и 6 блоков с определёнными выборками: 5 самых читаемых раздел1, 5 самых новых раздел1, 5 самых читаемых раздел2, 5 самых новых раздел2, 5 самых коментируемых раздел1, 5 самых коментируемых раздел2.
    Это три класса и три объекта. Все остальное - это клонирование созданного нужного объекта и замена свойств.

    Затем, всё это оформить в нормальную архитектуру.
    Чтобы 1 строку поиска или 10 строк подряд - было не важно: запуск цикла нужное количество раз и нужное количество строк поиска с обработчиком - готовы.

    Ну и самое главное - контроль входных и выходных данных!
    Ответ написан
    Комментировать
  • В чем смысл библиотеки ReactPHP? Какие задачи решает?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Асинхронность - это выполнение параллельных операций в одном потоке; Мультитрединг, очевидно, в нескольких. Блокировка потока исполнения, вроде функции sleep, а не использование таймера - блокирует поток исполнения (внезапно! Ваш кэп). Надо быть феерически наивным, чтобы ожидать чего-то иного =)
    Ответ написан
    1 комментарий
  • Как правильно построить архитектуру Symfony 4?

    @dreamerz
    Как я собираю проэкт Симфонии
    composer self-update
    composer require symfony/symfony-skeletone (требует лимит мемори для пхп свыше 1800М)
    Никогда неделайте ничего при старте вручную - Первое правило =)
    Если Вам вдруг нужна авторизация из-корробки -
    php bin/console make:auth
    Первый Ваш контроллер
    php bin/console make:controller
    > MyShopController
    Нужен класс для связи с БД
    php bin/console make:entity
    > Shop
    в процессе Вам напишут что Реппозиторий создался автомматически
    Мы забыли про БД! Непугайтесь сделайте ещё пару комманд)
    php bin/console doctrine:database:create
    Теперь можно выгружать таблицы:
    php bin/console make:migration
    Теперь чтобы увидеть таблицы в самой БД скажем комманду
    php bin/console doctrine:migrations:migrate
    Вуаля - это Магия Симфонии)

    Если что - обращайтесь

    Если конкретно по-вопросу -
    У меня роутер выглядит так:
    app_product
    path: /product/{slug}/{action}
    controller: App\Controller\ProductController:indexAction

    По ссылке /product/update/#id
    POST ajax request
    ProductController:
    $post = $request->request->all(); // все POST запросы
    $product = new Product;
    $product->setPrice($post['price']);
    ...
    /product/show/#id
    Загружается страничка с продуктом.
    Это конкретный пример логики
    Ответ написан
  • Почему появляется ошибка "Trying to get property of non-object" в Laravel(е)?

    Melkij
    @Melkij
    PostgreSQL DBA
    Поскольку это именно Trying to get property, а не Call to a member function, значит из всей строки на роль проблемного места подходит только Auth::user()->id. А именно, Auth::user() возвращает что-то, не являющееся объектом.

    И да, если пользователь не авторизован, то Auth::user() будет возвращать null.
    Ответ написан
    3 комментария
  • Почему Данные из текстовых полей не отображаются в базе данных mysql?

    DevMan
    @DevMan
    потому что их нет. и вы бы это увидели, если б был включен вывод ошибок.
    в запросе должны использоваться $_POST['name'], $_POST['email'] и тд.
    Ответ написан
    2 комментария
  • Расскажите подробно про php://input, как пользоваться?

    php://input возвращает все необработанные данные после HTTP-заголовков запроса, независимо от типа контента.

    Данные, могут быть:
    • application/x-www-form-urlencoded ( application/x-www-form-urlencoded тип application/x-www-form-urlencoded для простых форм- application/x-www-form-urlencoded ) или
    • multipart/form-data-encoded (в основном multipart/form-data-encoded для загрузки файлов)

    Это связано с тем, что это единственные типы контента, которые должны поддерживаться браузерами. Поэтому сервер и PHP традиционно не ожидают получения какого-либо другого типа контента (что не означает, что они не могли бы).

    Если вы просто отправляете POST-ом обычную HTML-форму, запрос выглядит примерно так:
    POST /page.php HTTP/1.1
    key1=value1&key2=value2&key3=value3

    Но если вы много работаете с Ajax, может понадобиться обмен более сложными данными с типами (строка, int, bool) и структурами (массивы, объекты), поэтому в большинстве случаев JSON является лучшим выбором. Но запрос с JSON-полезной нагрузкой выглядел бы примерно так:
    POST /page.php HTTP/1.1
    {"key1":"value1","key2":"value2","key3":"value3"}

    Теперь содержимое будет application/json (или, по крайней мере, ни один из вышеперечисленных), так что $_POST -wrapper из PHP не знает, как с этим справиться (пока).

    Данные всё еще там, вы просто не можете получить к нему доступ через $_POST. Поэтому вам нужно получить его с "сыром" виде помощью file_get_contents('php://input') (если он не закодирован в формате multipart/form-data).

    Это также способ доступа к XML-данным или любому другому нестандартному типу контента.
    Ответ написан
    Комментировать
  • Как шелл попал на сервер?

    Host-Eiweb
    @Host-Eiweb
    Хостинг VPS серверов в Европе и США
    • Проверить установлен ли и работает корректно fail2ban
    • Добавить нового пользователя с правами root, пользователю root заблокировать доступ
    • Изменить все пароли.
    • Проверить права на директории.
    • В директории с файлами картинок добавить файл .htaccess с правилами отключающими PHP в данном каталоге, а все скрипты отображающими как HTML.

      Например:
    php_flag engine 0
    AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp

    Установить mod_security и активировать необходимые правила. (попутно можно добавить mod_evasive - лишним не будет)
    Ответ написан
    Комментировать
  • Как работает this jquery?

    @igor9alive
    $(this) в данном примере содержит элемент, на котором произошел click. Т.е. непосредственно элемент.
    То есть, вот этой строкой "$(this).slideToggle(1000);" ты скрываешь элемент, по которому кликнули - $('.bg_sale span').
    Напиши вот так - $(this).find('b').slideToggle(1000);
    Таким образом в элементе this (кликнутый элемент) ты найдешь все теги b и применишь к ним метод slideToggle
    Если ничего не упустил, должно сработать
    Ответ написан
    1 комментарий
  • Битрикс. Как увеличить скорость теста почтовой системы?

    fibit
    @fibit
    full-stack developer
    Обычно тормоза почтовой системы - это проблема с NS. Нужно смотреть конфигурацию установленного на хостинге MTA. Обычно, простым решением является смена sendmail (он обычно стоит по умолчанию) на postfix или exim.

    Вчера решил этим способом аналогичную проблему:
    3050882c8aaa46a0b4b804c245edbfa1.png
    Ответ написан
    Комментировать
  • Какие книги можно почитать о метриках кода, надежности ПО, качестве ПО?

    vvpoloskin
    @vvpoloskin
    Инженер связи
    Гуглите «теория надежности программного обеспечения» и английский аналог. Найдёте методички, а в них ссылки на литературу.
    Ответ написан
    Комментировать
  • Какие книги можно почитать о метриках кода, надежности ПО, качестве ПО?

    @Apollon_Diamed
    Попробуй почитать "Совершенный код" С. Макконнела, возможно натолкнет на то, что нужно.
    Ответ написан
    Комментировать
  • Какие книги можно почитать о метриках кода, надежности ПО, качестве ПО?

    @stroganoff
    Разработчик
    Если ваш вопрос касается больше практической стороны, то рекомендую книгу Ли Атчисона «Масштабирование приложений. Выращивание сложных систем». В ней описаны такие понятия как надежность, доступность, матрицы рисков, и также способы решения проблем с ними связанных.
    Примеры расчетов метрик в книге также присутствуют.
    Ответ написан
    Комментировать
  • Стратегия входа, путь развития во фрилансе. С чего начать, чтобы стать верстальщиком и php-программистом?

    Nikolino
    @Nikolino
    Html и css с практическими задачами лучше изучать на htmlacademy.ru. После того как освоился, качаешь бесплатные psd макеты и верстаешь, с адаптивом, какие-то сложные вещи, которые не можешь сверстать оставляешь пока.
    Далее ищешь видео где верстают макет, обычно на первых секундах-минутах показывают макет и сразу можешь понять сможешь ли сверстать сам или нет, если понимаешь, что не сможешь, то смотришь как автор это сделает, узнаешь новое для себя.

    По php. Читать большие и толстые книги пока бессмысленно, всё прочитанное будет вылетать из головы. Ставишь OpenServer, и сразу в бой:
    1. Переменные, условия, циклы, массивы.
    2. Пользовательские функции
    3. Базовые функции по работе со строками и с массивами. Комбинация функций. (важно понять и запомнить что они умеют).
    4. Post и Get запросы, получение Post и Get запросов из формы (тут сразу и html по формам подтянешь)
    5. Базы данных, простые запросы к базе, выборки, запись в базу данных из формы.
    6. Куки, сессии.
    7. Чтение и запись в файлы.
    8. Регулярные выражения.
    9. ООП, базовые понятия. Самое сложное и непонятное для новичка. Непонятно потому, что не ясно зачем это нужно и почему это в дальнейшем упрощает работу, поэтому как-то мимо ушей все пролетает.

    Если с английским хорошо, то codecademy.com.
    Если плохо, то базовую теорию (и сразу практику) делать здесь.

    Далее лучше сразу переходить на фреймворк (лучше Laravel). MVC в теории тоже понимается плохо потому, что пользу донести до понимания новичкам сложно, а при работе с фреймворками сам понимаешь почему это удобно.
    Во время изучения фреймворка и ООП подтянешь.

    Самое главное, по моему опыту обучения, это сразу делать практические задания по ходу изучения тем, постепенно, набивать руку. Задания лучше не пропускать (с мыслью "да тут легко, в теории я знаю как это сделать, пропущу, интересно что будет дальше").
    Самое неправильное, это дойти в чтении чуть ли ни до ООП, а открыв редактор кода, понять, что не можешь написать простые условия или перебор массива.

    То есть чтения меньше, практики больше. Это про голый PHP.

    Про фреймворк, если английский позволяет то Laracasts: Laravel 5.4 from scratch. Если не позволяет, то ищешь в ютубе что-то вроде "простой блог на Laravel", смотришь и кодишь параллельно у себя.
    Тут тоже самое, под попкорн просмотреть всю серию роликов от начала до созданного блога с админкой бесполезно. Обнаружится потом, что не можешь даже базовые вещи сделать. Нужно делать параллельно с автором, он делает какой-то функционал, смотришь, делаешь также, изначально может быть непонятно многое и зачем автор это делает, но со временем поймешь как это работает.

    Далее пробуешь сделать что-то свое, какие-то "фичи", например авторизацию с помощью соц. сетей, лайки к постам и комментариям (с помощью ajax, тут можно jQuery изучить чуть-чуть), вложенность комментариев и т.д. Можешь другой себе проект придумать(представь себя стартапером).

    Далее можно изучить системное администрирование чуть-чуть, покупаешь VPS недорогой, ставишь Nginx, MySQL, PHP-FPM и т.д. Пробуешь залить туда свой проект, так чтобы всё работало. Далее можешь попробовать прикрутить какой-нибудь поисковый движок (Sphinx, например). Изучение командной строки тоже на codeacedemy.com есть.

    Возможно для фриланса это и не особо нужно, но при устройстве на работу (в том числе и удаленную), будет не лишним, во многих вакансиях это требуют даже от Junior'ов (но в вакансиях любят преувеличить).

    Сам изучаю всё это недавно. До этого был Python+Django(первый фреймворк). В команде никогда не работал. Так что можно сказать передаю опыт от новичка новичку.
    Ответ написан
    3 комментария
  • Как научится понимать Bitrix за один вечер?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Найдите подходящий скринкаст на Ютубе
    Ни пуха ни пера вам -- для верстальщика это будет испытание:)
    Там не все так просто, как с обычными легкими цмс, у которых есть шаблоны

    Время на теорию у меня всего один вечер (а скорее всего ночь).

    Помимо Битрикса вам нужно изучить методологии разработки, в частности ФФФ, где подразумевается ТРЕЗВАЯ оценка и договоренность по времени с запасом, чтобы не планировать ВПРИТЫК (я молчу про дичайший дедлайн в один вечер), тк в ее основе лежит принцип:
    "Всегда пойдет все не так, как задумал, тк живем среди живых людей и что-то обязательно сдвинет сроки"

    - Пообещали сделать за вечер и сделали за вечер -- всего лишь выполнили обещанное (хотя вам это много стоило)
    - Пообещали за вечер и сделали за 3 -- вы облажались в 3 раза
    - Пообещали сделать за неделею и сделали за вечер или за 3 -- вы супер обслужили быстрее в разы и потрясли заказчика
    Выбирайте
    Ответ написан
    1 комментарий
  • Микроразметка в HTML?

    @palec2009
    Если использовать микроразметку schema.org/Product для карточке товаров или услуг, то в сниппете выдачи поисковиков будет красиво отображаться цена и описание продукта, Разметка организаций schema.org/Organization также выводит адрес в сниппет, Разметка schema.org/breadcrumb делает так чтобы на выдаче хлебные крошки были на русском языке, но это актуально только для гугла, у яндекса дргугой алгоритм перевода хлебных крошек, он не из разметки берет инфу. Вот это три основные разметки которые есть смысл использовать. Также можно применить разметку schema.org/ItemList для листингов товара и schema.org/Table для таблиц. Доп инфу можно почитать тут https://habrahabr.ru/company/yandex/blog/246003/ и тут https://yandex.ru/support/webmaster/schema-org/
    Ответ написан
    Комментировать