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는 당신에게 줄 수있는 모든$_POST
데이터를, PHP는 전체 요청을 처리해야합니다. 그래서 $_FILES
거기에있는 동안 슈퍼-글로벌을 완성 하는 것이 낫습니다.
이제 PHP 는 이 파일 데이터를 메모리에 보관할 수 있지만 이것은 정말 나쁜 생각 일 수 있습니다. PHP가 사용자가 업로드 한 100MiB 파일을 저장해야한다면 어떻게 될지 생각해보십시오. 갑자기, 아파치 프로세스의 RSS가 100MiB 증가했습니다. 정말 좋지 않습니다. 아파치가 ulimit
그다지 많은 공간을 갖지 못하도록 만들거나 아파치가 스왑 될 수 있습니다. 따라서 PHP는 차선책을 수행합니다. 수신 된 파일을 임시 파일에 넣습니다.
들어오는 파일 데이터를 먼저 넣을 파일을 PHP가 알 수없는 이유를 물어볼 수 있으므로 파일을 이동할 필요가 없습니다. 글쎄, 그것은 부트 스트래핑 문제입니다. PHP는 아직 스크립트에 제어권을 넘겨주지 않았기 때문에 스크립트는 파일을 어디에 둘지 PHP에 알려줄 수 없습니다. 따라서 PHP는 최선을 다합니다. 파일 데이터를 임시 파일에 넣습니다.
이제 원하는 경우 속도를 위해이 파일 데이터를 RAM 디스크에 보관할 수 있습니다. 이는 인프라 비용 (예 : RAM 디스크 설정 유지)에 신경 쓰지 않는 경우 좋은 접근 방식입니다. 그러나 이것은 PHP가 RAM 자체에 보관하는 것과는 다릅니다.이 시나리오에서 PHP 컨테이너 프로세스 (일반적으로 Apache 또는 다른 웹 서버)에는 파일을 보관할 힙이 있어야합니다 (그렇지 않을 수도 있음). 이 시나리오에서 RAM 디스크는 커널에 의해 관리됩니다.
에서 임시 위치에 쓰기, 그리고 의도 한 대상에 복사의 이점은 무엇입니까? :
- 대부분의 플랫폼에서 파일 이동은 원자 적이지만 파일 쓰기는 그렇지 않습니다 (특히 한 번에 모든 데이터를 쓸 수없는 경우). 따라서 일반적인 생산자 / 소비자 패턴이있는 경우 (한 프로세스는 파일을 생성하고 다른 프로세스는 디렉터리를 감시하며 찾은 모든 항목을 선택) 먼저 임시 폴더에 쓴 다음 실제 위치로 이동해야 소비자가 미완성 파일.
- 파일을 쓰는 프로세스가 중간에 중단되면 디스크에 손상된 파일이있는 것입니다. 실제 위치에 있으면 직접 정리해야하지만 임시 위치에 있으면 OS가 처리합니다. 백업 작업이 실행되는 동안 파일이 생성되면 작업이 불완전한 파일을 선택할 수 있습니다. 임시 디렉토리는 일반적으로 백업에서 제외되므로 파일은 최종 대상으로 이동 한 후에 만 포함됩니다.
- 임시 디렉토리는 빠르지 만 휘발성이있는 파일 시스템 (예 : 램 디스크)에있을 수 있습니다. 이는 동일한 파일의 여러 청크를 병렬로 다운로드하거나 많은 탐색을 통해 파일에서 내부 처리를 수행하는 것과 같은 작업에 유용 할 수 있습니다. 또한 임시 디렉터리는 읽기, 쓰기 및 삭제 빈도가 낮은 디렉터리보다 더 많은 조각화를 일으키는 경향이 있으며 임시 디렉터리를 별도의 파티션에 유지하면 다른 파티션의 조각화를 유지할 수 있습니다.
두 가지 추가 이유 :
어떤 이유로 파일을 수락하지 않기로 결정하면 임시 위치에 저장되며 아마도 특정 시점에 자동으로 삭제 될 것입니다.
보안. PHP가 / images와 같은 웹 액세스 가능한 디렉토리에 업로드하도록 설정되었다고 가정 해 보겠습니다. 누군가는 일종의 해킹 파일을 업로드하여 실행할 수 있습니다. 파일을 먼저 임시 디렉토리 (일반적으로 웹에서 액세스 할 수 없음)에두면 PHP를 통해 파일을 먼저 검사 할 수 있습니다. 예를 들어 이미지를 처리하여 PHP 코드를 포함 할 수있는 주석을 제거합니다.
'program tip' 카테고리의 다른 글
왜 cells (1,1) = 500 * 100은 오버 플로우를 일으키지 만 50000 * 100은 그렇지 않습니까? (0) | 2020.11.18 |
---|---|
Angular 2에서 IE11 캐싱 GET 호출 방지 (0) | 2020.11.18 |
각 클라이언트에 단일 데이터베이스를 사용하면 어떤 이점이 있습니까? (0) | 2020.11.18 |
부울 연산자를 전처리 기와 함께 사용할 수 있습니까? (0) | 2020.11.18 |
JSON을 통해 ASP.Net MVC3에 개체 배열 게시 (0) | 2020.11.18 |