Skip to content

v0.21.0

Choose a tag to compare

@github-actions github-actions released this 29 May 07:43
· 56 commits to master since this release
d35fa2f

[0.21.0] - 2026-05-29

Security

  • Validate kernel_class in PHAR stub generation — reject invalid PHP class names to prevent code injection (#263)
  • Validate PHAR alias before stub generation — reject filenames with dangerous characters that could alter generated stub code (#259)
  • Restrict runtime directory creation to explicit 0700 mode — prevents other users on multi-user systems from reading PID/status files (#270, #274, #453)

Performance

  • Pre-compose middleware pipeline once at startup instead of rebuilding on every request (#266)
  • Remove per-request Timer::add(0, ...) for terminate scheduling — reduces event-loop timer churn (#273)
  • Skip file processing in RequestConverter when no files are present in the request (#277)

Changed

  • Remove PharHelper::getProjectDir — thin wrapper that duplicates rtrim() with no added value (#316)
  • Make WorkermanCompilerPass final — leaf class with no subclasses (#312)
  • Extract buildServerBag() and detectFormData() from RequestConverter::toSymfonyRequest() — reduces a 180-line method to coordinated delegates (#301)
  • Extract helper methods from HttpRequestHandler::__invoke() — eliminates duplicate terminate try/catch (#291)
  • Extract magic timeout numbers into named constants in ServerManager — replaces opaque formula comment (#295)
  • Extract shared RecursiveDirectoryIterator setup into a single method — removes duplicated boilerplate in Polling/Inotify watchers (#285)
  • Extract shared AbstractErrorListener and AbstractHandler base classes — eliminates near-identical code in Task/Process error listeners and handlers (#278, #275)
  • Extract configureHandler() from ServerWorker::onWorkerStart() — reduces closure complexity

Fixed

  • Fix StaticFilesMiddleware to work with phar:// stream wrappers — realpath() returns false for phar:// paths, making the middleware unusable when running as PHAR/standalone binary (#447)
  • Fix README.md RebootStrategyInterface example — wrong FQCN caused copy-paste to fail (#289)
  • Add ext-zip and ext-inotify to CI, fix test assertions for missing extensions
  • Fix PHPStan type annotations in test helpers

Tests

  • Add end-to-end tests for Runner::run() covering all decomposed entry points and process lifecycle (#260)
  • Cover full ServerManager public surface with integration tests (#264)
  • Invoke HttpRequestHandler in test instead of only testing construction and inheritance (#253)
  • Add tests for AsProcess and AsTask attributes covering all configuration options (#247)
  • Verify gc_collect_cycles() is actually invoked in MemoryRebootStrategy (#271)

Docs

  • Add troubleshooting guide for long-running worker semantics — covers common pitfalls with stateful services, memory leaks, connection reuse (#283)
  • Resolve @internal vs public-API contradiction in Utils class — Utils::reload() is now explicitly documented as a public API for programmatic graceful worker reload (#290)
  • Disambiguate bin/console in README — clarify it refers to the application's console, not the bundle's bin/ directory; add bin/README.md (#282)
  • Exclude docs/superpowers/ planning artifacts from Composer package export (#298)
  • Expand composer.json keywords and description for Packagist discoverability (#299)