Skip to content

Web: $_SERVER['DOCUMENT_ROOT'] for docroot-relative paths #296

@PurHur

Description

@PurHur

Problem

PHP apps and frameworks use $_SERVER['DOCUMENT_ROOT'] to resolve includes, templates, and static asset paths. The compiler dev server serves static files from a docroot (#150 closed) but does not expose DOCUMENT_ROOT in $_SERVER, so scripts cannot build paths like:

require $_SERVER['DOCUMENT_ROOT'] . '/config.php';

This blocks #54 include paths, #194 fopen templates, and #246 MiniWebApp layout.

Goal

Set $_SERVER['DOCUMENT_ROOT'] to the absolute docroot directory passed to phpc serve / bin/serve.php (trailing slash optional, match Zend convention).

Scope

  • Superglobals::populateServer() — read DOCUMENT_ROOT from env or accept explicit parameter from serve driver
  • Dev server: putenv('DOCUMENT_ROOT=' . realpath($docroot)) before each request
  • AOT CGI refresh: superglobals_refresh.c copies DOCUMENT_ROOT when present in env
  • PHPT: script echoes DOCUMENT_ROOT matches expected path
  • ServeTest: static file + PHP script both see same root

Acceptance criteria

./phpc serve 127.0.0.1:8080 examples/001-SimpleWeb
php -r '/* via PHPT or fixture */' # asserts DOCUMENT_ROOT ends with 001-SimpleWeb

phpc lint scripts using $_SERVER['DOCUMENT_ROOT'] do not fail on undefined index (#273).

Verification (local / Docker only)

docker run --rm -v "$(pwd):/compiler" -w /compiler php-compiler:22.04-dev \
  ./script/ci-local.sh --filter web_document_root

No GitHub Actions required.

Dependencies

Related

Files

  • lib/Web/Superglobals.php, bin/serve.php
  • lib/AOT/runtime/superglobals_refresh.c

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions