Skip to content
Rapira 0.9.2

Rapira 0.9.2 ​

Rapira 0.9.2 улучшает перезапуск приложений в рабочих процессах, контроль роста памяти и завершение запросов. Этот релиз также сокращает затраты на обработку запросов и добавляет Sodium в пакеты PHP.

Перезапуск приложения с сохранением соединений ​

В режимах worker и dispatcher параметр max_requests теперь перезапускает PHP-приложение внутри того же рабочего процесса. Рабочий процесс снова выполняет входной скрипт. Открытые соединения и запросы в очереди остаются доступны следующему экземпляру приложения.

Перезагрузка через SIGHUP или SIGUSR2, отправленный главному процессу, использует тот же подход. Режим classic игнорирует эти сигналы перезапуска приложения и max_requests, поскольку каждый запрос уже запускает новый цикл обработки запроса PHP.

Перезагрузка сохраняет текущую конфигурацию и дескрипторы gRPC. Перезапустите Rapira, чтобы загрузить изменённые файлы конфигурации или дескрипторов.

Когда рабочий процесс должен остановиться, он может ответить на следующий запрос в каждом существующем соединении HTTP/1.1 перед его закрытием. Это также относится к вызовам Connect и gRPC-Web в пределах заданного времени завершения запросов.

Ограничение памяти каждого рабочего процесса ​

Новый параметр max_memory_mb в [http.pool] и [grpc.pool] задаёт порог резидентной памяти (RSS) в MiB. Главный процесс проверяет RSS раз в секунду. При превышении порога рабочий процесс завершает обслуживание соединений и выходит. Затем главный процесс запускает замену. Значение 0 отключает порог.

Это дополняет перезапуск приложения: замена процесса освобождает память, которая может оставаться выделенной между экземплярами приложения.

Надёжнее обработка запросов, меньше затрат ​

В режиме worker отключение клиента завершает текущий запрос без перезапуска приложения. При превышении PHP max_execution_time рабочий процесс продолжает работать. Режим classic также завершает потоковые ответы, когда обработчик исключения вызывает exit().

Исправления HTTP затрагивают загрузку файлов, проверку длины в sendFile() и ответы HEAD. Статические файлы корректно обрабатывают If-Range. Необработанные тела запросов и тела в формате URL-encoded поступают в PHP через поток в памяти. Чтение файлов использует более крупные блоки, а простаивающие рабочие процессы освобождают неиспользуемую память аллокатора через две секунды.

Ответы gRPC и gRPC-Web используют gzip только в том случае, если запрос использовал gzip. Ответы Connect могут использовать gzip, если клиент его принимает.

Перед обновлением ​

  • Удалите unsafe_field_names из [http]. Конфигурации с этим параметром приводят к ошибке при запуске. Режимы classic и worker всегда отбрасывают имена заголовков, которые могут конфликтовать в переменных CGI.
  • Удалите ссылки на Rapira\Grpc\Call\Protocol::Rest. Поддерживаемые варианты: Grpc, GrpcWeb и Connect.
  • Проверьте PHP memory_limit для приложений, которые принимают большие тела запросов. Необработанные тела и тела в формате URL-encoded теперь учитываются в этом лимите в режимах classic и worker.

Сборки релиза и образы Docker теперь включают расширение Sodium. Архивы Linux также содержат библиотеки, необходимые для libphp.so.

Полный список изменений приведён в примечаниях к релизу.

Обновлено: