Поддержка персонализированной связи моделей (#463)
Поддержка установки максимального количества кэшированных Statement (#464)
Оптимизация решения проблемы с большим количеством кэшированных Statement (#464)
Оптимизация значения операции limit()
в конструкторе запросов через подготовленные привязки
Оптимизация пагинационных запросов путём удаления сортировки при подсчёте количества записей для повышения производительности
v2.1.0
2022 год принёс долгожданное выхода imi 2.0 после продолжительной разработки. Версия была выпущена и прошла ещё четыре месяца доработки, что привело к её относительному стабильному состоянию.
imi версии 2.0 и 1.3 являются LTS (Long Term Support) версиями, обеспечивающими постоянную поддержку в виде исправлений ошибок и безопасности. Новых функциональных обновлений не планируется, а также нет временного плана прекращения поддержки этих версий.
imi v2.1.0 представляет две новые возможности: макросы и асинхронные логи. Также минимально поддерживаемый Swoole был повышен до версии v4.8, требования к PHP остались прежними — PHP >= 7.4.
Как следует из названия, теперь записи логов больше не замедляют ответы API за счёт использования асинхронных операций.
Для активации этого режима достаточно добавить 'async' => true
в конфигурацию @app.logger
.
Эта возможность работает только при использовании Swoole.
Поддержка макросов в imi фреймворке.
Можно использовать макросы аналогично C/C++, чтобы выполнять предварительную компиляцию кода на этапе выполнения.
Это позволяет легко совместимо работать с различными версиями и окружениями PHP.
Используя заранее определённые константы, можно повысить производительность и уменьшить количество условных проверок во время выполнения программы.
Этот компонент основан на Yurunsoft/php-macro, который был разработан командой Yurun.
Это экспериментальная новая функциональность, представленная в imi v2.1.0
Проект может быть установлен через composer, следуя правилам автоматической загрузки PSR-4. Добавьте следующую информацию в ваш composer.json
:
{
"require": {
"imiphp/imi-macro": "~2.1.0"
}
}
Поддерживаемые расширения файлов: *.php
, *.macro
.php
Необходимо добавить строку # macro
в любом месте файла.
Эта строка должна быть расположена на отдельной строке без пробелов перед ней.
При запуске A.php
будет создан новый файл A.php.macro.php
в том же каталоге.
.macro
Создайте файл A.php
с пустым содержимым.
Затем создайте файл A.macro
и напишите в него PHP код.
При запуске будет создан новый файл A.macro.php
в том же каталоге.
Макрос: #define
, #const
, #ifdef
, #ifndef
Пример:
#ifndef IN_SWOOLE
# define IN_SWOOLE extension_loaded('swoole')
#endif
#ifdef IN_SWOOLE
#if IN_SWOOLE
\Co\run(function(){
echo 'hello world';
});
#endif
#endif
Внимание: константы, определенные с помощью макросов, действуют только на этапе генерации кода, но не влияют на его выполнение.
Макрос: #if
, #else
, #elif
, #endif
Пример:
<?php
#if version_compare(PHP_VERSION, '8.0', '>=')
function test(): string|false
#else
/**
* @return string|false
*/
function test()
#endif
{
return 'hello world';
}
Код, сгенерированный при работе с PHP >= 8.0:
<?php
function test(): string|false
{
return 'hello world';
}
Код, сгенерированный при работе с PHP < 8.0:
<?php
/**
* @return string|false
*/
function test()
{
return 'hello world';
}
Поддержка горячего обновления для перезагрузки конфигурационных файлов
Добавлены методы Server::getConnections(), Server::getConnectionCount() (#203)
Поддержка динамического записи данных в модели, но не поддерживаются toArray() и сериализация
Поддержка отслеживания SQL с возможностью поймать исключения
Поддержка вывода информации о сети при запуске окружения Workerman
Этот выпуск реализует функционал предварительной загрузки связей с использованием with(). Это позволяет уменьшить количество запросов и повысить производительность.
Поддерживается установка with=true
в аннотациях связи для автоматической предварительной загрузки
Поддерживается установка withFields={"указанные поля сериализации"}
в аннотациях связи
Поддерживается вызов метода with()
после Model::query()
для указания атрибутов предварительной загрузки
Поддерживается вызов метода with()
после Model::query()
для указания атрибутов предварительной загрузки со связанными обратными вызовами
Поддерживается вызов метода withField()
после Model::query()
для указания полей сериализации для полученной модели
Поддерживается предварительная загрузка при вызове Model::queryRelationsList()
Улучшение опыта разработки (#197)
Оптимизация производительности сканирования файлов в Swoole
Совместимость с отключенным режимом коротких имён в Swoole
Оптимизация обработки пути приложения AppContexts::APP_PATH как абсолютного пути
Улучшение обработки ошибок парсинга JSON
Улучшение юнит тестов (#202)
Переработка HTTP маршрутов для повышения производительности (#200)
Улучшение сообщений об ошибках при работе с типом ArrayList
При создании моделей методы get() для полей типа json теперь используются для возврата значений по ссылке, что упрощает изменение данных
Улучшение некоторых частей кода
Исправление проблемы срабатывания конфигураций @app.overrideDefaultIgnoreNamespace и @app.overrideDefaultIgnorePaths
Исправление проблемы инициализации URI при вызове setUri()
Исправление проблемы преобразования компонента управления правами в древовидную структуру (#201)
Исправление проблемы обработки сессий с пустым ID как действительных
Исправление проблем парсинга пустых сессий JSON
Исправление работы Swoole RedisServerUtil
Исправление проблемы получения packetData из контекста запроса для протокола UDP в Workerman
Исправление проблемы использования параметра fields в аннотациях ManyToMany, PolymorphicToMany и PolymorphicManyToMany
imi v2.0 выпущена, это PHP-фреймворк для распределённой разработки с долгоживущими соединениями
imi — это фреймворк для PHP, поддерживающий долгоживущие соединения и микросервисы в распределённой среде. Он может работать в контейнерах PHP-FPM, Swoole и Workerman.
imi позволяет создавать HTTP-интерфейсы, а также постоянные службы, такие как HTTP2, WebSocket, TCP, UDP и MQTT.
imi имеет множество функциональных компонентов, и версия v2.0 включает два решения для распределённых долгоживущих соединений.
Фреймворк imi уже используется в следующих проектах:
Первый выпуск imi состоялся 21 июня 2018 года.
Благодарю всех разработчиков за тестирование imi 2.0, предложения и отчеты об ошибках!
Спасибо @Gumo666, @NHZEX и @loyating за вклад в документацию и код imi.
Юрунь (Чжан Юньью) родился 12 марта 1994 года (День леса) в Уси.
Учился программированию самостоятельно ещё в 8 классе. Люблю C#, но судьба распорядилась иначе, и теперь я работаю с PHP.
Основатель фреймворка imi, участник группы разработчиков Swoole, автор серии компонентов Yurun PHP.
Открытые проекты включают imi, PaySDK, YurunHttp, Guzzle-Swoole, YurunOAuthLogin, ChineseUtil и другие.
Версия 2.0 находится в стадии тестирования и скоро будет выпущена официально.
Создайте проект HTTP-сервера: composer create-project imiphp/project-http
Создайте проект WebSocket-сервера: composer create-project imiphp/project-websocket
Создайте проект TCP-сервера: composer create-project imiphp/project-tcp
Создайте проект UDP-сервера: composer create-project imiphp/project-udp
Пример использования: [https://github.com/imiphp/imi-project-websocket];
Разработка версии imi v2 уже началась (2020-09). Если у вас возникнут какие-либо вопросы, пожалуйста, свяжитесь с нами!
Планы и последние новости imi v2: https://github.com/Yurunsoft/imi/issues/66
imi официально вошел в список проектов GVP на Gitee, так что следите за ними там! (https://gitee.com/yurunsoft/IMI)
В аннотациях маршрутов добавлен параметр paramsBody
, поддерживающий выбор маршрута из JSON или XML.
В аннотациях маршрутов добавлен параметр paramsBodyMultiLevel
, позволяющий указывать, является ли маршрут многоуровневым.
Добавлено проверение повторяющихся маршрутов через UDP.
Добавлено проверение повторяющихся маршрутов через TCP.
Добавлено проверение повторяющихся маршрутов через WebSocket.
Добавлено проверение повторяющихся маршрутов через HTTP.
Исправлено проблемное поведение при отправке данных в событии OnOpen
в WebSocket.
Исправлены проблемы в методах Server->hasGroup()
и Server->getGroup()
.
Исправлены проблемы с проверкой значений по умолчанию для параметров методов.
Исправлены проблемы с использованием одного соединения несколькими корутинами после включения механизма heartbeat в пуле соединений.
Этот выпуск уже включает совместимость с PHP 8.0, а также тестирование автоматизации для PHP 8.0.
Разработка версии imi v2 началась (сентябрь 2020 года). Если вы столкнулись с какими-либо проблемами, пожалуйста, свяжитесь с нами!
Планирование и последние новости imi v2 версии: https://github.com/Yurunsoft/imi/issues/66
imi официально вошел в список проектов GVP на Gitee, так что следите за нами там! (https://gitee.com/yurunsoft/IMI)
В ноябре я провёл две недели в больнице, что привело к отсутствию новых коммитов и выпусков. Сейчас я чувствую себя хорошо и возобновил работу над проектом!
Добавлена аннотация регулярной проверки
Добавлен RequestContextProxy
Добавлены события до и после связывания моделей
Все новые возможности можно найти в документации.
Автоматическое тестирование перешло с Travis CI на GitHub Actions
Добавлено условие проверки fd при работе с контекстом соединения
Улучшено сообщение об ошибке при использовании ключа кэширования, который не является строкой
Удалены лишние параметры привязки из модели генератора
Добавлен повторный запуск для некоторых нестабильных тестов
Исправлено получение атрибутов в RequestProxy
Исправлено получение workerID в Server::sendMessage()
Исправлено отключение кодировки в драйвере Mysqli #71
Исправлено сообщение об ошибке mysqli: mysqli::next_result(): There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method
Учитывая ваш интерес и потребность, версию imi v1 продолжили развивать функционально до выпуска версии v2. Если вам что-то нужно, обязательно сообщите нам!
Работа над версией imi v2 уже началась (сентябрь 2020 года). Если возникнут какие-либо вопросы, пожалуйста, свяжитесь с нами!
Последние планы и новости по версии imi v2: https://github.com/Yurunsoft/imi/issues/66
Проект imi официально вошел в список лучших проектов на платформе Coding (GVP): https://gitee.com/yurunsoft/IMI
Проголосуйте за imi: https://www.oschina.net/project/top_cn_2020#imi
Добавлен новый тип поля модели — список.
Добавлена поддержка внедрения и аннотаций для методов с модификатором protected
.
Учитывая ваш интерес и потребность, версию imi v1 продолжили развивать до выпуска версии v2. Если вам что-то нужно, обязательно сообщите нам!
Работа над версией imi v2 уже началась (сентябрь 2020 года). Если возникнут какие-либо вопросы, пожалуйста, свяжитесь с нами!
Последние планы и новости по imi v2: https://github.com/Yurunsoft/imi/issues/66
imi официально вошел в список проектов GVP на платформе Coding, так что вы можете следить за ними там! (https://gitee.com/yurunsoft/IMI)
Проголосуйте за imi: https://www.oschina.net/project/top_cn_2020#imi
Введен стандарт форматирования кода
Класс Random теперь генерирует случайные символы, поддерживаются случаи, когда передается только $min, используя фиксированную длину #68
По умолчанию значение конфигурационной опции requestResourceCheckInterval соединения было изменено с 3 на 30, также допускается установка значения null для отключения ограничений
Произведены некоторые оптимизации кода
Исправлены проблемы совместимости с PHPUnit
Исправлены проблемы совместимости с $_SERVER в некоторых случаях
Исправлены некоторые орфографические ошибки
Эта неделя также прошла в удалённой работе, занимаясь различными проектами. Обновление концепции Partial
очень мощное и полезное, рекомендую ознакомиться.
Видео-уроки imi обновлены до девятой серии "Модели и ORM": https://www.bilibili.com/video/av78158909/
Введение концепции Partial
(документация)
Добавлена поддержка аннотаций для установки ключевых полей в модели дерева (документация)
Улучшение класса пула соединений Redis
Улучшение проверки пароля при подключении Redis, теперь пустая строка не приведёт к попыткам входа с использованием пароля
Улучшение кода модели дерева
Улучшение логики горячего обновления процесса
Концепция Partial
в imi была заимствована из C#. Partial
позволяет разделить один класс на несколько файлов для записи.
На данный момент PHP версии 7.4 ещё не поддерживают концепцию Partial
на уровне языка.
Однако благодаря мощному контейнеру объектов imi удалось реализовать концепцию Partial
в PHP.
Использование очень простое — используйте trait
, добавьте аннотацию @Partial
, чтобы легко внедрять его.
При коллективной разработке несколькими людьми, изменения одного файла класса могут вызвать конфликты. Если заранее определены интерфейсы и методы распределены между участниками, каждый может работать над своим участком без опасений конфликтов.
Когда методы класса многочисленны и трудно разделить их, разбиение на несколько файлов поможет лучше поддерживать код.
Для некоторых классов, созданных с помощью инструментов, если вы добавите свой код, а затем снова сгенерируете часть содержимого, ваш код будет затёрт. Используя Partial
в другом файле, можно избежать этого.
Перед введением концепции
Partial
в imi, генератор моделей ими помещал сгенерированный код в родительский класс, а пользователи продолжали разрабатывать свои классы как потомков.
Первую неделю работы из дома быстро заполнили дела...
Эта неделя принесла множество новых пользователей в imi, каждый вход, отзыв и вклад делает imi всё более мощной и совершенной.
Уверены, что imi будет становиться всё удобнее и сильнее!
Поддержка аннотаций для проверки символов в тексте #46
Добавлен метод контроллера __render()
, который улучшает опыт разработки при работе с отображением страниц Документация
Поддержка планировщика задач, позволяющая выполнять задачи при каждом запуске сервиса, установив значение атрибута force Cron аннотации как true Документация
Удалён один блок try
Удалён вызов функции eval(), заменён безопасным альтернативным методом Документация
Улучшение вывода логов консоли
Изменение времени загрузки файла .env, теперь можно использовать функции getenv() и imiGetEnv() для получения значений в конфигурационных файлах #41
Исправление проблемы преобразования полей типа bit модели в некоторых сценариях
Исправление ошибки типизации параметров события после сохранения модели
Исправление ошибки запуска проекта при наличии специального пути
Исправление ошибки "Call to a member function closeCursor() on null" при возникновении ошибки SQL
Исправление проблемы использования пользовательского пула соединений при массовом обновлении модели
Исправление проблемы игнора значения poolName в аннотации модели [#40]
Исправление проблемы отсутствия значения параметра poolName в аннотации Table генератором моделей [#38]
Добавлен метод Imi::getNamespacePaths()
для получения всех путей названий пространства имён.
Добавлена функция File::absolute()
, которая эффективна даже в случае отсутствия файла, в отличие от функции realpath()
.
Поддержка загрузки конфигурационного файла .env
при использовании нескольких директорий для проектных пространств имён.
Поддержка множества значений allowOrigin
в кросс-доменной промежуточной службе OptionsMiddleware
.
Исправление проблемы с альтернативными именами процессов при запуске через менеджер.
Исправление проблем с прокси-классом ответа в контексте корутин.
Приготовьтесь встретить Новый год (отдыхаем), в версии перед новогодними праздниками. После отдыха продолжим обновления.
Добавлен локальный обработчик контекста соединения: ConnectContextLocal, который может использоваться в режиме SWOOLE_BASE.
Добавлена документация для ElasticSearch.
Проблема исправлена.
Устранены предупреждения DEPRECATED.
Выбросить исключение при неудачной идентификации пути рабочей директории во время выполнения
Добавить проверку обязательного включения параметра swoole.use_shortname
для предотвращения проблем, возникающих при использовании других фреймворков, что может помешать правильному запуску imi
Добавлен метод Db::transContext()
Поддержка получения объекта процесса, запущенного вместе с сервисом, #35
Эта неделя принесла компонент imi-jwt, который позволяет легко использовать JWT в рамках фреймворка imi.
Однако JWT отнюдь не является заменой сессий!!! Об этом следует помнить всем!!!
За последнее время было много работы над проектами, естественно, используя фреймворк imi... Желаю вам иметь здоровую шевелюру в 2020 году!
[Урунь] Курс для новичков по работе с фреймворком imi на основе PHP + Swoole | Обновление каждую пятницу | От лысины до пышной шевелюры, чтобы вы имели больше времени для работы и отдыха, а также возможность найти вторую половинку
Перейти к бесплатному курсу "От лысины до пышной шевелюры" по фреймворку imi https://www.bilibili.com/video/av78158909
Каждую пятницу вечером выходят новые эпизоды~
Добавлен компонент imi-jwt, позволяющий легко использовать JWT в рамках фреймворка imi (Подробнее)
Добавлена поддержка слушателей событий завершения и откатывания транзакций (Документация)
Теперь метод Event->off() может вызываться без передачи второго параметра, что позволяет очистить все слушатели события (Документация)
Поддержка аннотаций для контроллеров и действий WebSocket для ограничения маршрутов рукопожатия (например, только при рукопожатии определенного URL можно запустить обработку) (Документация)
При рукопожатии WebSocket URI объект записывается в ConnectContext
Добавлен TNotRequiredDataToProperty, который позволяет не передавать параметры конструктора, как и TDataToProperty
Рефакторинг: разделение объектов управления транзакциями баз данных
Оптимизация генерации классов Facade, теперь параметры и значения возвращаемых значений могут быть null, а также поддерживаются значения по умолчанию для параметров
Оптимизация сообщений об ошибках при отсутствии основного класса
Исправлено поведение записи контекста соединения после ответа на рукопожатие, которое иногда приводило к некорректным данным в контексте соединения сразу после рукопожатия
Исправлен баг с откатом вложенных транзакций
Исправлены проблемы типизации параметров в некоторых случаях
Исправлены проблемы записи метода ConnectContext::multiSet()
Исправлены конфликты конфигурации при использовании HTTP-сессий несколькими службами
Эта неделя принесла с собой компонент imi-amqp, который позволяет использовать очередь сообщений, поддерживающую протокол AMQP, такие как RabbitMQ, в рамках фреймворка imi.
Теперь вы можете использовать очереди сообщений в рамках фреймворка imi!
[Урок] Введение в фреймворк imi на основе PHP + Swoole для начинающих | Обновление каждую пятницу | От лысины до пышной шевелюры, чтобы вы имели больше времени для работы и отдыха, а найти пару стало мечтой
Нажмите здесь, чтобы бесплатно посмотреть видеоуроки от лысины до пышной шевелюры по фреймворку imi https://www.bilibili.com/video/av78158909
Каждый четверг или пятницу вечером мы добавляем минимум один эпизод~
Добавлен компонент imi-amqp (ссылка)
Поддержка замены точки "." на двоеточие ":" в ключах при использовании кэширования Redis (документация)
Поддержка установки префикса для ключей кэша Redis (документация)
Улучшение запуска процессов вместе со службой (документация)
Исправление проблемы с блокировкой ресурсов пула подключений
Исправление ошибок, возникающих при проверке сердцебиения пула подключений
Исправление проблемы с возвратом метода ping() Redis при версиях расширения 5.x
На этой неделе были выполнены работы по улучшению совместимости, чтобы сделать использование фреймворка IMI в различных системах более удобным.
[Урюн] Введение в фреймворк IMI на основе PHP + Swoole | Обновление каждую пятницу | От лысины до пышной шевелюры, позволяющее вам больше времени проводить на работе за просмотром воды, а также сделать вашу жизнь без пары мечтой
Перейти к бесплатному просмотру уроков от лысины до пышной шевелюры по фреймворку IMI https://www.bilibili.com/video/av78158909
Обновлено четвертое занятие, минимум одно занятие обновляется каждый четверг~
Улучшение совместимости с macOS и некоторыми версиями Linux
Изменение имени файла сокета процесса Cron
Исправлены проблемы с классом Bean
Исправлены случаи, когда аннотации не работали
Исправлены случаи, когда ошибки не регистрировались
Исправлены проблемы использования горячего обновления в macOS, теперь используется Unix socket для связи
Исправлены проблемы с аннотациями проверки данных callable={@Inject("BeanName"), "methodName"}
Исправлены проблемы генерации команд imi в некоторых окружениях
На этой неделе были выполнены оптимизации уровня базовых компонентов, а также исправлены некоторые ошибки, сообщенные пользователями. Подробнее можно узнать в разделе "История обновлений".
На этой неделе вышло два новых видеоурока (2. HTTP запросы и ответы, 3. HTTP middleware): смотреть здесь.
Кроме того, компания imi начала активное развитие в области Интернета вещей, выпустив временную версию ORM для временного базового хранилища данных InfluxDB: GitHub
ORM для временного базового хранилища данных InfluxDB, который завершает эпоху отсутствия ORM для этого типа баз данных.
Поддерживает основные операции, работает с окружением php-fpm и Swoole, легко переключается между различными средами.
Может использоваться во всех традиционных фреймворках и всех фреймворках Swoole!
Приглашаем вас попробовать!
Добавлен параметр -runtime
команды server/reload
, позволяющий обновить кэширование времени выполнения перед перезагрузкой сервиса (Документация)
Добавлен параметр $caseSensitive
для методов Text::startwith()
и Text::endwith()
: $caseSensitive = true
(Документация)
Исключения теперь будут выбрасываться при захвате ошибок в задачах по расписанию.
Теперь поддерживаются бесконечные уровни Previous
в логах ошибок.
Добавлена возможность игнорировать сканирование определённых классов или пространств имён (ignoreNamespace)
Добавлен тип медиа MediaType::IMAGE_ICON
Класс быстрых действий Redis теперь поддерживает метод evalEx()
(Документация)
Корректировка пульса пула соединений теперь выполняется только для свободных ресурсов, что предотвращает возникновение ошибок при работе нескольких корутин.
Исправлено предупреждение в CronProcess
.
Внесены изменения для улучшения семантики некоторых участков кода.
Оптимизирован класс Statement
. Получение последнего ID после выполнения insert
или replace
происходит только тогда, когда это требуется.
Обработчики аннотаций больше не обрабатывают аннотации, отличные от imi, что улучшает совместимость с другими библиотеками.
Обновлены пространства имён зависимостей аннотаций.
Последнюю неделю мы реализовали поддержку HTTP/2, от серверной части до клиентской стороны, как в imi, так и в YurunHttp.
На этой неделе был официально выпущен набор инструментов для разработки сервисов gRPC, gRPC клиента и пула соединений gRPC.
Чтобы сделать ими удобнее работу с фреймворком imi, сегодня мы запускаем курс "Видеокурс для начинающих работы с фреймворком imi", который будет обновляться минимум один раз в неделю.
Ссылка на курс: https://space.bilibili.com/768718/channel/detail?cid=94514
Курс для новичков абсолютно бесплатен! Абсолютно бесплатен! Абсолютно бесплатен!
$this->request
, $this->response
, автоматическое переключение контекста корутин внутри объектаВыбор самого популярного открытого программного обеспечения из Китая в 2019 году, проголосуйте за imi!
https://www.oschina.net/project/top_cn_2019#imi
Добавлена поддержка внедрения конфигураций через beans при запуске сервиса
Добавлена аннотация @PoolClean
, которую можно использовать в методах входа в Tool и Process для удаления или сохранения указанных пулов соединений
Добавлена поддержка механизма heartbeat для пулов соединений с возможностью настройки проверки состояния соединений при получении ресурсов
Улучшена очистка Statement
Улучшена производительность обработки представлений
Улучшена эффективность обработки параметров выполнения действий
Горячее обновление больше не занимает пул соединений
Улучшена производительность преобразования модели в массив
Инструмент process/start теперь возвращает код завершения процесса
Улучшение: при закрытии пула соединений прекращается heartbeat и освобождается пул ресурсов
Автоматическая сборка мусора и heartbeat для пулов соединений могут быть активированы в нерабочих процессах, если есть работающие корутины
Добавлен middleware, который позволяет запустить обработку превышения времени выполнения запроса при превышении максимального времени.
Добавлена поддержка обработки "роутинг не найден" для протоколов WebSocket, TCP и UDP.
Улучшена обработка "роутинг не найден" для HTTP.
Улучшена модель, которая не обновляет значение первичного ключа в методе update()
.
Улучшено автоматическое включение протоколов HTTP и WebSocket при прослушивании порта.
Исправлено проблемное состояние statement как доступного.
Исправлено внедрение целей для ExtractData
.
Исправлено распознавание протокола в Request->getUri()
для http/https/ws/wss.