In der PHP -Entwicklung ist das Datei -Upload eine häufige Anforderung, und der Ort des temporären Speichers beim Hochladen von Dateien hat häufig nicht zugeordnete Auswirkungen auf Leistung, Sicherheit und Serverkonfiguration. Standardmäßig verwendet PHP den in php.ini konfigurierten upload_tmp_dir -Pfad als temporäres Verzeichnis. Sie können diese Einstellung jedoch auch zur Laufzeit dynamisch ändern. In diesem Artikel wird ausführlich eingeführt, wie die Funktion ini_set verwendet wird, um das von PHP -Dateien hochgeladene temporäre Verzeichnis zu ändern und einige praktische Tipps und Vorsichtsmaßnahmen zu geben.
Ini_Set () ist eine Funktion, die von PHP zur Änderung von Konfigurationselementen zur Laufzeit bereitgestellt wird. Die grundlegende Syntax ist wie folgt:
<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>
Diese Funktion versucht, die angegebene Konfigurationsoption zu ändern, den alten Wert zurückzugeben, wenn er erfolgreich ist, und false zurücksenden, wenn er fehlschlägt.
Es ist jedoch zu beachten, dass nicht alle Konfigurationselemente zur Laufzeit geändert werden können , abhängig vom "Variablenbereich (php_ini_*) des Elements.
Unter der Standardkonfiguration werden Datei -Uploads vorübergehend in einem temporären Verzeichnis auf Systemebene (z. B. /TMP ) gespeichert. Das Ändern kann die folgenden Zwecke haben:
Verbesserung der Datenträger -E/A -Leistung (z. B. die Verwendung von SSD -Pfaden)
Separate Anwendungsdaten und Systemdaten für eine einfache Wartung
Verbessern Sie die Sicherheit und vermeiden Sie, dass temporäre Dateien von anderen Diensten gescannt werden
Reagieren Sie auf die Isolationsanforderungen von Multi-User-Systemen oder Container-Bereitstellungen
Um das Temporary Directory in einem PHP -Skript hochzuladen, können Sie den folgenden Code verwenden:
<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">"Der vorübergehende Weg zum Hochladen ist: <span class="hljs-subst">$tmpPath</span></span></span><span>";
</span><span><span class="hljs-comment">// Ziehen Sie in das Zielverzeichnis um</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>>Hochladen</button>
</form>
</span></span>
Das Verzeichnis muss existieren
Das durch upload_tmp_dir angegebene Verzeichnis muss vorhanden sein, und der Webserverbenutzer (z. B. www-data) verfügt über Schreibberechtigungen, andernfalls wird der Upload fehlschlagen und $ _files sind leer.
Eingeschränkter Aktionsbereich
Die Einstellung ini_set () gilt nur für die aktuelle Skriptausführung. Wenn eine Apache -Umgebung wie mod_php verwendet wird, kann das Upload -Verhalten abgeschlossen sein, bevor das Skript ausgeführt wird, und die Einstellung ist in diesem Fall ungültig.
Geeignet für den CLI- oder FPM -Modus <br> In PHP-FPM- oder CLI-Modi wirkt sich ini_set () eher erfolgreich auf das Verhalten aus, insbesondere wenn sie vor der Ausführung move_uploaded_file () festgelegt wird.
Alternative: Konfigurieren Sie php.ini oder .user.ini
Wenn anhaltende Einstellungen erforderlich sind, wird empfohlen, Php.ini oder verwenden .User.ini -Dateien (in bestimmten Umgebungen wie FPM oder CGI unterstützt) zu ändern:
<span><span><span class="hljs-attr">upload_tmp_dir</span></span><span> = /var/www/project/tmp_uploads
</span></span>
Während die Verwendung von Ini_Set die Flexibilität ermöglicht, die PHP -Konfiguration zur Laufzeit zu ändern, ist eine spezielle Sorgfalt erforderlich, wenn temporäre Verzeichnisse eingerichtet werden, insbesondere um sicherzustellen, dass die Ausführungsumgebung dies zulässt. Wenn die Bedingungen dies zulassen, sind die Einstellungen der Konfigurationsdateiebene stabiler und zuverlässiger. Unabhängig davon, welche Methode verwendet wird, ist das Verständnis des Upload -Prozesses und der Server -Berechtigungsstruktur immer die Grundlage für den stabilen Betrieb der Upload -Funktion.