Переработана реализация RequestContext
с использованием встроенных методов управления контекстом корутин Swoole. Также удалены методы create
, destroy
и exists
.
Улучшено время старта сервера тестовых случаев при работе на многоядерных процессорах.
Улучшены некоторые части кода.
Исправлена проблема с названием полей модели CRUD, являющихся ключевыми словами.
Исправлена проблема с использованием метода find()
для моделей с составным первичным ключом.
Исправлена возможная проблема в методе update()
модели.
Исправлено использование одиночного экземпляра контроллеров.
Срочное исправление проблемы синглтон-контроллера
Добавлена поддержка псевдонимов запросов, что позволяет сократить повторяющиеся шаги при конкатенации запросов.
Введены глобальные сверхпеременные Hook. Установив конфигурацию @app.beans.SuperGlobals.enable
в значение true
, можно использовать следующие переменные прямо в коде: $_GET, $_POST, $_COOKIE, $_REQUEST, $_SESSION, $_SERVER, $_FILES
.
Введен новый класс модели Meta
, который позволяет удобно получать информацию о модели внутри класса модели.
Поддержка HTTP/TCP/UDP/WS контроллеров теперь позволяет указывать режим singleton.
Добавлен метод Model::dbQuery()
, который возвращает результат запроса в виде массива вместо экземпляра текущего класса.
Добавлен декоратор @ServerInject
Улучшено качество кода моделей.
Удалены ненужные строки кода.
Отменён старый метод ответа gzip, оптимизирован код.
Удалён минимальный логический трассируемый путь Log traceMinimum.
Исправлено поведение пагинации запросов, когда общее количество записей и страниц отображается как 0 при номере страницы больше 1.
Исправлено поведение события parseSaveData
модели, где изменения значения данных приводили к изменению значений свойств модели.
Снова пятница! В последнее время всё больше людей начинают использовать IMI, а сам IMI становится всё лучше. Желаю всем приятного выходного!
Добавлено тестирование производительности моделей.
Добавлены примеры тестирования модели Redis.
В инструмент генерации моделей добавлен параметр -entity
, который позволяет включать использование верблюжьего регистра названий полей; параметр установлен по умолчанию (#27).
Усовершенствованы значения возвращаемых значений методов модели Redis.
При отсутствии балансировки нагрузки (только один конфигурационный файл соединения) происходит прямой возврат ресурса.
Улучшена модель.
Улучшены тестовые случаи.
Обёрнутый метод getAssocList()
дерева моделей преобразован в универсальный метод ArrayUtil::toTreeAssoc()
.
Исправлена проблема сессий при установке времени жизни cookie равной 0.
Исправлена проблема использования модели Redis при вызове метода ModelManager::getFields()
.
Исправлено поведение метода ArrayUtil::recursiveMerge()
, которое приводило к потере ключей при слиянии массивов с числами как ключами.
Неделя была посвящена запуску пула процессов и высокопроизводительного сервера корутин, что привело к значительному увеличению производительности по сравнению с традиционной моделью, а также в сравнении с моделью BASE.
Добавлена поддержка высокопроизводительного сервера корутин Swoole, который обеспечивает ещё большую производительность и требует Swoole версии 4.4+.
Добавлен более мощный пул процессов, способный заменить Swoole\Process\Pool. Поддерживается мониторинг сигналов, перезапуск процессов (можно указывать конкретные), общение между Pool Master и Worker через сообщения и т.д.
В проектах теперь можно конфигурировать активацию различных модулей imi
Основные улучшения были реализованы в части оптимизации внутренней архитектуры фреймворка и повышения производительности обработки контекста запросов, а также проведены небольшие улучшения функциональной стороны.
Проведена полная проверка тестов: PHP 7.1, 7.2, 7.3, 7.4, nightly, Swoole 4.3, 4.4, master
Добавлена поддержка аннотации валидации: теперь можно указывать параметры, которые требуются только при наличии значения
Введен метод File::putContents()
для записи содержимого в файл; если необходимых директорий нет, они создаются автоматически
В метод File::createFile()
добавлен параметр $content
Введен метод ConnectContext::multiSet()
для массового установления данных контекста
Введен метод RequestContext::use()
Улучшена производительность внутренней архитектуры фреймворка
Улучшена производительность обработки контекста запросов
Улучшен менеджер StatementManager
Поддерживается конфигурация @app.db.statement.cache
для управления режимом кэширования операторов SQL; по умолчанию кэширование включено
Метод ConnectContext::create()
теперь принимает параметры для инициализации
ConnectContext
и ConnectGroup
в пользовательском процессеНеделя была направлена на добавление паттерна "Фасад" (Facade) и улучшение производительности.
Добавлена поддержка Фасада
Добавлен генератор/инструмент для работы с Фасадами
Добавлена поддержка определения групп middleware
В методе IHttpNotFoundHandler->handler()
добавлен параметр $requesthandler
В методе RequestContext.create
добавлена возможность передачи начальных данных, а также добавлен метод multiSet
для записи нескольких значений за один раз
Добавлен метод преобразования аннотаций в текстовые комментарии
Добавлена поддержка конфигураций для указания событий сервера, которые следует слушать, а также для создания пользовательских событий
Улучшена производительность часто используемых событий на базовом уровне фреймворка
Улучшена производительность при вызове незапланированных событий
Оптимизированы реализации кода, связанные с http-message
При недостаточной инициализации запрос теперь отклоняется вместо приостановки
Отменены события BufferFull
и BufferEmpty
Обновлено до версии библиотеки doctrine-annotations
, совмещенной с официальной версией 1.7
Исправлено получение информации об ошибке errorInfo()
при работе с базой данных
Исправлено проблемное поведение маршрута для методов, не являющихся объектами
Избежана странная ошибка в Swoole 4.4.x
языке, а перевод выполнен на русский язык в соответствии с указанными требованиями.
Добавлена аннотация Inherit
, которая позволяет наследовать аннотации родительского класса в дочернем классе. Можно указывать конкретные аннотации для наследования; поддерживаются: классы, методы, свойства, константы.
Добавлена middleware OptionsMiddleware
, которая решает проблему отправки браузером OPTIONS запроса перед основным запросом с типом application/json
.
Добавлено событие IMI.HOTUPDATE.BEGIN_BUILD
, которое может влиять на процесс сборки при горячем обновлении.
Добавлен метод Imi\Util\ClassObject::inNamespace()
, который позволяет проверять принадлежность класса к определенному пространству имён.
Добавлен метод перечисления файлов, поддерживающий возможность выбора продолжения или прекращения рекурсивного перебора директорий.
По умолчанию middleware теперь имеют имя Bean
. Это позволяет использовать bean по имени непосредственно в коде.
Параметры действий HTTP теперь автоматически принимают значения из parsedBody()
.
Ускорено время прохождения по файлам при горячем обновлении.
Интервал времени для обнаружения изменений при горячем обновлении теперь поддерживает миллисекунды, хотя единицей измерения остаётся секунда. Для установки можно использовать десятичные числа.
Улучшены метаданные атрибутов моделей, создаваемых системой.
Исправлена проблема, когда после установки имени bean его невозможно было использовать в конфигурации beans.
Исправлена проблема с невалидной конфигурацией httponly
для SessionCookie
.
Исправлена проблема с частичным обновлением.
Неделя была направлена на улучшение модели.
На этой неделе был запущен открытый проект на основе imi; если вас интересует участие, свяжитесь с Ю Рень!
Db::query()->paginate()
Получение общего количества записей и общего числа страниц:
$page = 1;
$count = 10;
$data = Db::query()->from('xxxtable')->paginate($page, $count);
$result->getList(); // список данных
$result->getTotal(); // общее количество записей
$result->getLimit(); // $count === 10
$result->getPageCount(); // общее число страниц
var_dump(json_encode($result)); // поддерживает сериализацию
// формат данных следующий:
[
'list' => [],
'total' => 100,
'limit' => 10,
'page_count' => 10,
]
Не получать общее количество записей и общее число страниц:
$page = 1;
$count = 10;
$data = Db::query()->from('xxxtable')->paginate($page, $count, [
'total' => false,
]);
var_dump(json_encode($result)); // поддерживает сериализацию
// формат данных следующий:
[
'list' => [],
'limit' => 10,
]
getChildIds
, getChildrenIds
, getChildrenList
, getParent
, getParents
, getAssocList
)Документация: https://doc.imiphp.com/components/orm/TreeModel.html
imi -h
Теперь методы получения значений моделей имеют реальные значения
Оптимизация кэширования полей модели в стиле camelCase, что привело к повышению производительности
Недельный отчёт о последних обновлениях:
Компонент шаблонизатора Smarty: https://github.com/imiphp/imi-smarty
Компонент мониторинга Swoole Tracker: https://github.com/imiphp/imi-swoole-tracker
Разрешено использование count()
для ArrayData, ArrayList, FilterableList.
Добавлены тестовые случаи для новых классов Imi\Util*
Добавлена методика File::deleteDir()
Введен новый инструментальный класс Imi\Util\Digital
Исправлено поведение Imi\Db\Query::WhereEx()
(@loyating #25)
Исправлено поведение ArrayUtil::remove()
при удалении объектов, введена новая методика ArrayUtil::removeKeepKey()
Исправлены странные проблемы тестовых случаев на низкоконфигурированных компьютерах после обновления Swoole до версии 4.4.4
Исправлено соединение путей в File::path()
с использованием протокола xxx://
Исправлено неверное сравнение значений в Imi\Util\Imi::checkCompareValue()
Исправлено случайное создание десятичных чисел в научной форме
Переработана система событий, убрана зависимость от KVStorage, используется объект вместо массива для хранения данных
Улучшены механизмы работы HTTP middleware
Улучшены механизмы работы WebSocket middleware
Улучшены механизмы работы TCP middleware
Улучшены механизмы работы UDP middleware
Улучшены тестовые случаи
Уточнены комментарии к классу Imi\Util\ClassObject
Поддержка установки значения task_worker_num
равным 0
Улучшен приемник инициализации приложения AppInitReceiver
Убраны методы File::readFile()
и File::writeFile()
(после перехода на асинхронное выполнение можно использовать file_get_contents()
и file_put_contents()
)
Убран компонент KVStorage
Включено блокирование файла при записи в систему логирования
Нумерация динамических параметров запроса теперь начинается с 1
лицензию Mulan Permissive License, версия Swoole Первый фреймворк, использующий лицензию Mulan Permissive License, версия Swoole Примечание: Первый фреймворк, использующий лицензию Mulan Permissive License, версия Swoole
imi стал первым Swoole-фреймворком, использующим лицензию Mulan PSL v1. Причина изменения открытого соглашения со стороны ЮРУН заключается в следующем:
Во-первых, Mulan PSL v1 является первой китайской собственной лицензией на открытое программное обеспечение. Она более свободна по сравнению с использовавшейся ранее Apache V2 и лучше соответствует реалиям. Второе, даже если кто-то нарушает права, судебные расходы на защиту ваших прав могут быть очень высокими, что обычно приводит к тому, что дело остается нерешенным. Поэтому выбор любой лицензии одинаков, поддержка отечественного производства!
Открытая лицензия была изменена с Apache V2 на Лицензию Mulan PSL v1, которая предоставляет больше свободы.
Добавлены тестовые примеры для получения пользовательского значения SessionId (спасибо @loyating)
По умолчанию используется имя текущего метода при пустом шаблоне аннотации View
Добавлен метод Imi\Util\File::isEmptyDir()
для проверки того, пустой ли каталог
Добавлено аннотационное ограничение InEnum для проверки наличия значений в списке перечислений
Объект Request получил новые методы request()
, hasRequest()
, данные запроса включают get/post/cookie
Добавлены тестовые примеры для классов валидации
Добавлены тестовые примеры для автоматической валидации аннотаций
Исправлено зависание процесса из-за ConnectContextRedis
Исправлено невозможность установления соединения после горячего перезапуска WebSocket
Исправлено невозможность запуска проекта через vendor/bin/imi
Все упоминания "IMI" были заменены на маленькие буквы "imi"
Добавлены записи логов запросов для тестовых случаев HttpServer
После тестирования WS-запросов был переключен обработчик YurunHttp на Curl
Переработана реализация ViewHandler
Добавлены конфигурация и руководство по выполнению тестовых скриптов, конфигурация MySQL и Redis в тестовых случаях может быть установлена через системные переменные окружения
Поддержка атрибута updateTime
в аннотациях столбцов модели. При значении true
, при сохранении или обновлении записей будет автоматически заполняться текущее время.
Поддерживаемые типы данных: date/time/datetime/timestamp/year/int/bigint
.
При типе данных int
— запись времени в секундах,
при типе данных bigint
— запись времени в миллисекундах.
Возможность запуска проекта с помощью команды vendor/bin/imi
. Автоматическая попытка загрузки файла vendor/autoload.php
в следующем порядке:
рабочий каталог,
каталог фреймворка,
в случае отсутствия — выбрасывается ошибка.
По умолчанию ключи Redis-драйвера для ConnectContext
, Group
, Session
автоматически дополняются пространством имён проекта.
Добавлен метод Lock->getLockCoId()
.
Улучшение сообщений об ошибках горячего обновления.
Усовершенствованы тестовые примеры TCP.
Улучшение вывода логов после ошибок тестирования .travis
.
Исключение при неудачной попытке получения блока ConnectContext
.
Оптимизация: сервер использует список пространств имён контроллеров, указанных в конфигурации beanScan
сервера.
Исправление ошибки горячего обновления вызванной багом Swoole 4.4.3.
Исправление проблемы блокировки Redis.
Исправление проблемы записи результата рукопожатия WebSocket в RequestContext
.
Исправление ошибки при сохранении результата маршрута HTTP WebSocket.
На этой неделе были проведены рефакторизации аннотаций и внутренних данных маршрутов, заменив массивы kv на объектное хранение. Это позволило снизить потребление памяти, увеличить скорость вызова и сделать обслуживание более удобным.
Перед выпуском imi был приведен в соответствие с последней версией Swoole 4.4.3.
Тестовые случаи продолжают совершенствоваться; на данный момент имеется 134 тестовых случая и 480 утверждений.
Официальный сайт (https://www.imiphp.com/) получил новый дизайн, спасибо @Фэнчен за помощь!
Добавлены тестовые случаи для WebSocket сервера
Добавлены тестовые случаи для TCP сервера
Добавлены тестовые случаи для UDP сервера
Добавлены тестовые случаи для модели
Добавлены тестовые случаи для логгера
Поддержка запуска от bin/imi
Добавлено новое функциональное объявление imiGetEnv(), являющееся упаковкой для функции getenv(), поддерживающей значения по умолчанию
В generate/model добавлен параметр basePath
Исправлено поведение метода save() модели, которое не позволяло получить значение автоинкрементируемого первичного ключа через свойства после выполнения
Исправлено неработоспособное состояние групп соединений
Рефакторинг AnnotationManager, используя объекты вместо массивов kv
Рефакторинг Route, используя объекты вместо массивов kv
Добавлен быстрый класс Lock
Добавлен атомарный процессный замок
Добавлены тестовые примеры для Lock
Добавлены тестовые примеры для аннотаций Lock
Усилен типовой определенный интерфейс Lock
Поддержка конфигурационной установки Lock
, управление по lockId
Исправлена проблема с возвратом значения типа boolean
при выполнении обратного вызова в методе tryLock()
Поддержка использования классов для определения структуры
Поддержка установки MemoryTable
в конфигурациях
Добавлены тестовые примеры для MemoryTable
Исправлены проблемы MemoryTableManager
Переработано, теперь ConnectContext
не хранит данные локально, что позволяет безопасно читать и писать одновременно нескольким рабочим процессам
Добавлена поддержка блокировки для чтения и записи данных, теперь чтение и запись не конфликтуют, обязательно установите блокировку, будьте внимательны при обновлении!
Добавлена поддержка оператора обработки таблицы памяти ConnectContext
Добавлен обработчик RedisHash
по умолчанию defaultHashKey
Добавлены тестовые примеры для кэша
Добавлены тестовые примеры для аннотаций кэша
Исправлены проблемы с возвращаемыми значениями обработчиков Redis/RedisHash
кэша
Исправлены проблемы с удалением файлов .ex
при использовании метода delete()
кэша
Исправлены проблемы с отсутствием возвращаемого значения при использовании метода clear()
кэша
Исправлены проблемы с ключами, представляющими собой цифры, при использовании метода getMultiple()
кэша
Добавлен событие открытия WebSocket
open
Создание контекста соединения WebSocket
перемещено перед выполнением промежуточного программного обеспечения, позволяющее работать с контекстом соединения внутри промежуточного программного обеспечения
Реализация автоматического освобождения RequestContext
с помощью defer
Добавлена поддержка опций конфигурации для Redis
(\Redis::OPT_XXX
)
Поддержка установки состояния группы серверов, активна ли группировка
Изменено: если PoolResource->checkState()
равно false
, то сначала close()
, затем open()
Очистка пула и объектов кэширования в initWorker()
Обеспечение работы тестовых примеров в корутине
Исправлены проблемы с завершением GroupRedis
и ConnectContextRedis
до полного завершения приложения
Освобождение Db Statement
перемещено в Db
Добавлено возвращаемое значение типа Response
в методе dispatch()
HttpDispatcher
Исправлены проблемы с возвращаемым значением метода wakeup()
AtomicManager
Ощутимое повышение производительности горячей перезагрузки, время выполнения снизилось с секунд до миллисекунд
Небольшое увеличение скорости холодной загрузки
Добавлены тестовые примеры для загрузки файлов
Исправлена проблема освобождения кэша Db Statement
Исправлена проблема горячей перезагрузки Inotify
Добавлены юнит-тесты (PHP 7.1-7.4, nightly все прошли), теперь можно не бояться, что исправление одного бага приведет к появлению других. Это долгий процесс, требующий постоянного пополнения тестовыми случаями. Участие в открытом проекте может стать отличной рекомендацией при устройстве на работу, поэтому всем желающим предлагается внести свой вклад в создание тестовых сценариев.
Добавлена функциональность Imi\Util\Coroutine::create()
, которая работает аналогично imigo()
.
Добавлен класс Imi\Util\Http\MessageUtil
.
Добавлены константы для определения приоритета работы фреймворка, класс Imi\Util\ImiPriority
.
Исправлено проблемное поведение горячего перезапуска: выход рабочих процессов со значением времени ожидания выхода, принудительное завершение.
Исправлено неполучение PDO Statement кэша.
Исправлено повторное записывание логов.
Исправлено отсутствие записи последнего выполненного SQL запроса методом MySQL->query()
.
Исправлено некорректное определение параметров слушателя события task
при установке task_enable_coroutine
без enable_coroutine
.
Исправлено определение типов.
Исправлено невозможность освобождения нового экземпляра RedisManager::getNewInstance()
методом RedisManager::release()
.
Исправлены типы данных Redis.
Исправлено поведение withAddedHeader()
.
Исправлено некорректное внедрение зависимостей при использовании TAutoInject
с наличием родительского класса.
Исправлено невнесение аннотаций Callback
и CallableValue
в свойства.
Исправлено невнесение аннотаций для внесения значений конфигураций и констант в свойства.
Оптимизирован метод BeanProxy::getConfigInjects()
.
Оптимизирован класс Imi\Db\Query\Result
.
Задачи, отправленные из процессов, кроме рабочих, больше не автоматически завершаются.
Исключено получение null
при вызове getResource()
пула синхронизации, всегда выбрасывается исключение.
Поддержана возможность возвращаемого значения метода ITaskHandler->handle()
автоматического завершения задачи.
Нормализован приоритет внутренних слушателей события IMI.INITED
.
Оптимизирован BeanProxy
, теперь он немедленно освобождается, а не ждет окончания цикла сбора мусора.
Класс аннотации для внесения значений свойств изменен на Imi\Aop\Annotation\BaseInjectValue
.
Принудительно включен режим корутин для процессов и пулов процессов.
приложениях"
imi — это фреймворк для разработки приложений на основе PHP корутин, который поддерживает создание HTTP API, WebSocket, TCP и UDP приложений.
Фреймворк использует мощный движок Swoole с такими особенностями, как постоянное хранение данных в памяти и асинхронное неблокирующее чтение данных через корутины.
imi следует стандартам PSR и предоставляет такие компоненты, как AOP, аннотации, пулы соединений, управление контекстом запросов, ORM модели и другие часто используемые компоненты.
Модели imi поддерживают определение связей между объектами, позволяя выполнять операции создания, чтения, обновления и удаления одновременно!
Ю Рунь, житель Уси, провинции Цзянсу, родился в 1 Yö 94 году. В средней школе он начал работать с языком программирования Easy Language, что открыло ему мир программирования.
В 2013 году он разработал и выпустил фреймворк YurunPHP (в настоящее время обслуживание прекращено).
С 2017 года он активно занимается использованием Git и выпуском открытых проектов. Он работает над тем, что может использовать сам, а не просто ради того, чтобы сделать еще одно "колесо".
В 2018 году он начал работать с Swoole, что открыло перед ним новые возможности использования PHP.
16 апреля 2018 года он написал первый байт кода для imi.
21 июня 2018 года был выпущен первый публичный версионный продукт v0.0.1.
После одного года практического использования, 21 июня 2019 года, в годовщину запуска, была выпущена версия v1.0.0.
Открытые проекты Ю Руня: imi, YurunHttp, YurunOAuthLogin, PaySDK, ChineseUtil
Комплексное руководство по разработке
SixMQ (Ю Рунь)
Блог Mandian (Mandian)
Другие проекты по работе причинам недоступны. Однако известно, что компания, где работает автор, использует imi.
Как было упомянуто выше, в 2018 году автор начал работать с Swoole, что открыло перед ним новый мир возможностей использования PHP.
Автор считает лучшим способом обучения использование технологии на практике. Без реальных примеров применения знания быстро забываются. До этого автор имел опыт работы с фреймворком YurunPHP, поэтому решил создать свой собственный фреймворк.
Перед разработкой imi автор исследовал несколько популярных фреймворков и решил использовать аннотации в imi. Преимущества и недостатки аннотаций лучше всего объясняются поиском информации в интернете, поэтому здесь нет необходимости повторяться.
На данный момент большинство фреймворков Swoole акцентируют внимание на микросервисах, но концепция дизайна imi заключается в следующем:
Микросервисы могут быть реализованы, но они не обязательны
Автор полагает, что большинство компаний не нуждаются в микросервисах или не имеют необходимости в их внедрении. Разработка и поддержка микросервисов требуют значительных затрат, и если компания не имеет достаточного объема бизнеса, то внедрение микросервисов может привести к обратному эффекту.
На данный момент imi реализует базовый компонент imi-rpc и поддерживает протокол Hprose. Хотя более глубокое внедрение пока не выполнено, это указывает на концепцию дизайна imi, которая позволяет иметь возможность, но выбор остается за разработчиком.
Поэтому, на данный момент основной акцент imi делается на разработку монолитных приложений. Приложение, работающее на Swoole, может обеспечивать лучшую производительность и больше возможностей для обработки запросов по сравнению с FPM, особенно при больших вызовах внешних API.
Разработка приложений с использованием протоколов WebSocket, TCP и UDP также является преимуществом Swoole.
Конечно, Swoole также отлично подходит для разработки middleware, а не только CRUD.
В будущем imi будет продолжать развиваться в направлении микросервисов, однако сейчас основное внимание уделяется совершенствованию текущих монолитных приложений.
GitHub отзывы: https://github.com/Yurunsoft/IMI/issues
SegmentFault вопросы: https://segmentfault.com/
Открытый вопрос OSChina: https://www.oschina.net/question
Общение в QQ группе: 17916227 .
Приветствуем друзей, которые действительно любят программирование, а не просто рассматривают его как работу, присоединиться к команде разработчиков imi!
Два месяца не обновлялся версионный номер, но это не значит, что imi прекратил своё существование — просто мне было слишком много работы!
Наша компания использует imi в проектах уже давно, за последние два месяца большую часть времени мы уделяли исправлению ошибок и улучшению деталей пользовательского опыта.
Выпуск версии v0.3 является сводкой наших достижений за этот период, и я хочу поблагодарить всех участников сообщества за их вклад в развитие imi!
И последнее, до выхода полноценной версии imi v1.0 остаётся всё меньше и меньше времени!
Добавлен метод фильтрации аргументов FilterArg
Добавлен метод ArrayUtil::random() для получения случайного элемента массива
Добавлен функционал imigo (запуск корутин с автоматическим созданием и удалением контекста)
Добавлен функционал imiCallable (автоматическое создание и удаление контекста для переданного обратного вызова)
Добавлены события IMI.REQUEST_CONTENT.CREATE и IMI.REQUEST_CONTENT.DESTROY
Добавлены аннотации DbInject, RedisInject, PoolResource,
позволяющие внедрять объекты соединений в свойства
Добавлена возможность вычисления общего количества страниц на основе колич�数字需要翻译吗?如果不需要,这段文本已经正确翻译了。如果有特殊要求,请告知。根据提供的规则,这里似乎不需要进一步的修改或补充说明。因此,保持原文格式和内容不变是最合适的处理方式。如果需要将数字转换为文字或其他特定操作,请明确指示。
继续:
量 записей, Pagination->calcPageCount
Обновлена логика генерации моделей, теперь определение таблицы находится в базовом классе, а реальные модели наследуют его,
при повторной генерации модели не будут перезаписываться
Теперь Before аннотации могут менять параметры
Аннотация ExtractData больше не зависит от аннотации HttpValidation
По умолчанию путь runtime перемещён в директорию .runtime в корневой части пространства имён проекта,
чтобы избежать очистки временного хранилища системой Linux
При горячем обновлении runtime директория теперь исключена из списка мониторинга
По умолчанию значение maxActiveTime конфигурации пула соединений установлено как null, добавлен параметр maxUsedTime
Конфигурация пула соединений теперь не запускает таймер при gcInterval = null
Отключение установки имени процесса на MacOS для решения проблемы ошибок
Минимальное количество ресурсов пула соединений по умолчанию установлено как 1
Метод join запроса БД теперь поддерживает псевдонимы для таблиц,
Пример: Db::query()->join('table as alias')
Поддержка типа данных bool для PDO Statement
Для ключей аннотаций кэширования теперь можно использовать {:args} для хеширования всех параметров метода
При использовании Swoole корутин Redis добавлена поддержка метода _serialize()
Добавлен анализ типа сервера при инициализации маршрутов
Обновлен путь файла для проверки горячего обновления в runtime директории
По умолчанию тип рендера аннотации View изменён с html на json,
Причина: использование imi рекомендуется для разработки API, а не для рендеринга backend страниц
Исправлены неверные комментарии
Исправлен потенциальный проблемный момент в middleware Session
Исправлены проблемы с аннотацией ExtractData при определённых условиях
Исправлены проблемы с моделью внутренней таблицы при несоответствии названия свойства и Column аннотации
Исправлены проблемы с моделью внутренней таблицы при возникновении ошибки Trying to get property of non-object
Исправлены проблемы с buildRuntime
Исправлены проблемы с Statement
Исправлены проблемы с остатками соединений после их закрытия (в результате кэширования Statement)
Исправлены проблемы с освобождением ресурсов пула соединений и превышением максимального количества ресурсов при параллельном использовании
Исправлены проблемы с повторной инициализацией пула
Исправлены проблемы с обработкой ключевых слов запроса БД
Исправлены проблемы с ошибками при удалении файлов во время горячего обновления
Исправлены проблемы с notice
Исправлены проблемы с невозможностью запуска командной строки внутри фреймворка в некоторых случаях
Исправлены проблемы с методом leftJoin() запроса, который фактически выполнял inner join
Исправлены проблемы с middleware WS, TCP, UDP
Исправлены проблемы использования кэша вне контекста сервера
Исправлены проблемы с SQL запросами с использованием ?
Исправлены проблемы с недействительностью аннотаций после выполнения imi/buildImiRuntime
Исправлены проблемы с повторным отправлением send(), вызывающими ошибку Http request is finished
Исправлены проблемы с handshake WebSocket
Исправлены проблемы с невозможностью запуска проекта в некоторых средах
Исправлены проблемы с инъекцией свойств через конфигурацию
Исправлены проблемы с багом в логике определения числа logCacheNumber
Исправлены проблемы с ошибкой Call to a member function isVariadic() on null
Исправлены проблемы с настройками setting для TCP, UDP как подсерверов
Исправлены проблемы с конфигурированием маршрута
Исправлены проблемы с именами процессов пула процессов
Исправлены проблемы с нестрогостью анализа параметров командной строки
Исправлены проблемы с отсутствием использования классов
Исправлены проблемы с buildMessage при проваленной валидации
С момента последнего выпуска прошло почти месяц. За это время работа над imi
шла полным ходом, исправлялись различные проблемы, а также добавлено множество полезных компонентов и аннотаций.
Эта версия значительно улучшила опыт разработки проектов. Для горячего обновления imi
использует новую технологию частичного обновления. Ранее реинициализация нашего реального проекта в WSL занимала около 6 секунд (время увеличивалось с ростом количества файлов), теперь же благодаря использованию «ядра-кэша» + «частичной перезагрузки при горячем обновлении», независимо от количества файлов, процесс занимает всего одну секунду, обеспечивая быстрый и комфортный опыт!
Кроме того, оптимизация таких областей как ядро-кэш, кэш проекта, повторное использование баз данных Statement и других, заложила прочную основу для производительности и удобства использования во время разработки и производства.
Мы будем продолжать работать над повышением производительности и надежности.
Хочется выразить особую благодарность @wi1dcard за постоянное сотрудничество и всем участникам группы.
На данный момент imi
ещё не является официальной версией, но мы близки к этому. Просим вас набраться терпения!
Добавлен класс RedisManager
(getNewInstance/getInstance/release/getDefaultPoolName)
Добавлен класс Redis
для быстрой работы, например: Imi\Redis\Redis::set($key, $value)
Добавлен конфигурационный параметр redis.quickFromRequestContext
, поддерживающий настройку класса для быстрой работы Redis, использовать RequestContext
для уникального соединения или для получения соединения из пула в режиме реального времени
Поддержка URI-формата для конфигурации пула Redis
Добавлен драйвер кэша RedisHash
Добавлены аннотации Cacheable
, CacheEvict
, CachePut
Реализован многократный вызов Lockable
внутри аннотации Cacheable
Lock
, поддерживающий аннотацию Lockable
, по умолчанию имеет поддержку RedisLock
Добавлена поддержка Config::get('@currentServer.xxx')
, если текущий сервер не содержит конфигурацию, то берётся значение из @app
Добавлена возможность внедрения значений через аннотации, поддерживаются ConfigValue
и другие аннотации, могут использоваться для передачи значений конфигураций в аннотации параметров
Добавлена аннотация Callback
, её класс может совместно использоваться с аннотацией Inject
, чтобы реализовать обратный вызов метода bean-класса
Добавлены значения по умолчанию для свойства args
аннотации Condition
Добавлены аннотации Compare
и ValidateValue
для проверки
Добавлена аннотация ConstValue
, которая позволяет читать значения из констант и внедрять их в аннотации
Добавлена поддержка проверки $headers
, $cookie
, $session
в HTTP-валидаторах
Добавлена поддержка $this
в валидаторах
Добавлена поддержка игнорирования регистра в URL маршрутах
Реализована унифицированная система управления именами процессов
Добавлена поддержка внедрения значений параметров методов
Унифицировано добавление поддержки __clone
для bean-классов
Реализована обработка unset()
модели класса
Добавлен класс Imi\Util\FilterableList
для фильтрации полей списка
Добавлена поддержка URI-формата для конфигурации пулов MySQL и Redis
Добавлена поддержка .env
переменных окружения
Добавлена поддержка replace into
в запросах баз данных
Реализована замена save()
на replace
для модели
Теперь аннотация @ExtractData
может экспортировать отдельные данные $get/$post/$body
Добавлен конфигурационный параметр jsonBodyIsObject
, который позволяет указывать, преобразуется ли POST body в объект или массив при получении JSON, по умолчанию false
- массив. Может использоваться вместе с @app.jsonBodyIsObject
или @currentServer.jsonBodyIsObject
Добавлен класс Pagination
для расчёта пагинации
Добавлен метод filter()
в Imi\Util\ObjectArrayHelper
для фильтрации свойств объекта или массива
Добавлен вывод затраченного времени при горячем перезапуске
Усовершенствованы аннотации магических методов в классе CoroutineRedisHandler
Из-за ошибки PHP, отказались от использования анонимных классов, bean-классы используют eval()+динамическое имя класса
, больше не используется include Bean-кэш файла
, удалены конфигурации и методы кэша Bean. Это привело к повышению производительности.
При запуске рабочих процессов, перезагружаются конфигурация проекта и компоненты
Адаптированы Db
и Redis
для получения имени пула по умолчанию, используя @currentServer
конфигурацию
Теперь параметр $ttl
кэша поддерживает передачу типа \DateInterval
Усовершенствован LazyArrayObject
Все полученные объекты Redis модуля теперь имеют тип Imi\Redis\RedisHandler
Усовершенствованы сообщения и логика перезапуска при горячем обновлении, теперь они используют частичное обновление, что повышает производительность
Добавлена поддержка сборки предварительно загруженного кэша для ядра, что ускоряет горячие обновления при разработке проекта
Усовершенствован обработчик ошибок при завершении программы, теперь он выводит информацию об ошибках или исключениях
Класс Redis
переименован в Imi\Redis\CoroutineRedisHandler
(если указано в пуле, требуется изменение)
Исключение, выбрасываемое при проверке параметров, больше не содержит информации "xxx Проверка параметров неверна"
Изменён формат параметров args
аннотации проверки, обратите внимание на несовместимость с предыдущими версиями
Отказались от встроенной сериализации Swoole, используем php
сериализацию. Причина: Swoole официально прекращает поддержку сериализации
Общие сообщения английского языка стандартизированы
Исправлено получение имени пула по умолчанию в классе Db
Исправлено обрабатывание ошибок аннотаций констант* Исправлено отсутствие триггеров событий в мастере процессов
Исправлено отсутствие ввода HttpRoute в конфигурации сервера
Исправлено предупреждение filemtime при горячем обновлении в определённых условиях
Исправлено возникновение ошибки при использовании Swoole MySQL драйвера в Result->getRowCount()
Исправлено отсутствие записи в кэш файлов при активации однокликовой корутинизации
Исправлены некоторые проблемы обработки переменных аргументов
Исправлено возникновение null при использовании Swoole корутин MySQL fetchAll \PDO::FETCH_COLUMN без указания $fetchArgument
Исправлено отсутствие действия конфигурации @app.pools после горячего перезапуска
Исправлено одно потенциальное предупреждение notice
Исправлены проблемы повторного применения middleware
Исправлено отсутствие данных при вставке или обновлении модели из-за аннотации @Serializable
Исправлены проблемы генерации dev/ext