PHP 개발에서 파일 업로드는 일반적인 요구 사항이며, 파일 업로드시 임시 스토리지 위치는 종종 성능, 보안 및 서버 구성에 무시할 수없는 영향을 미칩니다. 기본적으로 PHP는 php.ini 에서 임시 디렉토리로 구성된 upload_tmp_dir 경로를 사용하지만 런타임 에서이 설정을 동적으로 변경할 수도 있습니다. 이 기사는 INI_SET 기능을 사용하여 PHP 파일에서 업로드 한 임시 디렉토리를 수정하고 몇 가지 실용적인 팁과 예방 조치를 제공하는 방법을 자세히 소개합니다.
ini_set ()은 런타임시 구성 항목을 수정하기 위해 PHP가 제공하는 함수입니다. 기본 구문은 다음과 같습니다.
<span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$option</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span>|</span><span><span class="hljs-keyword">int</span></span><span>|</span><span><span class="hljs-keyword">float</span></span><span>|</span><span><span class="hljs-keyword">bool</span></span><span>|</span><span><span class="hljs-literal">null</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>|</span><span><span class="hljs-literal">false</span></span><span>
</span></span>이 함수는 지정된 구성 옵션을 수정하고 성공하면 이전 값을 반환하고 실패하면 False를 반환하려고합니다.
그러나 항목의 "가변 범위 (php_ini_*)에 따라 모든 구성 항목을 런타임에 수정할 수있는 것은 아닙니다 .
기본 구성에서 파일 업로드는 시스템 수준 (예 : /TMP )의 임시 디렉토리에 임시로 저장됩니다. 수정하는 것은 다음과 같은 목적을 가질 수 있습니다.
디스크 I/O 성능 향상 (예 : SSD 경로 사용)
쉽게 유지 보수를 위해 응용 프로그램 데이터 및 시스템 데이터를 별도로 제공합니다
보안을 개선하고 다른 서비스가 스캔하는 임시 파일을 피하십시오.
다중 사용자 시스템 또는 컨테이너화 된 배포의 분리 요구 사항에 응답
PHP 스크립트에서 임시 디렉토리 업로드를 수정하려면 다음 코드를 사용할 수 있습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$customTmpDir</span></span><span> = </span><span><span class="hljs-string">'/path/to/custom/tmp'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'upload_tmp_dir'</span></span><span>, </span><span><span class="hljs-variable">$customTmpDir</span></span><span>);
</span></span> <span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$customTmpDir</span></span><span> = </span><span><span class="hljs-string">'/var/www/project/tmp_uploads'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'upload_tmp_dir'</span></span><span>, </span><span><span class="hljs-variable">$customTmpDir</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$_SERVER</span></span><span>[</span><span><span class="hljs-string">'REQUEST_METHOD'</span></span><span>] === </span><span><span class="hljs-string">'POST'</span></span><span> && </span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'myfile'</span></span><span>])) {
</span><span><span class="hljs-variable">$tmpPath</span></span><span> = </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'myfile'</span></span><span>][</span><span><span class="hljs-string">'tmp_name'</span></span><span>];
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"업로드하는 임시 경로는 다음과 같습니다: <span class="hljs-subst">$tmpPath</span></span></span><span>";
</span><span><span class="hljs-comment">// 대상 디렉토리로 이동하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">move_uploaded_file</span></span><span>(</span><span><span class="hljs-variable">$tmpPath</span></span><span>, </span><span><span class="hljs-keyword">__DIR__</span></span><span> . </span><span><span class="hljs-string">'/uploads/'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'myfile'</span></span><span>][</span><span><span class="hljs-string">'name'</span></span><span>]));
}
</span><span><span class="hljs-meta">?></span></span><span>
<form method=</span><span><span class="hljs-string">"post"</span></span><span> enctype=</span><span><span class="hljs-string">"multipart/form-data"</span></span><span>>
<input type=</span><span><span class="hljs-string">"file"</span></span><span> name=</span><span><span class="hljs-string">"myfile"</span></span><span> />
<button type=</span><span><span class="hljs-string">"submit"</span></span><span>>업로드</button>
</form>
</span></span> 디렉토리가 존재해야합니다
upload_tmp_dir 로 지정된 디렉토리는 존재해야하며 웹 서버 사용자 (예 : www-data)는 쓰기 권한이 있으므로 업로드가 실패하고 $ _files가 비어 있습니다.
제한된 행동 범위
ini_set () 설정은 현재 스크립트 실행에만 유효합니다. mod_php 와 같은 Apache 환경을 사용하는 경우 스크립트가 실행되기 전에 업로드 동작이 완료 될 수 있으며이 경우 설정이 유효하지 않습니다.
CLI 또는 FPM 모드 <br>에 적합합니다 PHP-FPM 또는 CLI 모드에서 INI_SET ()는 특히 Move_Uploaded_File ()을 실행하기 전에 설정 한 경우 동작에 성공적으로 영향을 줄 가능성이 높습니다.
대안 : php.ini 또는 .user.ini를 구성하십시오
영구 설정이 필요한 경우 php.ini를 수정하거나 .user.ini 파일 (FPM 또는 CGI와 같은 특정 환경에서 지원)을 사용하는 것이 좋습니다.
<span><span><span class="hljs-attr">upload_tmp_dir</span></span><span> = /var/www/project/tmp_uploads
</span></span>INI_SET을 사용하면 런타임에서 PHP 구성을 수정할 수있는 유연성이 허용되지만 임시 디렉토리를 설정할 때 특히 실행 환경이이를 허용 할 수 있도록 특별한주의가 필요합니다. 조건이 허용되면 구성 파일 레벨 설정이 더 안정적이고 신뢰할 수 있습니다. 어떤 방법을 사용하든 업로드 프로세스 및 서버 권한 구조를 이해하는 것은 항상 업로드 기능의 안정적인 작동을 보장하기위한 기초입니다.