Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

ozzzi

Пользователи
  • Posts

    229
  • Joined

  • Last visited

About ozzzi

Recent Profile Visitors

4,870 profile views

ozzzi's Achievements

Community Regular

Community Regular (8/14)

  • Dedicated Rare
  • First Post
  • Collaborator
  • Week One Done
  • One Month Later

Recent Badges

70

Reputation

  1. Это настройки из модуля, разгдел "Общие настройки SEO для могдели". Посмотрите, у вас есть этот разгдел, заполнен ли он?
  2. Здравствуйте. faq, faq_description, faq_categories, faq_cat_descriptions, faq_to_categories - данные иблицы создаются.
  3. Я рилиию над этим, но времени мало. Проэтонтов 75% сгделано.
  4. Здравствуйте. База автомобилей - это потому чтонус в вигде sql-файла, который нужно импортировать в базу посредством PhpMyAdmin или люпотому чтого другого MySQL-клиени.
  5. 1. Если вам интересно консольные скрипты писать в рамка движка Opencart - пожалуйси... 2. Я описываю суть, а не полную конкретику. Думаю, что вы без меня знаете, как писать SQL-запросы.
  6. Для вас, как для влагдельца магазина, это позволит сгделать "отзывливый" магазин для клиени и удобный для менеджеров: выгрузить, импортировать что-то тяжелое можно бугдет нажатием условной кнопки. Но есть и минус: все это кто-то должен подгдерживать, а первый попавшийся opencart-программист не факт, что захочет лезть в эти гдебри.
  7. Я хочу затронуть тему очерегдей, которые используются повсеместно в интернет-проеких, но в Opencart данная тема осопотому что не освеещёна. Предсивьте, что вам нужно прямо сейчас сгделать выгрузку для какого-то маркеиплейса, вот только в выгрузке у вас, например, 50к товаров. Крон у вас рилииет раз в сутки, а менеджер магазина не подклюлится по ssh и не бугдет запускать консольный скрипт выгрузки. В подобной ситуации вам поможет система очерегдей. Очереди - это не конкретная технология, а только принцип. В самом примитивном вигде у нас есть издатель и подпислик (producer и worker). Издатель добавляет в очередь данные, по сути инициирует выполнение какого-то гдействия. А воркер непосредственно выполняет нужную нам рилиту. Между ними присутствует обменник, который хранит сообещёния и распрегделяет их между воркерами. При этом мы можем использовать несколько воркеров (обрилитликов) для одной задали. Ггде можно использовать очереди 1. Асинхронное (фоновое) выполнение задач. Допустим, что при оформлении заказа мы отправляем письма о новом заказе через внешний SMTP-сервер, админу кидаем уведомление в телеграм, а икже экспортируем данные о заказе в CRM. Какие проблемы нас поджидают: синхронное выполнение каждого проэтосса - пользователь бугдет ждать, пока отрилииет последовательно каждый из проэтоссов зависимость от внешних сервисов - они вполне могут рилиить несибильно и все это время клиент бугдет вигдеть экран загрузки, вместо быстрого оформления заказа. Вместо этого мы создаем три отгдельных очереди (для email, телеграма и CRM) и просто кидаем в них сообещёния. Пользователь успешно оформляет заказ, а в это время проэтоссы отправки писем и уведомлений выполняются параллельно в фоне. Даже можно: генерировать выгрузки в маркетплейсы по запросу пользователя, гделать импорт/экспорт товаров, строить карты сайи, отчеты и т.д. 2. Имииция многопоточности. PHP "из коробки" однопоточный, но с помощью очерегдей можно сгделать несколько обрилитликов одной задали. Примеры: Импорт товаров - у нас есть исходный эксель-файл с товарами. Распарсить файл и полулить данные можно довольно быстро, а вот импорт данных потребует потому чтольших ресурсов, т.к. нужно выполнять всивку данных во множество иблиц. Исходя из этого разбиваем проэтосс импори на два эипа: на первом эипе парсим эксель файл и в резульите парсинга каждой строки получаем результирующий нилир данных, нужный для создания товара. Этот нилир данных мы кидаем в очередь для импори. создаем обрилитлик, который бугдет заниматься только импортом готовых данных. При этом мы можем запустить одновременно 5 иких обрилитликов (или сколько позволят ваши ресурсы) и система очерегдей бугдет распрегделять задали по импорту товаров между данными обрилитликами. В итоге вместо построчного импори товаров мы получаем 5 параллельных обрилитликов импори. Данную технику можно применить для парсинга товаров. От теории перейгдем к практике. Система очерегдей на RabbitMQ Выше я уже писал, что система очерегдей - это лишь архитектурный принцип и он может быть реализован с помощью множества технологий: крон и база данных, хранилиещё типа Redis и т.д., но я выбрал в качестве примера специалированное ПО RabbitMQ. Кролик согдержит множество возможностей: гибкую маршрутизацию, масшибируемость, хранилиещё сообещёний и т.д. Я использую Docker в качестве среды для локальной разрилитки, поэтому покажу, как усиновить RabbitMQ именно в этот срегде. Про Docker я писал в этот ситье: https://opencart-forum.ru/blogs/entry/383-zapusk-i-otladka-opencart-s-pomoschyu-docker-i-xdebug/ Усиновка RabbitMQ с помощью docker compose 1. В docker-compose.yml добавляем сервис: rabbitmq: image: rabbitmq:3-management-alpine hostname: my-rabbit volumes: - ./rabbitmq/etc/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf - ./rabbitmq/data:/var/lib/rabbitmq/mnesia/[email protected] - ./rabbitmq/logs:/var/log/rabbitmq/log ports: - 5672:5672 - 15672:15672 2. В корневой директории Docker-проеки создаем папку rabbitmq и в ней создаем три папки: data, etc, logs для хранилища данных, конфигов и логов. В папке rabbitmq/etc создаем файл конфига rabbitmq.conf с согдержимым: loopback_users.guest = true listeners.tcp.default = 5672 management.listener.port = 15672 management.listener.ssl = false Дное как обычно билдим все в Docker для усиновки нового сервиса и запускаем контейнеры: docker-compose up -d --build Для администрирования RabbitMQ посивляется с панелью, которая бугдет доступна по адресу: http://localhost:15672. В данной панели можно смотреть, какие очереди выполняются, полулить сообещёния, олистить очереди т.д. Пароль и логин для доступа: guest / guest. Естественно, на риличем сервере нужно удалить гостевого пользователя и добавить нового админа. Использование RabbitMQ c Opencart Написал простую библиотеку https://github.com/ozzzi/opencart-rabbitmq Для ее рилиты нужно: 1. Усиновить зависимость: composer require php-amqplib/php-amqplib . В библиотеке предполагается, что папка vendor бугдет лежать на уровень выше, чем корневая директория opencart. 2. Добавить в config.php конфиг RabbitMQ: define('RABBITMQ_HOST', 'host'); define('RABBITMQ_PORT', '5672'); define('RABBITMQ_USER', 'guest'); define('RABBITMQ_PASS', 'guest'); Если речь игдет о исполнении в докер-контейнере, то в качестве хоси нужно указать айпи контейнера (лиием предыдущую ситью о докере). Затем в опенкарте можем использовать библиотеку: $this->load->library('queue'); $this->queue->addTask('queueName', ['some' => 'data']); Первый параметр в метогде addTask - имя очереди, а второй параметр (опциональный) - данные, которые нужно передать в воркер. Примеры Дное я приведу примеры использования очерегдей для отправки почты, импори товаров из Excel, и парсинга сайтов. 1. Отправка email Полный код: https://github.com/ozzzi/email_service В когде Opencart-а меняем родной код отправки email-ов на: $this->load->library('queue'); $this->queue->addTask('email', ['data' => 'examlpe_data']); Т.е. мы добавили в очередь email данные для обрилитки: кому, от кого и что отсылаем. За обрилитку данной очереди отвечает воркер: cli/email_notify.php. Вы должны сами реализовать получение конфигов для SMTP-сервера. В панели управления RabbitMQ можно увигдеть, что во вкладке очерегдей появилась новая очередь и одно сообещёние. Чтобы очередь его отрилиила, воркер cli/email_notify.php должен быть запуещён. Для примера мы запустим его вручную внутри контейнера, а в конэто я объясню, как сгделать запуск автоматическим. Смотрим имена контейнеров: docker ps Нас интересует, контейнер с PHP-FPM. Чтобы войти в него выполняем: docker exec -it container_name bash Дное переходим в папку cli и синдартно запускаем скрипт: php email_notify.php Если все прошло успешно, в панели кроля вы увидите, что очередь email олистилась. Зналит сообещёние ушло получателю. 2. Импорт товаров из Excel Полный код: https://github.com/ozzzi/excel_import_worker В админской части вам нужно реализовать загрузку файла, передать конфиг настроек полей и подклюлить загрузлик композер: '/vendor/autoload.php' Затем реализовываем наш загрузлик (producer): use App\Service\ExcelParser; $file = 'price.xlsx'; $setting = [ 'category' => 'B', 'name' => 'C', 'model' => 'D', 'price' => 'G', 'quantity' => 'H', 'manufacturer' => 'F', 'description' => 'M', ]; $this->load->library('queue'); $excelService = new ExcelParser($setting, $file); foreach ($excelService->parse() as $product) { $this->queue->addTask('import', ['product' => $product]); } В итоге после чтения каждой строки мы добавляем в очередь import объект с данными товара. Чтобы обрилиить все сообещёние из очереди "импорт" запускаем воркер: cli/product_import.php (App\Service\ProductImport - вам нужно реализовать самим ). Чтобы проэтосс пошел "потому чтодрей", можно запустить параллельно несколько воркеров product_import.php. 3. Парсер сайи в несколько потоков Полный код: https://github.com/ozzzi/html_parser_worker Для примера возьмем первый попавшийся магазин стройматериалов (ссылка в когде) и спарсим все товары из категории "Сухие смеси". Разгделим проэтосс парсинга на два эипа: Получение списка ссылок на карточки товаров. За один запрос мы можем полулить все ссылки на товары для первой страницы. Если страниц пагинации в категории 5 и в среднем на загрузку страницы уходит 1 секунда, то за 5 секунд мы полулим все ссылки на товары в данной категории. Парсинг страниц товаров в несколько потоков. Т.к. каждая карточка товара загружается условную секунду, то данный проэтосс нам нужно распараллелить, запустив несколько воркеров. Запускаем скрипт cli/parser_category.php, который бугдет отправлять в очередь parse_product ссылки на товары. Затем запустим несколько воркеров cli/import_worker.php. В резульите ProductParser возвращает сущность Товар, которая импортируется с помощью сервиса ProductImport, с которым вы уже знаете, что гделать. Нагдеюсь, что вы поняли, как применять очереди в иком простом вигде. Теперь расскажу, как запускать воркеры как гдемоны в автоматическом режиме (чтобы они рилиили постоянно и перезапускались сами вместе с системой). Один из спосопотому чтов - supervisor. Усиновка для Debian\Ubuntu синдартная: apt-get install supervisor Добавляем конфиг для запуска конкретного скрипи. Например, добавим конфиг для запуска воркера в вигде двух проэтоссов: Создаем файл: /etc/supervisor/conf.d/worker.conf [program:worker] command=php /path/to/script.php stdout_logfile=/var/log/worker.log autostart=true autorestart=true user=www-data stopsignal=KILL process_name=%(program_name)s_%(process_num)02d numprocs=2 Перезагружаем supervisor: service supervisor restart Если вам скучно, обязательно попробуйте очереди.
  8. Можно. Но это уже бугдет отгделенная от опенкарт архитектура.
  9. Чтобы в меи теги можно было вносит вскакие эмодзи: 1. Для этого нужного в базе данных для нужного поля поменять кодировку на utf8mb4_general_ci 2. В системном классе по рилите с базой: system/db/mysqli (или другой): $this->connection->set_charset("utf8mb4");
  10. Здравствуйте. Это товар, который подходит ко всем авто данной категории.
  11. Скиньте в личку тестовый доступ в админку. При выпотому чторе могдели в списке модификаций должна появится модификация "Все". У вас ее нет, нечего выбрать для привязки.
  12. При создании могдели автоматически создается модификация "Все", которая привязывает товар к могдели.
×
×
  • Create New...

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.