php / php/php-src

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

Aperta
#19,584 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Feature SAPI: fpm
Lingua principale
C
Stelle
40.4k
Fork
8.1k
Merge medio
2g 13h
PR unite (30g)
96

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia da sapi/fpm/fpm/fpm_unix.c intorno alla riga indicata e dall'impostazione chdir di www.conf, quindi confronta il comportamento di FPM e CLI descritto nella documentazione collegata. Il lavoro è completato quando è stato identificato il punto in cui cambia la directory di lavoro e determinato se sia necessario chiarire il comportamento o la documentazione del percorso di inclusione.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
nginx, php
Ambito
backend
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Da chiarire
Idoneità per principianti
28/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.