2011-12-06 2 views
3

에 대한 실행 나는 다음과 같은 PHP 파일이 있습니다PHP POST 및 대용량 파일 업로드

  • fileUploadForm.php
  • handleUpload.php

fileUploadForm 다음과 같은 출력이 포함

  • 출력 $ _SESSION [ 'errorMessage'] (있는 경우)
  • 오우 handleUpload.php에 게시물

handleUpload.php 다음과 같은 작업을 수행하는 파일 업로드 양식 tput을 :

  • 의 유효성을 검사 세션을
  • 의 유효성을 검사 파일 ($ _SESSION 설정 (유효성 검사가 실패하면 로그인 리디렉션) [ 'ERRORMESSAGE'] 유효성 검사가 실패 할 경우) 바이러스
  • 있는 MoveFile
  • 업데이트 데이터베이스
  • 01
  • 스캔 파일

대용량 파일 업로드에 스크립트가 문제가 있습니다. 필자는 파일 업로드와 관련하여 php.ini 설정을 테스트 목적으로 엄청나게 거대한 것으로 설정했습니다. 따라서 문제가 구성 문제라고 생각하지 않습니다.

다음 행동이 나를 혼란 :

  • 을 나는 파일이 tmp를 성장 볼 때, 파일 업로드 잘 설정 한 max_input_time지나 계속됩니다. 내 이해는 max_input_time이 초과되면 스크립트가 종료되고 차례로 파일이 업로드된다는 것입니다. 왜 이런 일이 일어나지 않는지에 대한 생각은 없습니까?

  • 파일 업로드 중류를 중지하고 fileUploadForm (다시 제출하지 않음)을 새로 고침하면 스크립트는 handleUpload에 설정된 파일 유효성 검사와 관련된 오류 메시지를 출력합니다. 이것은 파일 업로드가 완료되지 않았더라도 handleUpload의 코드 행이 실행되고 있음을 나타냅니다. PHP는 스크립트를 실행하고 비동기 적으로 양식 데이터를 받습니까? 모든 코드를 실행하기 전에 모든 양식 데이터가 수신 될 때까지 스크립트가 대기 할 것이라고 생각했을 것입니다. 그러나이 가정은 내가 보는 행동에 모순됩니다. 데이터 POST/스크립트 실행의 순서는 무엇입니까?

  • 나머지 설정 값과 함께 max_input_time이 테스트를 위해 엄청나게 크게 설정되면 매우 큰 업로드가 완료됩니다. 그러나 나머지 스크립트는 죽는 것처럼 보입니다. 즉 바이러스 스캔 및 파일 이동이 일어나지 않으며 데이터베이스가 업데이트되지 않습니다. 스크립트의 각 동작에 대해 오류 처리가 설정되어 있지만 오류는 발생하지 않습니다. 페이지가 죽은 것 같습니다. 이것이 일어날 수있는 이유에 대한 생각/그러한 오류를 잡는 방법?

미리 감사드립니다. 케이트

답변

0

두 번째 질문에 대한 답변에서이 따옴표 (적어도 부분적으로) 다른 두 :

PHP는 어떤 HTTP 서버 당신이 아파치 (또는 모든 입력 데이터를 처리 할 수 ​​있어야하기 위해서는
I would have thought that the script would wait until all form data was received before executing any code. 

using)은 먼저 파일 업로드가 완료 될 때까지 대기하고 그 후에 만 ​​PHP 스크립트를 처리합니다. 따라서 파일 업로드 과정이 완료되면 PHP의 max_input_time 검사가 실행됩니다.

이제는 바이러스 검사, 파일 이동 및 기타 스크립트 절차가 발생하지 않는 이유를 묻습니다. PHP와 관련된 시간 카운터는 스크립트의 실행으로 시작해야하며 모든 입력 데이터가 수신 된 후에 발생해야합니다. 글쎄, 그 사건이되어야하고 솔직히 말해서 - 이것에 대한 내 생각은 어둠 속에서 일종의 총격이다. 그러나 잘 ... 어떤 다른 한도를 초과하거나 스크립트가 요청과 함께 시작되었지만 그와 함께 진행할 준비가 될 때까지 httpd -이 카운터 중 일부는이 시간 동안 만료 될 수 있습니다.

새로 고침은 모든 데이터가 다시 POST되고 다시 처리되어야 함을 의미하므로 두 번째 질문에 대답하는 방법을 모르겠습니다. 나는 당신이 다른 것을 할 것이라는 것을 의심합니다 - 단순히 폼을 다시 제출하지 않고 handleUpload.php를 로딩하는 것입니다,하지만 제가 언급해야 할 가능성이 있습니다. 첫 번째 요청이 예기치 않게 종료 된 경우 일부 가비지 수집 및/또는 복구 프로세스가 두 번째로 발생한다는 추측이 있습니다.

조금 지나치는 희망.

+0

나는 fileUploadForm.php 만 새로 고침하고 실제로 다시 제출하지는 않습니다. 하지만 이제 handleUpload에 설정된 세션 정보가 포함됩니다. 따라서 일부 코드가 실행되고 있습니다. 그리고 전체 파일이 tmp에 업로드되기 전에 실행 중입니다. – user480029

+0

PHP 문서가 이런 식으로 일관성이없는 것 같습니다. 응답의 첫 번째 부분에서와 같이 max_input_time을 정의합니다. "POST 및 GET과 같이 입력 데이터를 구문 분석 할 수있는 최대 시간 (초)입니다. 서버의 모든 데이터를 수신하는 순간부터 시작까지 측정됩니다 스크립트 실행 "(즉, 업로드 완료 후 카운트 시작). 그러나 문제 해결 섹션에서 max_input_time이 충분히 높지 않으면 일부 파일 업로드가 완료되지 않음을 나타냅니다. 그러나 어느 쪽이든, 나는 파일 업로드가 계속되는 것을보고, 어떤 스크립트 실행이 일어나고, 실패한다. – user480029

+0

질문은 "새로 고침"으로 무엇을 의미합니까? 브라우저의 주소 표시 줄로 가서 Enter 키를 누르거나 F5 키를 누르거나 새로 고침을 클릭합니까? 두 번째 작업을 수행하면 브라우저는 양식 데이터를 다시 제출하고 확인하지 않으면 계속할 수 없도록 요청할 것입니다. 첫 번째 작업을 수행하면 세션 데이터 만 존재한다는 것이 정상입니다. – Narf