programing

PHP가 업로드된 파일을 임시 위치에 저장하는 이유와 이점은 무엇입니까?

muds 2023. 10. 28. 08:18
반응형

PHP가 업로드된 파일을 임시 위치에 저장하는 이유와 이점은 무엇입니까?

네, 저는 이 분야에 완전히 처음이고 몇 가지 튜토리얼을 거쳤고 PHP로 파일을 업로드하는 동안 임시 위치에 저장한다는 것을 발견했습니다.

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

왜 PHP는 원하는 위치에 파일을 직접 업로드하는 것을 허용하지 않습니까?왜 그것들이 .tmp 확장자가 있는 임시 장소에 보관되며 이 전략을 통해 얻을 수 있는 이점은 무엇입니까?

좋은 질문입니다.단답형은 PHP가 전체 HTTP 요청을 처리해야 한다는 것입니다 - 작성하기$_POST데이터를 포함하여, 그리고$_FILES필요에 따라 - 스크립트를 제어하기 전에.당신의 스크립트는 처리가 끝날 때까지 제어권을 얻지 못하기 때문에, PHP에게 그 파일 데이터를 어디에 두어야 하는지 알려줄 방법이 없습니다.

그런데 PHP는 왜 이런 식으로 할까요?, 파일 데이터가 있는 HTTP POST를 살펴보겠습니다.

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--

요청 내용은 여러 부분으로 인코딩된 문서이며, 양식 필드는 파일 데이터 사이에 산재되어 있습니다.이 예에서 양식 필드는 파일 데이터 에 나타납니다.그러나 양식 데이터가 파일 데이터 다음에 발생할 가능성이 있습니다.

그래서, PHP가 당신에게 모든 을 줄 수 있다는 것을 보장하기 위해.$_POSTdata, PHP는 전체 요청을 처리해야 합니다.그래서 그것이 그들이 그들을$_FILES거기에 있는 동안 초지구적으로 말입니다.

자, PHP는 이 파일 데이터를 메모리에 저장할 수 있지만, 이것은 정말 나쁜 생각일 수도 있습니다.PHP가 사용자가 업로드한 100개의 MiB 파일을 저장해야 한다면 어떻게 될지 생각해보세요.갑자기 Apache 프로세스의 RSS가 100 MiB 증가했는데, 이는 너무 좋지 않습니다. Apache는 다음과 같습니다.ulimit공간이 많지 않도록 편집하거나, 그렇지 않으면 사용자에게 Apache가 스왑될 수 있습니다.따라서 PHP는 다음으로 좋은 일을 합니다. 바로 이 수신된 파일을 임시 파일에 넣는 것입니다.

당신은 왜 PHP에게 어떤 파일을 먼저 입력해야 하는지 알려주지 못하는지 물을 수도 있는데, 당신은 그것을 옮길 필요가 없었습니다.이 문제는 부트스트래핑 문제입니다. PHP가 아직 스크립트에 제어권을 넘기지 않았기 때문에 스크립트가 PHP에게 파일을 어디에 두어야 하는지 알려줄 수 없습니다.따라서 PHP는 파일 데이터를 임시 파일에 넣는 것으로 가능한 최선을 다합니다.

이제 이 파일 데이터를 RAM 디스크에 보관하면 속도를 높일 수 있습니다.인프라 비용(예: RAM 디스크 설정 유지)에 개의치 않는다면 이 방법이 좋습니다.그러나 이것은 PHP가 RAM에 저장하는 것과는 다릅니다. 이 시나리오에서는 PHP 컨테이너 프로세스(보통 Apache나 다른 웹 서버)에 파일을 저장할 수 있는 힙이 있어야 합니다(그렇지 않을 수도 있습니다.이 시나리오에서는 RAM 디스크가 커널에 의해 관리됩니다.

임시 위치에 기록한 다음 원하는 대상에 복사하면 어떤 이점이 있습니까?

  • 대부분의 플랫폼에서 파일 이동은 원자적이지만 파일 쓰기는 그렇지 않습니다(특히 한 번에 모든 데이터를 쓸 수 없는 경우).따라서 일반적인 생산자/소비자 패턴(한 프로세스는 파일을 생성하고 다른 프로세스는 디렉토리를 보고 발견한 모든 것을 픽업)을 가지고 있다면 임시 폴더에 먼저 쓰고 실제 위치로 이동해야만 소비자가 완료되지 않은 파일을 볼 수 있습니다.
  • 파일을 쓰는 프로세스가 중간에 종료되면 디스크에 손상된 파일이 있는 것입니다.실제 위치에 있으면 직접 청소를 해야 하지만 임시 위치에 있으면 OS가 알아서 처리합니다.백업 작업이 실행되는 동안 파일이 생성되는 경우 작업에 불완전한 파일이 표시될 수 있습니다. 임시 디렉터리는 일반적으로 백업에서 제외되므로 최종 대상으로 이동할 때만 파일이 포함됩니다.
  • 임시 디렉터리는 속도는 빠르지만 휘발성이 강한 파일 시스템(예: 램디스크)에 있을 수 있으며, 이는 동일한 파일의 여러 청크를 병렬로 다운로드하거나 파일에 대한 검색을 많이 수행하는 것과 같은 작업에 유용할 수 있습니다.또한 임시 디렉터리는 읽기, 쓰기 및 삭제 빈도가 적은 디렉터리보다 더 많은 조각화를 초래하는 경향이 있으며, 임시 디렉터리를 별도의 파티션에 보관하면 다른 파티션의 조각화를 줄일 수 있습니다.

추가적인 두 가지 이유:

  1. 어떤 이유로 파일을 수락하지 않기로 결정한 경우 임시 위치에 저장되며 아마도 어느 시점에서 자동으로 삭제될 것입니다.

  2. 보안.PHP가 /images와 같은 웹 액세스 가능한 디렉토리에 업로드하도록 설정되었다고 가정해 보겠습니다.누군가가 일종의 해킹 파일을 업로드하고 실행할 수도 있습니다.일반적으로 웹 액세스가 불가능한 임시 디렉토리에 파일을 먼저 넣음으로써 PHP를 통해 파일을 먼저 검사할 수 있습니다.예를 들어, PHP 코드를 포함할 수 있는 주석을 제거하기 위해 이미지를 처리하는 것입니다.

언급URL : https://stackoverflow.com/questions/48819619/why-does-php-store-uploaded-files-in-a-temporary-location-and-what-is-the-benefi

반응형