세션 처리 세션 업로드 진행률

session.upload_progress.enabled INI 옵션이 활성화되면 PHP는 업로드되는 개별 파일의 업로드 진행률을 추적할 수 있습니다. 이 정보는 실제 업로드 요청 자체에는 특히 유용하지 않지만 파일 업로드 중에 애플리케이션은 상태를 확인하기 위해 별도의 엔드포인트(예: XHR을 통해)에 POST 요청을 보낼 수 있습니다.

업로드 진행 상황은 업로드가 진행 중이고 session.upload_progress.name INI 설정과 동일한 이름의 변수를 게시할 때 $_SESSION 슈퍼글로벌에서 사용할 수 있습니다. PHP가 이러한 POST 요청을 감지하면 $_SESSION에 배열을 채웁니다. 여기서 인덱스는 session.upload_progress.prefixsession.upload_progress.name INI 옵션의 연결된 값입니다.

키는 일반적으로 이러한 INI 설정을 읽어 검색합니다.

                  
<?php
$key = ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")];
var_dump($_SESSION[$key]);
?>
                  
                

$_SESSION[$key]["cancel_upload"] 키를 true로 설정하여 현재 진행 중인 파일 업로드를 취소할 수도 있습니다. 동일한 요청에서 여러 파일을 업로드할 때 현재 진행 중인 파일 업로드와 보류 중인 파일 업로드만 취소되지만 성공적으로 완료된 업로드는 제거되지 않습니다. 이렇게 업로드가 취소되면 $_FILES 배열의 오류 키가 UPLOAD_ERR_EXTENSION으로 설정됩니다.

session.upload_progress.freqsession.upload_progress.min_freq INI 옵션은 업로드 진행률 정보를 재계산해야 하는 빈도를 제어합니다. 이 두 가지 설정에 대해 적절한 양을 사용하면 이 기능의 오버헤드가 거의 존재하지 않습니다.


예시 #1 예시 정보

진행률 업로드 배열의 구조 예입니다.

<form action="upload.php" method="POST" enctype="multipart/form-data">
 <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
 <input type="file" name="file1" />
 <input type="file" name="file2" />
 <input type="submit" />
</form>
                

세션에 저장된 데이터는 다음과 같습니다.

                  
<?php
$_SESSION["upload_progress_123"] = array(
 "start_time" => 1234567890,   // The request time
 "content_length" => 57343257, // POST content length
 "bytes_processed" => 453489,  // Amount of bytes received and processed
 "done" => false,              // true when the POST handler has finished, successfully or not
 "files" => array(
  0 => array(
   "field_name" => "file1",       // Name of the <input/> field
   // The following 3 elements equals those in $_FILES
   "name" => "foo.avi",
   "tmp_name" => "/tmp/phpxxxxxx",
   "error" => 0,
   "done" => true,                // True when the POST handler has finished handling this file
   "start_time" => 1234567890,    // When this file has started to be processed
   "bytes_processed" => 57343250, // Number of bytes received and processed for this file
  ),
  // An other file, not finished uploading, in the same request
  1 => array(
   "field_name" => "file2",
   "name" => "bar.avi",
   "tmp_name" => NULL,
   "error" => 0,
   "done" => false,
   "start_time" => 1234567899,
   "bytes_processed" => 54554,
  ),
 )
);
                  
                

경고 이것이 제대로 작동하려면 웹 서버의 요청 버퍼링을 비활성화해야 합니다. 그렇지 않으면 PHP는 완전히 업로드된 후에만 파일 업로드를 볼 수 있습니다. Nginx와 같은 서버는 더 큰 요청을 버퍼링하는 것으로 알려져 있습니다.

주의 업로드 진행 정보는 스크립트가 실행되기 전에 세션에 기록됩니다. 따라서 ini_set() 또는 session_name()을 통해 세션 이름을 변경하면 업로드 진행 정보 없이 세션이 제공됩니다.