sobre - ¿Por qué PHP almacena los archivos cargados en una ubicación temporal y cuál es el beneficio?
todo sobre php (3)
Buena pregunta.
La respuesta breve es que PHP debe procesar
toda
la solicitud HTTP, completando
$_POST
con datos y
$_FILES
según sea necesario, antes de dar control a su script.
Dado que su script no obtiene el control hasta
después
del procesamiento, no hay forma de decirle a PHP dónde colocar los datos de ese archivo.
Pero, ¿por qué PHP lo hace de esta manera? Bueno, veamos un HTTP POST con datos de archivo :
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--
Tenga en cuenta que el contenido de la solicitud es un documento codificado de varias partes, con campos de formulario intercalados entre los datos del archivo. En este ejemplo particular, el campo de formulario aparece antes de los datos del archivo. Sin embargo, es posible, de hecho probable, que los datos del formulario ocurran después de los datos del archivo.
Entonces, para
garantizar
que PHP pueda brindarle
todos
los datos
$_POST
, PHP debe procesar toda la solicitud.
Por lo tanto, también podría completar el
$_FILES
mientras está allí.
Ahora, PHP
podría
mantener los datos de este archivo en la memoria, pero esto podría ser una mala idea.
Piense en lo que sucedería si PHP necesitara almacenar un archivo de 100 MiB que cargó un usuario.
De repente, tienes un aumento de 100 MiB en el RSS de tu proceso de Apache, lo que realmente no es demasiado bueno: Apache podría verse
ulimit
para no tener tanto espacio, o Apache podría intercambiarse: a la angustia de tus usuarios.
Entonces, PHP hace lo siguiente mejor: poner este archivo recibido en un archivo temporal.
Puede preguntar por qué no se le puede decir a PHP qué archivo debe poner primero los datos del archivo entrante, por lo que no tuvo que moverlo. Bueno, ese es un problema de arranque: PHP aún no ha entregado el control al script, por lo que el script no puede decirle a PHP dónde colocar el archivo. Por lo tanto, PHP hace lo mejor que puede: poner los datos del archivo en un archivo temporal.
Ahora, puede mantener estos datos de archivo en un disco RAM, para mayor velocidad si lo desea. Este es un buen enfoque si no le importa el costo de la infraestructura (por ejemplo, mantener la configuración del disco RAM). Pero tenga en cuenta que esto no es como PHP reteniéndolo en la propia RAM: en ese escenario, el proceso del contenedor PHP (generalmente Apache o algún otro servidor web) debe tener el montón para contener el archivo (que podría no serlo). En este escenario, el núcleo gestiona el disco RAM.
Bien, soy totalmente nuevo en este campo y revisé algunos tutoriales y descubrí que al cargar archivos en PHP los almacena en una ubicación temporal.
$file_temp=$_FILES[''file''][''tmp_name''];
$file_loc="Upload".$file_name;
move_uploaded_files($file_temp,$file_loc);
Ahora, ¿por qué PHP no permite cargar archivos directamente a la ubicación deseada? ¿Por qué se almacenan en una ubicación temporal con una extensión .tmp y qué beneficio obtenemos de esta estrategia?
Dos razones adicionales:
-
Si decide no aceptar el archivo por algún motivo, se almacena en una ubicación temporal y presumiblemente se eliminará automáticamente en algún momento.
-
Seguridad. Digamos que PHP se configuró para cargar a un directorio accesible en la web como / images. Alguien podría cargar algún tipo de archivo de piratería y luego ejecutarlo. Al colocar primero los archivos en un directorio temporal (que generalmente no será accesible desde la web), PHP le permite examinar primero el archivo. Por ejemplo, procesando imágenes para eliminar cualquier comentario que pueda contener código PHP.
¿Cuál es el beneficio de escribir en una ubicación temporal y luego copiarlo en el destino deseado? :
- En la mayoría de las plataformas, los movimientos de archivos son atómicos, pero las escrituras de archivos no lo son (especialmente si no puede escribir todos los datos de una vez). Entonces, si tiene el patrón típico de productor / consumidor (un proceso produce archivos, el otro mira un directorio y recoge todo lo que encuentra), escribir en una carpeta temporal primero y solo luego moverse a la ubicación real significa que el consumidor nunca puede ver un Archivo inacabado.
- Si el proceso que escribe el archivo termina a la mitad, tiene un archivo roto en su disco. Si está en una ubicación real, debe ocuparse de limpiarlo usted mismo, pero si está en una ubicación temporal, el sistema operativo se encargará de ello. Si el archivo se crea mientras se está ejecutando un trabajo de respaldo, el trabajo puede recoger un archivo incompleto; Los directorios temporales generalmente se excluyen de las copias de seguridad, por lo que el archivo solo se incluirá una vez que se haya movido al destino final.
- El directorio temporal puede estar en un sistema de archivos rápido pero volátil (por ejemplo, un disco RAM), lo que puede ser beneficioso para cosas como descargar varios fragmentos del mismo archivo en paralelo o realizar un procesamiento en el lugar en el archivo con muchas búsquedas. Además, los directorios temporales tienden a causar más fragmentación que los directorios con lecturas, escrituras y eliminaciones menos frecuentes, y mantener el directorio temporal en una partición separada puede ayudar a mantener baja la fragmentación de las otras particiones.