1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yurunsoft-IMI

03.03.2025 16:56
GitLife Service Account

Новое

  • Добавлен вывод IP адреса новой сетевой карты при запуске, улучшена отображаемая информация при старте #29

Улучшение

  • Переработана реализация RequestContext с использованием встроенных методов управления контекстом корутин Swoole. Также удалены методы create, destroy и exists.

  • Улучшено время старта сервера тестовых случаев при работе на многоядерных процессорах.

  • Улучшены некоторые части кода.

Исправление

  • Исправлена проблема с названием полей модели CRUD, являющихся ключевыми словами.

  • Исправлена проблема с использованием метода find() для моделей с составным первичным ключом.

  • Исправлена возможная проблема в методе update() модели.

  • Исправлено использование одиночного экземпляра контроллеров.

Последнее сообщение коммита: 优化代码
03.03.2025 16:56
GitLife Service Account

Срочное исправление проблемы синглтон-контроллера

Последнее сообщение коммита: 修复控制器单例模式问题
03.03.2025 16:56
GitLife Service Account

Новое

  • Добавлена поддержка псевдонимов запросов, что позволяет сократить повторяющиеся шаги при конкатенации запросов.

  • Введены глобальные сверхпеременные 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 модели, где изменения значения данных приводили к изменению значений свойств модели.

Последнее сообщение коммита: 新增支持查询器别名,减少查询器连贯操作重复构建步骤
03.03.2025 16:56
GitLife Service Account

Снова пятница! В последнее время всё больше людей начинают использовать IMI, а сам IMI становится всё лучше. Желаю всем приятного выходного!

Новое

  • Добавлено тестирование производительности моделей.

  • Добавлены примеры тестирования модели Redis.

  • В инструмент генерации моделей добавлен параметр -entity, который позволяет включать использование верблюжьего регистра названий полей; параметр установлен по умолчанию (#27).

Улучшения

  • Усовершенствованы значения возвращаемых значений методов модели Redis.

  • При отсутствии балансировки нагрузки (только один конфигурационный файл соединения) происходит прямой возврат ресурса.

  • Улучшена модель.

  • Улучшены тестовые случаи.

  • Обёрнутый метод getAssocList() дерева моделей преобразован в универсальный метод ArrayUtil::toTreeAssoc().

Исправления

  • Исправлена проблема сессий при установке времени жизни cookie равной 0.

  • Исправлена проблема использования модели Redis при вызове метода ModelManager::getFields().

  • Исправлено поведение метода ArrayUtil::recursiveMerge(), которое приводило к потере ключей при слиянии массивов с числами как ключами.

Последнее сообщение коммита: 优化测试用例
03.03.2025 16:55
GitLife Service Account

Неделя была посвящена запуску пула процессов и высокопроизводительного сервера корутин, что привело к значительному увеличению производительности по сравнению с традиционной моделью, а также в сравнении с моделью BASE.

Новые возможности

Улучшения

  • Улучшена производительность HTTP маршрутов, особенно заметна при большом количестве маршрутов

Исправления

  • Исправлены проблемы остатков процессов после горячей перезагрузки в некоторых случаях
Последнее сообщение коммита: 修复 Http 路由解析问题
03.03.2025 16:55
GitLife Service Account

Основные улучшения были реализованы в части оптимизации внутренней архитектуры фреймворка и повышения производительности обработки контекста запросов, а также проведены небольшие улучшения функциональной стороны.

Проведена полная проверка тестов: 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 в пользовательском процессе
Последнее сообщение коммита: 修复测试
03.03.2025 16:55
GitLife Service Account

Неделя была направлена на добавление паттерна "Фасад" (Facade) и улучшение производительности.

Новые возможности

  • Добавлена поддержка Фасада

  • Добавлен генератор/инструмент для работы с Фасадами

  • Добавлена поддержка определения групп middleware

  • В методе IHttpNotFoundHandler->handler() добавлен параметр $requesthandler

  • В методе RequestContext.create добавлена возможность передачи начальных данных, а также добавлен метод multiSet для записи нескольких значений за один раз

  • Добавлен метод преобразования аннотаций в текстовые комментарии

  • Добавлена поддержка конфигураций для указания событий сервера, которые следует слушать, а также для создания пользовательских событий

Улучшения

  • Улучшена производительность часто используемых событий на базовом уровне фреймворка

  • Улучшена производительность при вызове незапланированных событий

  • Оптимизированы реализации кода, связанные с http-message

  • При недостаточной инициализации запрос теперь отклоняется вместо приостановки

  • Отменены события BufferFull и BufferEmpty

  • Обновлено до версии библиотеки doctrine-annotations, совмещенной с официальной версией 1.7

Исправления

  • Исправлено получение информации об ошибке errorInfo() при работе с базой данных

  • Исправлено проблемное поведение маршрута для методов, не являющихся объектами

  • Избежана странная ошибка в Swoole 4.4.x

Последнее сообщение коммита: 支持定义中间件分组
03.03.2025 16:54
GitLife Service Account

языке, а перевод выполнен на русский язык в соответствии с указанными требованиями.

Новое

  • Добавлена аннотация Inherit, которая позволяет наследовать аннотации родительского класса в дочернем классе. Можно указывать конкретные аннотации для наследования; поддерживаются: классы, методы, свойства, константы.

  • Добавлена middleware OptionsMiddleware, которая решает проблему отправки браузером OPTIONS запроса перед основным запросом с типом application/json.

  • Добавлено событие IMI.HOTUPDATE.BEGIN_BUILD, которое может влиять на процесс сборки при горячем обновлении.

  • Добавлен метод Imi\Util\ClassObject::inNamespace(), который позволяет проверять принадлежность класса к определенному пространству имён.

  • Добавлен метод перечисления файлов, поддерживающий возможность выбора продолжения или прекращения рекурсивного перебора директорий.

Улучшения

  • По умолчанию middleware теперь имеют имя Bean. Это позволяет использовать bean по имени непосредственно в коде.

  • Параметры действий HTTP теперь автоматически принимают значения из parsedBody().

  • Ускорено время прохождения по файлам при горячем обновлении.

  • Интервал времени для обнаружения изменений при горячем обновлении теперь поддерживает миллисекунды, хотя единицей измерения остаётся секунда. Для установки можно использовать десятичные числа.

  • Улучшены метаданные атрибутов моделей, создаваемых системой.

Исправление ошибок

  • Исправлена проблема, когда после установки имени bean его невозможно было использовать в конфигурации beans.

  • Исправлена проблема с невалидной конфигурацией httponly для SessionCookie.

  • Исправлена проблема с частичным обновлением.

Последнее сообщение коммита: 优化 OptionsMiddleware
03.03.2025 16:54
GitLife Service Account

Неделя была направлена на улучшение модели.

На этой неделе был запущен открытый проект на основе 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, что привело к повышению производительности

Исправления

  • Исправление совместимости версий Swoole
Последнее сообщение коммита: 修正注释
03.03.2025 16:54
GitLife Service Account

Недельный отчёт о последних обновлениях:

Улучшения

  • Компонент шаблонизатора 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

Последнее сообщение коммита: 优化 UDP Middleware 机制
03.03.2025 16:53
GitLife Service Account

лицензию 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 в тестовых случаях может быть установлена через системные переменные окружения

Последнее сообщение коммита: 更新 composer.json
03.03.2025 16:53
GitLife Service Account

Журнал обновлений

Улучшения

  • Поддержка атрибута 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.

Последнее сообщение коммита: 完善 TCP 测试用例
03.03.2025 16:52
GitLife Service Account

Журнал обновлений

На этой неделе были проведены рефакторизации аннотаций и внутренних данных маршрутов, заменив массивы 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

Последнее сообщение коммита: 更新支持 Swoole v4.4.3
03.03.2025 16:52
GitLife Service Account

Журнал обновлений

Lock

  • Добавлен быстрый класс Lock

  • Добавлен атомарный процессный замок

  • Добавлены тестовые примеры для Lock

  • Добавлены тестовые примеры для аннотаций Lock

  • Усилен типовой определенный интерфейс Lock

  • Поддержка конфигурационной установки Lock, управление по lockId

  • Исправлена проблема с возвратом значения типа boolean при выполнении обратного вызова в методе tryLock()

MemoryTable

  • Поддержка использования классов для определения структуры

  • Поддержка установки MemoryTable в конфигурациях

  • Добавлены тестовые примеры для MemoryTable

  • Исправлены проблемы MemoryTableManager

ConnectContext

  • Переработано, теперь ConnectContext не хранит данные локально, что позволяет безопасно читать и писать одновременно нескольким рабочим процессам

  • Добавлена поддержка блокировки для чтения и записи данных, теперь чтение и запись не конфликтуют, обязательно установите блокировку, будьте внимательны при обновлении!

  • Добавлена поддержка оператора обработки таблицы памяти ConnectContext

Кэш

  • Добавлен обработчик RedisHash по умолчанию defaultHashKey

  • Добавлены тестовые примеры для кэша

  • Добавлены тестовые примеры для аннотаций кэша

  • Исправлены проблемы с возвращаемыми значениями обработчиков Redis/RedisHash кэша

  • Исправлены проблемы с удалением файлов .ex при использовании метода delete() кэша

  • Исправлены проблемы с отсутствием возвращаемого значения при использовании метода clear() кэша

  • Исправлены проблемы с ключами, представляющими собой цифры, при использовании метода getMultiple() кэша

WebSocket

  • Добавлен событие открытия 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

Последнее сообщение коммита: 优化注释、测试用例
03.03.2025 16:51
GitLife Service Account

Улучшения

  • Ощутимое повышение производительности горячей перезагрузки, время выполнения снизилось с секунд до миллисекунд

  • Небольшое увеличение скорости холодной загрузки

  • Добавлены тестовые примеры для загрузки файлов

Временные решения

  • Исправлена проблема освобождения кэша Db Statement

  • Исправлена проблема горячей перезагрузки Inotify

Последнее сообщение коммита: 增加文件上传测试用例
03.03.2025 16:51
GitLife Service Account
  • Устранение проблем с парсингом условия WHERE в SQL
  • Добавление тестовых случаев для whereEx
Последнее сообщение коммита: 新增 whereEx 测试用例
03.03.2025 16:51
GitLife Service Account

Обновленные изменения

Добавлено

  • Добавлены юнит-тесты (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.

  • Принудительно включен режим корутин для процессов и пулов процессов.

План и прогресс тестирования

  • Aop
  • Конфигурация
  • Кэширование
  • База данных
  • Перечисления
  • События
  • Внедрение
  • Redis
  • HTTP сервер
  • Валидация HTTP
  • WebSocket сервер
  • TCP сервер
  • UDP сервер
  • Задачи
  • Локи
  • Журналы
  • Модели
  • Процессы
  • Утилиты

Изображение

Последнее сообщение коммита: 更新.travis.yml
03.03.2025 16:50
GitLife Service Account

приложениях"

Введение в imi

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

Ключевые компоненты

  • Сервер (HTTP/WebSocket/TCP/UDP)
  • Контейнер (PSR-11)
  • Инъекция AOP
  • HTTP Middleware (PSR-15)
  • Пул соединений MySQL (асинхронный и синхронный, мастер-слейв, балансировка нагрузки)
  • Пул соединений Redis (асинхронный и синхронный, балансировка нагрузки)
  • Последовательные операции базы данных
  • Модели отношений базы данных
  • Модели таблиц общего доступа процессов
  • Модели Redis
  • Логирование (PSR-3 / Файл + Консоль)
  • Кэширование (PSR-16 / Файл + Redis)
  • Валидатор (Validation)
  • Асинхронные задачи
  • Процесс/пул процессов
  • Инструменты командной строки
  • Горячее обновление бизнес-логики

Расширяемые компоненты

imi-rpc

imi-hprose

imi-access-control

imi-rate-limit

imi-shared-memory

Начальная установка

Комплексное руководство по разработке

Пример нового проекта

Приложения на основе imi

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!

Последнее сообщение коммита: Uri::getDomain() 方法改为静态方法
03.03.2025 16:49
GitLife Service Account

Два месяца не обновлялся версионный номер, но это не значит, что 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

  • Аннотация кэширования теперь позволяет указывать метод хеширования, по умолчанию используется md5

Улучшения / Изменения

  • Обновлена логика генерации моделей, теперь определение таблицы находится в базовом классе, а реальные модели наследуют его,
    при повторной генерации модели не будут перезаписываться

  • Теперь 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 при проваленной валидации

03.03.2025 16:48
GitLife Service Account

С момента последнего выпуска прошло почти месяц. За это время работа над imi шла полным ходом, исправлялись различные проблемы, а также добавлено множество полезных компонентов и аннотаций.

Эта версия значительно улучшила опыт разработки проектов. Для горячего обновления imi использует новую технологию частичного обновления. Ранее реинициализация нашего реального проекта в WSL занимала около 6 секунд (время увеличивалось с ростом количества файлов), теперь же благодаря использованию «ядра-кэша» + «частичной перезагрузки при горячем обновлении», независимо от количества файлов, процесс занимает всего одну секунду, обеспечивая быстрый и комфортный опыт!

Кроме того, оптимизация таких областей как ядро-кэш, кэш проекта, повторное использование баз данных Statement и других, заложила прочную основу для производительности и удобства использования во время разработки и производства.

Мы будем продолжать работать над повышением производительности и надежности.

Хочется выразить особую благодарность @wi1dcard за постоянное сотрудничество и всем участникам группы.

На данный момент imi ещё не является официальной версией, но мы близки к этому. Просим вас набраться терпения!

Журнал обновлений:

Добавлено

Redis

  • Добавлен класс 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

Последнее сообщение коммита: 注释完善
1
https://api.gitlife.ru/oschina-mirror/yurunsoft-IMI.git
git@api.gitlife.ru:oschina-mirror/yurunsoft-IMI.git
oschina-mirror
yurunsoft-IMI
yurunsoft-IMI