Rapida Форк на базе simpla 2.3.8

Тема в разделе "Simplacms", создана пользователем babahalki, 12 окт 2017.

Модераторы: yaski
  1. babahalki

    babahalki

    Регистр.:
    6 май 2016
    Сообщения:
    246
    Симпатии:
    97
    Прошло 2 года с момента открытия нашего интернет-магазина. Мы начали с Simpla, но потом под веянием моды перешли на OkayCMS. За это время в систему было внесена масса изменений, направленных на ускорение быстродействия. В итоге из OkayCMS было выпилено почти все, что заявлено, как преимущества этой системы.

    Но самая большая претензия - система работает без ошибок, только если error_reporting установлен E_ALL & ~E_NOTICE
    Т.е. когда включено отображение всех ошибок, система просто пестрит ошибками notice. Для сравнения в симпле, всего несколько мест, которые надо исправить в этой части.

    Сейчас приняли решения пилить свой форк уже на основе simpla, потому что удалять/исправлять функционал окая и добавлять новую функциональность сложнее, чем просто добавлять что-то в Simpla.

    Эту первую редакцию с трудом можно назвать форком, поскольку тут практически ничего не изменено по сравнению с оригинальной версией Simpla 2.3.8.

    Данный релиз сделан для желающих использовать классическую Simplа.

    Название Rapida выбрано потому, что система должна быть быстрой. Скорость для Rapida - основной приоритет.

    Основная фишка этого релиза, модуль импорта YML.

     
    Последнее редактирование: 12 окт 2017
    omega80, GERAsimov, tm.weBreath и 7 другим нравится это.
  2. babahalki

    babahalki

    Регистр.:
    6 май 2016
    Сообщения:
    246
    Симпатии:
    97
    RAPIDA 0.0.4 ecommerce CMS SimplaCMS 2.3.8 fork

    ****************
    Changelog
    ****************



    =================
    v0.0.4 13.10.2017
    =================
    - Изменен метод db->results(string $field = null, string $group_field = null), теперь он работает аналогично, results_array с той разницей, что выдает массив с объектами внутри, а не массив с массивами внутри.
    = Добавлены файлы для выполнения очереди задач через cron. Выполнить задания из очереди cron/queue_exec.php. Посмотреть кол-во заданий в очереди cron/queue_count.php
    - Добавлен метод db->results_object(string $group_field = null) и изменен db->results_array(string $group_field = null). Работают сходным образом, с той разницей, что один выдает объект, а второй массив.
    - На метод products->get_products() прикручен дисковый кеш через методы cache->set_cache_nosql() cache->get_cache_nosql(). Кеш пишет на диск вывод метода products->get_products в виде json строки, а при чтении из кеша, преобразует json строку обратно в объект.
    - Мелким изменениям подверглись почти все файлы view/*.php и simpla/*.php в связи с использованием в методе products->get_products() нового метода db->results_object(). Пришлось изменить на новый метод в связи с тем, что дисковый кеш cache->set_cache_nosql() и cache->get_cache_nosql() используют для записи на диск функции json_decode json_encode, которые все пишут в объект. В результате при обратном преобразовании ф-цией json_decode данных из кеша с диска невозможно было восстановить, объекты, как объекты, а массивы, как массивы. Теперь все данные выводятся чистыми объектами.
    - Внесены изменения в методы products->get_products() и products->get_related_products(), теперь результат выполнения сразу группируется по id, соответствующие изменения внесены во всех случаях использования этих методов.
    - Изменен метод 'products->add_image()'. Оптимизирована работа. Кол-во запросов уменьшено до 2. Первый запрос определяет максимальную позицию изображений товара, 2 запрос добавляет новое изображение товара, сразу устанавливая позицию макс. знач. + 1.
    - Исправлена ошибка в simpla/ProductAdmin.php message_error добавляется в шаблон в любом случае, если ошибки нет - добавляется пустой message_error.
    - В файле simpla/index.php удалены указания на несуществующий дебагер, добавлен дебагер dtimer::show(), также как в файле /index.php
    - в методе request->url иправлена ошибка. Если при парсинге адресной строки через $url = parse_url($_SERVER['REQUEST_URI']) в полученном массиве нет элемента 'query' (часть после ?) $url['query'] - вылетала ошибка. Теперь добавлена предварительная проверка и ошибка больше не вылетает.
    - Удалена поддержка сервиса "Простые звонки"
    - Исправлена ошибка в view\ProductsView.php в части перечисления свойств товаров $features.
    - Устранены мелкие баги (Какие именно не помню)
    =================
    v0.0.3 13.10.2017
    =================
    - Добавлен метод в класс db public function results_array(string $field = null, string $group_field = null). Основная фишка - поле группировки, позволяет избежать двойной работы, когда сначала в методе db->results происходит перебор и запись строк в объект, а потом, например, во view/ProductsView.php происходит перебор:
    foreach($this->products->get_products($filter) as $p)
    $products[$p->id] = $p;
    только, чтобы записать id товаров в виде ключей массива. $this->db->results_array(null, 'id') выдаст результат в виде массива с ключами из поля id.

    =================
    v0.0.2 12.10.2017
    =================
    - Добавлен отладчик ошибок dtimer в виде отдельной библиотеки api/Dtimer.php
    - В config.ini выведена опция dtimer_disabled для включения/выпключения отладчика. Когда опция true, вызовы метода отладчика на запись dtimer::log('info') и на вывод журнала отладчика dtimer::show() не срабатывает и не забивает память. dtimer_disabled = false включает запись событий в отладчик, а также включает отображение журнала. Вызов происходит из файла index.php. Отладчик записывает текстовую строку, а также время записи этой строки в журнал отладчика.
    - Добавлена библиотека кеширования cache api/Cache.php и библиотека очереди queue api/Queue.php. Пока используется для кеширования только одного метода product->count_products(). Механизм работы. При обращении к методу по входным параметрам в массиве $filter формируется md4 hash, который через метод cache->get_cache_integer() ищет в базе сохраненный кеш, если кеш не найден, происходит полное выполнение метода count_products(), в конце перед return происходит запись в кеш через метод cache->set_cache_integer(). Очередь заданий queue используется следующим образом. метод queue->addtask($keyhash, 'name', $task); пишет в очередь заданий задачу на выполнение count_products() без использования кеша с последующим обновлением результата в кеше. За счет этого кеш постоянно обновляется, но обновление происходит в отдельном процессе вызываемом планировщиком cron, т.е. для пользователя функция выполняется быстро, а сложная работа протекает на фоне.

    Последняя версия на гитхабе:
    https://github.com/legale/rapida
    тут есть дистрибутив:
    https://github.com/legale/rapida/tree/master/distro
     
    Последнее редактирование: 5 дек 2017
    jean2009 и swart2010 нравится это.
  3. swart2010

    swart2010

    Регистр.:
    12 апр 2009
    Сообщения:
    447
    Симпатии:
    114
    все стучалки вырезаны от simpla cms дырки есть?)
    и вообще если не секрет, какие планы на развитие движка и проекта в целом?
     
  4. babahalki

    babahalki

    Регистр.:
    6 май 2016
    Сообщения:
    246
    Симпатии:
    97
    Стучалок в симпле нет, а проверка лицензий выпилена.
    Зарабатывать на продаже не планирую, просто хочу сделать хороший движок для интернет-магазина, который сможет спокойно и на виртуальном хостинге быстро гонять 100 тыс. товаров в 700 разделах. Из всех движков, которые я просмотрел за все время, в том числе коммерческих, ничего лучше симплы мне встретить не удалось.

    План простой, сделать систему максимально быстрой, сохранив возможность использовать шаблоны для simpla. Сейчас пока прикручиваю то, что уже опробовано и показало свою эффективность, это все твики по скорости работы.
    Наверняка сделаю ЧПУ адреса.
    Еще 1 мощное изменение, которое наверняка сделаю - нормальная работа фильтров по свойствам в разделах товаров. Кто внимательно изучал работу фильтров в симпле знает, что симпла корявенько работает с фильтрами. В отличие, например, от фильтров в яндекс маркете. Как сделать правильно я уже придумал и протестировал на нашем магазине, осталось прикрутить сюда.
    Еще хочу проделать аудит по безопасности системы.
    Хочу сделать удобный доступ к api системы для работы ajax, сейчас ajax в системе есть только в строго отведенных местах (информер корзины, импорт, экспорт товара). Хочу сделать больше, опять же в целях ускорения работы.

    Конечно жду предложений от форумчан.
     
    Последнее редактирование: 14 окт 2017
    Minor и swart2010 нравится это.
  5. dead4nv

    dead4nv Постоялец

    Регистр.:
    7 авг 2017
    Сообщения:
    51
    Симпатии:
    7
    идея хорошая! по-тестирую на днях ваше решение, обязательно отпишусь!
     
  6. babahalki

    babahalki

    Регистр.:
    6 май 2016
    Сообщения:
    246
    Симпатии:
    97
    RAPIDA Ecommerce CMS version 0.0.5
    SimplaCMS 2.3.8 fork

    ****************
    Changelog
    ****************



    =================
    v0.0.5 14.10.2017
    =================
    - Удалены лишние файлы simpla/LicenseAdmin.php и simpla/design/html/license.tpl
    - Удалены хвосты из файла simpla/design/html/index.tpl от интеграции с сервисом "простые звонки"
    - В целях удобства в классе config api/Config.php, который отвечает за работу с config.ini добавлена парсинг ini файла по секциям, теперь в классе создана публичная переменная $vars_sections, где настройки config.ini, распределены по секциям. Например, настройки кеша доступны $this->config->vars_sections['cache']
    - устранена ошибка в методе cache->encode() (убрал лишний аргумент, который не использовался $param)
    - настройки кеша выведены из api/Cache.php в config/config.ini
    - Добавлено кеширование на диск по самой "тяжелой" функции системы features->get_options(). Пожалуй, кеширование этой функции - самый эффективный тюнинг скорости который можно сделать. Время загрузки не самого большого раздела сократилось до 170мс, без кеширования это время составляло около 4с.
    - Исправлен баг с работой функции products->get_products(). В начале функции из $filter (аргумент функции) удалялись лишние параметры. Было сделано для того, чтобы не захламлять кеш лишней информацией, но применительно к функции get_products удалялись $filter['page'] $filter['limit'] $filter['sort'], в результате при переключении пагинации в разделах сайта, товары не изменялись.
    - Исправлен баг с тем, что пользователь отображался авторизованным даже, когда авторизации не происходило. view/View.php
    - в файле шаблона cart.tpl исправлен баг, приводящий к ошибке, когда пользователь не авторизован. {if $user->discount} заменено на {if isset($user->discount)}. Аналогичный баг исправлен в view/CartView.php в части $coupon_request, теперь, если действующих купонов нет, все равно в шаблон передается переменная $coupon_request, но со значением false. Стараюсь устранять ошибки, которые раньше не отображались в связи с тем, что отображение ошибок типа notice было принудительно отключено. К сожалению не всегда удается обойтись без исправлений в шаблоне. Потенциально в других шаблонах возможно повторение этих ошибок.
    - Изменен метод features->get_features(), теперь он тоже, как и products->get_products() выдает объект сразу сгруппированный по id, соответствующие изменения внесены в другие места, где используется данный метод.

    =================
    v0.0.4 13.10.2017
    =================
    - Изменен метод db->results(string $field = null, string $group_field = null), теперь он работает аналогично, results_array с той разницей, что выдает массив с объектами внутри, а не массив с массивами внутри.
    = Добавлены файлы для выполнения очереди задач через cron. Выполнить задания из очереди cron/queue_exec.php. Посмотреть кол-во заданий в очереди cron/queue_count.php
    - Добавлен метод db->results_object(string $group_field = null) и изменен db->results_array(string $group_field = null). Работают сходным образом, с той разницей, что один выдает объект, а второй массив.
    - На метод products->get_products() прикручен дисковый кеш через методы cache->set_cache_nosql() cache->get_cache_nosql(). Кеш пишет на диск вывод метода products->get_products в виде json строки, а при чтении из кеша, преобразует json строку обратно в объект.
    - Мелким изменениям подверглись почти все файлы view/*.php и simpla/*.php в связи с использованием в методе products->get_products() нового метода db->results_object(). Пришлось изменить на новый метод в связи с тем, что дисковый кеш cache->set_cache_nosql() и cache->get_cache_nosql() используют для записи на диск функции json_decode json_encode, которые все пишут в объект. В результате при обратном преобразовании ф-цией json_decode данных из кеша с диска невозможно было восстановить, объекты, как объекты, а массивы, как массивы. Теперь все данные выводятся чистыми объектами.
    - Внесены изменения в методы products->get_products() и products->get_related_products(), теперь результат выполнения сразу группируется по id, соответствующие изменения внесены во всех случаях использования этих методов.
    - Изменен метод 'products->add_image()'. Оптимизирована работа. Кол-во запросов уменьшено до 2. Первый запрос определяет максимальную позицию изображений товара, 2 запрос добавляет новое изображение товара, сразу устанавливая позицию макс. знач. + 1.
    - Исправлена ошибка в simpla/ProductAdmin.php message_error добавляется в шаблон в любом случае, если ошибки нет - добавляется пустой message_error.
    - В файле simpla/index.php удалены указания на несуществующий дебагер, добавлен дебагер dtimer::show(), также как в файле /index.php
    - в методе request->url иправлена ошибка. Если при парсинге адресной строки через $url = parse_url($_SERVER['REQUEST_URI']) в полученном массиве нет элемента 'query' (часть после ?) $url['query'] - вылетала ошибка. Теперь добавлена предварительная проверка и ошибка больше не вылетает.
    - Удалена поддержка сервиса "Простые звонки"
    - Исправлена ошибка в view\ProductsView.php в части перечисления свойств товаров $features.
    - Устранены мелкие баги (Какие именно не помню)
    =================
    v0.0.3 13.10.2017
    =================
    - Добавлен метод в класс db public function results_array(string $field = null, string $group_field = null). Основная фишка - поле группировки, позволяет избежать двойной работы, когда сначала в методе db->results происходит перебор и запись строк в объект, а потом, например, во view/ProductsView.php происходит перебор:
    foreach($this->products->get_products($filter) as $p)
    $products[$p->id] = $p;
    только, чтобы записать id товаров в виде ключей массива. $this->db->results_array(null, 'id') выдаст результат в виде массива с ключами из поля id.

    =================
    v0.0.2 12.10.2017
    =================
    - Добавлен отладчик ошибок dtimer в виде отдельной библиотеки api/Dtimer.php
    - В config.ini выведена опция dtimer_disabled для включения/выпключения отладчика. Когда опция true, вызовы метода отладчика на запись dtimer::log('info') и на вывод журнала отладчика dtimer::show() не срабатывает и не забивает память. dtimer_disabled = false включает запись событий в отладчик, а также включает отображение журнала. Вызов происходит из файла index.php. Отладчик записывает текстовую строку, а также время записи этой строки в журнал отладчика.
    - Добавлена библиотека кеширования cache api/Cache.php и библиотека очереди queue api/Queue.php. Пока используется для кеширования только одного метода product->count_products(). Механизм работы. При обращении к методу по входным параметрам в массиве $filter формируется md4 hash, который через метод cache->get_cache_integer() ищет в базе сохраненный кеш, если кеш не найден, происходит полное выполнение метода count_products(), в конце перед return происходит запись в кеш через метод cache->set_cache_integer(). Очередь заданий queue используется следующим образом. метод queue->addtask($keyhash, 'name', $task); пишет в очередь заданий задачу на выполнение count_products() без использования кеша с последующим обновлением результата в кеше. За счет этого кеш постоянно обновляется, но обновление происходит в отдельном процессе вызываемом планировщиком cron, т.е. для пользователя функция выполняется быстро, а сложная работа протекает на фоне.

     
  7. babahalki

    babahalki

    Регистр.:
    6 май 2016
    Сообщения:
    246
    Симпатии:
    97
    Небольшие исправления

    RAPIDA Ecommerce CMS 0.0.5.2
    SimplaCMS 2.3.8 fork

    ****************
    Changelog
    ****************
    =================
    v0.0.5.2 15.10.2017
    =================
    - После включения кеша, возник баг с открытием страниц товара в админке. Устранен.

    =================
    v0.0.5.1 15.10.2017
    =================
    - В демонстрационную инсталяционную базу, которая создается на этапе установке системы, добавлены недостающие таблицы s_queue рабочая очередь задач. s_queue_full очередь задач для сохранения всех задач (не очищается автоматически) s_cache_integer для записи кеша цифровых значений.
    - Расположение файлового кеша по умолчанию изменено на cache в корневой директории системы
    - Раньше к имени директории, которая создается для кеша в конце дописывался дефис. securityKey = mysite становилось mysite- Теперь так больше не делает.

    Rapida 0.0.5.2



    Для тех кто хочет сравнить скорость работы rapida и симпла, демонстрационная база из 42 товаров не подойдет. Вот файл яндекс маркета от нашего интернет магазина светильников sevenlight.ru (около 20 тыс. товаров), его можно быстро импортировать через модуль YML импорта, который есть в rapida, начиная с версии 0.0.1 (это практически полностью симпла)

    sevenlight.ru.xml.gz
     
    Последнее редактирование: 15 окт 2017
    Liberus нравится это.
  8. dead4nv

    dead4nv Постоялец

    Регистр.:
    7 авг 2017
    Сообщения:
    51
    Симпатии:
    7
    После установки сразу вылезло:
    Catchable fatal error: Argument 1 passed to Cache::get_cache_nosql() must be an instance of string, string given, called in D:\OpenServer\domains\dev.loc\api\Products.php on line 48 and defined in D:\OpenServer\domains\dev.loc\api\Cache.php on line 315
     
  9. babahalki

    babahalki

    Регистр.:
    6 май 2016
    Сообщения:
    246
    Симпатии:
    97
    старая версия php, в 5 версии еще не было этой модной фишки, которую я запилил тут. уберу эту **е...., по старинке будем действовать. Эта хрень называется type hinting, зачем я ее запилил? Хотел покороче написать проверку аргументов у функций, а тут натолкнулся на этот type hinting, хорошо, что ты заметил сейчас, а то я уже успел понаделать этого добра.
    Обратной совместимости нет, а пользы на 5 копеек. Уберу в следующей версии. Ты пока включи php7 просто.