69 votes

Pourquoi PHP stocke-t-il les fichiers téléchargés dans un emplacement temporaire et quel en est l'avantage ?

Je suis totalement nouveau dans ce domaine et j'ai parcouru quelques tutoriels. J'ai découvert que lors du téléchargement de fichiers en PHP, ceux-ci sont stockés dans un emplacement temporaire.

$file_temp=$_FILES['file']['tmp_name'];
$file_loc="Upload".$file_name;
move_uploaded_files($file_temp,$file_loc);

Maintenant, pourquoi PHP ne permet-il pas de télécharger des fichiers directement à l'endroit souhaité ? Pourquoi sont-ils stockés dans un emplacement temporaire avec une extension .tmp et quel avantage tirons-nous de cette stratégie ?

0 votes

0 votes

Cela ne permettrait-il pas aux clients de télécharger des fichiers de manière arbitraire, même si le script n'était pas destiné à être téléchargé ?

0 votes

Comment saurait-il où se trouve l'emplacement souhaité ?

83voto

bishop Points 3309

Bonne question. La réponse courte est que PHP doit traiter le tout le site Demande HTTP - remplissage $_POST avec des données, et $_FILES si nécessaire - avant de donner le contrôle à votre script. Puisque votre script ne prend pas le contrôle jusqu'à ce que après le traitement, il n'y a aucun moyen d'indiquer à PHP où mettre les données du fichier.

Mais pourquoi PHP procède-t-il de cette façon ? Eh bien, regardons un HTTP POST avec les données du fichier :

POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L

------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--

Remarquez que le contenu de la demande est un document codé en plusieurs parties, avec des champs de formulaire entrecoupés de données de fichier. Dans cet exemple particulier, le champ de formulaire est avant les données du fichier. Cependant, il est possible - voire probable - que les données de formulaire se produisent après les données du fichier.

Donc, afin de garantie que PHP peut vous donner tous le site $_POST PHP doit traiter l'ensemble de la requête. Donc, il pourrait aussi bien compléter le $_FILES super-globale tant qu'elle est là.

Maintenant, PHP pourrait garder les données de ce fichier en mémoire, mais cela pourrait être une mauvaise idée. Pensez à ce qui se passerait si PHP avait besoin de stocker un fichier de 100 MiB téléchargé par un utilisateur. Tout d'un coup, vous avez une augmentation de 100 MiB dans le RSS de votre processus Apache, ce qui n'est vraiment pas une bonne chose - Apache peut être ulimit Il est important que vous n'ayez pas autant d'espace, sinon Apache pourrait être échangé : ce qui mettrait vos utilisateurs dans l'embarras. Donc, PHP fait la meilleure chose à faire : mettre le fichier reçu dans un fichier temporaire.

Vous pouvez vous demander pourquoi PHP ne peut pas être informé du fichier dans lequel il doit placer les données entrantes en premier, afin que vous n'ayez pas à les déplacer. Eh bien, c'est un problème de démarrage : PHP n'a pas encore passé le contrôle au script, donc le script ne peut pas dire à PHP où placer le fichier. Ainsi, PHP fait du mieux qu'il peut : placer les données du fichier dans un fichier temporaire.

Maintenant, vous pouvez conserver les données de ce fichier dans un disque RAM, pour plus de rapidité si vous le souhaitez. C'est une bonne approche si le coût de l'infrastructure ne vous dérange pas (par exemple, la maintenance de la configuration du disque RAM). Mais notez que ce n'est pas comme si PHP le gardait lui-même en RAM : dans ce scénario, le processus conteneur de PHP (généralement Apache ou un autre serveur web) doit avoir le tas pour contenir le fichier (ce qui peut ne pas être le cas). Dans ce scénario, le disque RAM est géré par le noyau.

2 votes

Puis-je changer l'emplacement temporaire ? Ou s'agit-il d'un emplacement fixe ?

18 votes

Oui : changer le upload_tmp_dir sur le chemin souhaité.

2 votes

Merci beaucoup, j'apprécie beaucoup votre effort

22voto

Jomoos Points 3391

De Quel est l'avantage d'écrire dans un emplacement temporaire, puis de le copier vers la destination prévue ? :

  • Sur la plupart des plateformes, les déplacements de fichiers sont atomiques, mais les écritures de fichiers ne le sont pas (surtout si vous ne pouvez pas écrire toutes les données en une seule fois). Ainsi, si vous avez le schéma typique producteur/consommateur (un processus produit des fichiers, l'autre surveille un répertoire et récupère tout ce qu'il trouve), écrire d'abord dans un dossier temporaire et seulement ensuite se déplacer vers l'emplacement réel signifie que le consommateur ne peut jamais voir un fichier non terminé.
  • Si le processus qui écrit le fichier meurt à mi-chemin, vous avez un fichier cassé sur votre disque. S'il se trouve dans un emplacement réel, vous devez vous occuper de le nettoyer vous-même, mais s'il se trouve dans un emplacement temporaire, le système d'exploitation s'en chargera. Si le fichier est créé alors qu'une tâche de sauvegarde est en cours d'exécution, celle-ci peut récupérer un fichier incomplet ; les répertoires temporaires sont généralement exclus des sauvegardes, de sorte que le fichier ne sera inclus qu'une fois déplacé vers sa destination finale.
  • Le répertoire temporaire peut se trouver sur un système de fichiers rapide mais volatile (par exemple un disque RAM), ce qui peut être bénéfique pour des choses comme le téléchargement de plusieurs morceaux du même fichier en parallèle, ou le traitement sur place du fichier avec beaucoup de recherches. De plus, les répertoires temporaires ont tendance à causer plus de fragmentation que les répertoires avec des lectures, écritures et suppressions moins fréquentes, et garder le répertoire temporaire sur une partition séparée peut aider à maintenir la fragmentation des autres partitions.

4 votes

Dites-moi ce que signifie "les déplacements de fichiers sont atomiques" ? J'apprécie beaucoup votre effort.

1 votes

@JaiShreeGanesh Le mouvement atomique signifie qu'il n'échouera pas à mi-chemin.

3 votes

@JaiShreeGanesh opération atomique, est une opération, qui peut être faite sans interruption (pensez aux interruptions, à l'ordonnancement des processus, etc,). Elles échouent ou réussissent. Les changements de métadonnées sont atomiques. Le renommage de fichier est un tel cas.

7voto

24Ahead Points 51

Deux raisons supplémentaires :

  1. Si vous décidez de ne pas accepter le fichier pour une raison quelconque, il est stocké dans un emplacement temporaire et sera probablement supprimé automatiquement à un moment donné.

  2. Sécurité. Imaginons que PHP soit configuré pour télécharger dans un répertoire accessible sur le web comme /images. Quelqu'un pourrait télécharger une sorte de fichier pirate et l'exécuter. En plaçant d'abord les fichiers dans un répertoire temporaire (qui ne sera généralement pas accessible sur le web), PHP vous permet d'examiner le fichier en premier. Par exemple, en traitant les images pour enlever tout commentaire qui pourrait contenir du code PHP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X