Dans le développement de PHP, le téléchargement de fichiers est une exigence commune et l'emplacement du stockage temporaire lors du téléchargement de fichiers a souvent un impact inégligible sur les performances, la sécurité et la configuration du serveur. Par défaut, PHP utilise le chemin OLDOLODAD_TMP_DIR configuré dans PHP.ini en tant que répertoire temporaire, mais vous pouvez également modifier ce paramètre dynamiquement au moment de l'exécution. Cet article présentera en détail comment utiliser la fonction INI_SET pour modifier le répertoire temporaire téléchargé par des fichiers PHP et fournir quelques conseils et précautions pratiques.
INI_SET () est une fonction fournie par PHP pour modifier les éléments de configuration à l'exécution. Sa syntaxe de base est la suivante:
<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>
Cette fonction essaiera de modifier l'option de configuration spécifiée, renvoie l'ancienne valeur si elle réussit et renvoie false si elle échoue.
Mais il convient de noter que tous les éléments de configuration ne peuvent pas être modifiés au moment de l'exécution , selon la "plage de variables (php_ini_ *)" de l'élément.
Sous la configuration par défaut, les téléchargements de fichiers sont temporairement enregistrés dans un répertoire temporaire au niveau du système (tel que / tmp ). Le modifier peut avoir les objectifs suivants:
Améliorer les performances des E / S disque (comme l'utilisation de chemins SSD)
Données d'application séparées et données système pour une maintenance facile
Améliorer la sécurité et éviter que les fichiers temporaires soient scannés par d'autres services
Répondre aux exigences d'isolement des systèmes multi-utilisateurs ou des déploiements conteneurisés
Pour modifier le répertoire temporaire de téléchargement dans un script PHP, vous pouvez utiliser le code suivant:
<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">"Le chemin temporaire à télécharger est: <span class="hljs-subst">$tmpPath</span></span></span><span>";
</span><span><span class="hljs-comment">// Passez au répertoire cible</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>>Télécharger</button>
</form>
</span></span>
Le répertoire doit exister
Le répertoire spécifié par upload_tmp_dir doit exister, et l'utilisateur du serveur Web (tel que www-data) a des autorisations d'écriture, sinon le téléchargement échouera et $ _files sera vide.
Étendue d'action limitée
Le paramètre ini_set () n'est valable que pour l'exécution actuelle du script. Si un environnement Apache tel que MOD_PHP est utilisé, le comportement de téléchargement peut être terminé avant l'exécution du script et le paramètre n'est pas valide dans ce cas.
Convient pour le mode CLI ou FPM <br> Dans les modes PHP-FPM ou CLI, INI_SET () est plus susceptible d'affecter avec succès le comportement, surtout s'il est défini avant d'exécuter move_uploaded_file () .
Alternative: configurer php.ini ou .user.ini
Si des paramètres persistants sont nécessaires, il est recommandé de modifier PHP.ini ou d'utiliser des fichiers .User.ini (pris en charge dans certains environnements tels que FPM ou CGI):
<span><span><span class="hljs-attr">upload_tmp_dir</span></span><span> = /var/www/project/tmp_uploads
</span></span>
Bien que l'utilisation de INI_SET permet la flexibilité de modifier la configuration de PHP à l'exécution, des soins spéciaux sont requis lors de la configuration des répertoires temporaires, en particulier pour s'assurer que l'environnement d'exécution le permet. Si les conditions le permettent, les paramètres de niveau de fichier de configuration seront plus stables et plus fiables. Peu importe la méthode utilisée, la compréhension du processus de téléchargement et de la structure d'autorisation du serveur est toujours la base pour assurer le fonctionnement stable de la fonction de téléchargement.