php / php/php-src

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

Ouverte
#19,584 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Feature SAPI: fpm
Langage dominant
C
Étoiles
40.4k
Forks
8.1k
Merge moyen
2 j 13 h
PR mergées (30 j)
96

Description

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

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par sapi/fpm/fpm/fpm_unix.c autour de la ligne référencée et par le paramètre chdir de www.conf, puis comparez le comportement de FPM et de CLI décrit dans la documentation liée. Le travail est terminé lorsque vous avez identifié où le répertoire de travail change et déterminé si le comportement ou la documentation du chemin d’inclusion doit être clarifié.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
nginx, php
Domaine
backend
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
28/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.