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.
0 votes
En rapport : stackoverflow.com/questions/13972714/
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é ?
1 votes
Voir la directive upload-tmp-dir dans le php.ini : php.net/manual/fr/ini.core.php#ini.upload-tmp-dir . Il permet de définir l'emplacement du dossier temporaire. L'un des avantages de l'utilisation du dossier tmp est que le fichier téléchargé est conservé dans un dossier situé en dehors de la racine du document. Si le dossier tmp se trouvait à l'intérieur de la racine du document, les utilisateurs seraient en mesure de télécharger les fichiers des autres utilisateurs.