Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: php-debugger/php-debugger
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0.2.3
Choose a base ref
...
head repository: php-debugger/php-debugger
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 0.3.0
Choose a head ref
  • 3 commits
  • 28 files changed
  • 3 contributors

Commits on Aug 13, 2026

  1. Configuration menu
    Copy the full SHA
    4cff6f2 View commit details
    Browse the repository at this point in the history

Commits on Aug 18, 2026

  1. Fix/frankenphp observer cache (#106)

    * Fix observer cache poisoning in FrankenPHP worker mode (#63)
    
    Three coupled changes are needed for line breakpoints to fire on
    functions called by trigger requests after non-trigger requests have run
    in the same worker:
    
    1. xdebug_observer_init: always return real handlers. The Zend engine
       caches the result per zend_function the first time the function is
       observed, so returning {NULL, NULL} when observer_active=false
       permanently blacklists that function — even after a debugger
       connects in a later request that reuses the cached op_array. The
       handlers themselves already fast-path on \!observer_active, so the
       no-debug overhead remains a single load+branch.
    
    2. xdebug_frankenphp_sapi_activate: re-arm observer_active per request.
       FrankenPHP runs PHP_RINIT only once at worker startup; per-request
       only sapi_activate fires. Without this, a worker that started with
       no IDE leaves observer_active=false for the rest of its life, so
       xdebug_execute_begin fast-paths out, no fse is pushed, and
       xdebug_debugger_statement_call bails on its empty-stack check.
    
    3. xdebug_frankenphp_minit: force ZEND_COMPILE_EXTENDED_STMT and
       disable the opcache optimizer at MINIT. The normal RINIT path skips
       this when no IDE is connected at startup, but in the worker flow
       user files are compiled later — by trigger requests that need
       EXT_STMT opcodes already present. Without this, breakpoint_set sees
       an empty "set of executable lines" for the target file.
    
    The `tests/frankenphp/app` workload (`workload()` defined in `lib.php`,
    called from `index.php`) plus `dbgp_listener.py` reproduce the failure
    deterministically: 200 no-trigger requests followed by 5 trigger
    requests previously yielded 0/5 breakpoint hits; with the fix all 5
    hit lib.php:4.
    
    * Last changes to finish the task
    
    * Changes after claude review
    
    ---------
    
    Co-authored-by: Roman Pronskiy <roman@pronskiy.com>
    carlos-granados and pronskiy authored Aug 18, 2026
    Configuration menu
    Copy the full SHA
    585efa0 View commit details
    Browse the repository at this point in the history

Commits on Aug 21, 2026

  1. Configuration menu
    Copy the full SHA
    9dfb60a View commit details
    Browse the repository at this point in the history
Loading