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で指定されたディレクトリが存在する必要があり、Webサーバーユーザー(www-dataなど)には書き込み許可があります。そうしないと、uploadが故障し、 $ _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構成を柔軟に変更できますが、特に実行環境がこれを許可することを確認するために、一時的なディレクトリをセットアップするときは特別な注意が必要です。条件が許可されている場合、構成ファイルレベルの設定はより安定して信頼性が高くなります。どの方法を使用しても、アップロードプロセスとサーバーの許可構造を理解することは、常にアップロード機能の安定した動作を確保するための基礎となります。