php / php/php-src

FPM vs CLI - getcwd() !== $_SERVER['DOCUMENT_ROOT'] and include_path

Offen
#19,584 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Feature SAPI: fpm
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.1k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

Description

I'm not yet sure whether this is a bug or an improvement in documentation suffices.

$_SERVER['DOCUMENT_ROOT'] is set by the FPM SAPI (therefore also in INPUT_SERVER 'DOCUMENT_ROOT') and should generally be equal to nginx's root ($document_root) path

However, there is also getcwd() which, unless set in www.conf chdir and modified in https://github.com/php/php-src/blame/master/sapi/fpm/fpm/fpm_unix.c#L457 which should be identical to DOCUMENT_ROOT.

However it is not.
e.g.
root /foo/bar

request: /hello/world.php
which is located in /foo/bar/hello/world.php

DOCUMENT_ROOT will be /foo/bar
but getcwd() will be /foo/bar/hello (essentially dirname( $_SERVER['SCRIPT_FILENAME'] ) )

I'm unable to find where this change of directory happens though - since it's not in https://github.com/php/php-src/blame/master/sapi/fpm/fpm/fpm_unix.c#L457 and there are no other chdir happening.
Could anyone pinpoint this?

php-fpm 5.2 (?) seemed to have

https://linux.die.net/man/8/php-fpm
-C
Do not chdir to the script's directory

which was removed though (I couldn't find details on why though)

This generally is not an issue, however it might be extremely unexpected when using exec() for example.
Would it not make more sense if by default the fpm SAPI would use the DOCUMENT_ROOT by default as cwd?

Where it becomes confusing though is:
https://www.php.net/manual/en/ini.core.php#ini.include-path

Using a . in the include path allows for relative includes as it means the current directory.

"current directory" means DIR and not getcwd() ?

Except in CLI:
https://www.php.net/manual/en/features.commandline.differences.php

The CLI SAPI does not change the current directory to the directory of the executed script.

where it means getcwd() and not DIR ?

Would it make sense to somehow standardize eventually?

Sorry, if this reads confusing, but so am I atm

PHP Version
8.4
Operating System

No response

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit sapi/fpm/fpm/fpm_unix.c rund um die referenzierte Zeile und der chdir-Einstellung in www.conf und vergleiche anschließend das im verlinkten Dokument beschriebene Verhalten von FPM und CLI. Erledigt ist die Untersuchung, wenn festgestellt wurde, wo sich das Arbeitsverzeichnis ändert und ob das Verhalten oder die Dokumentation zum Include-Pfad einer Klarstellung bedarf.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
nginx, php
Bereich
backend
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
28/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.