Directory PHP
Directory PHP: guida di riferimento completa per gli sviluppatori PHP.
PHP include un insieme di funzioni per le directory che consentono agli script di ispezionare, creare, leggere e rimuovere cartelle nel filesystem del server — senza ricorrere al sistema operativo. Questa pagina spiega cosa fa ciascuna funzione principale, quando usarla e gli errori comuni da evitare.
Questa è una guida complementare a Gestione dei file PHP e al riferimento più ampio sul Filesystem PHP: i file si trovano all'interno delle directory, quindi i due argomenti vengono quasi sempre usati insieme.
Perché le operazioni sulle directory sono importanti
Quasi ogni applicazione non banale interagisce con il filesystem. Le funzioni per le directory servono per:
- Organizzare i file caricati — suddividere i caricamenti degli utenti in cartelle per utente o per data (vedi Upload di file PHP).
- Creare la struttura del progetto al volo — generare cartelle di cache, log o esportazione la prima volta che sono necessarie.
- Iterare sui contenuti — elencare ogni template, immagine o file di dati in una cartella per elaborarli in blocco.
- Fare pulizia — eliminare le directory temporanee al termine di un'operazione.
Poiché queste funzioni fanno parte del core PHP, funzionano allo stesso modo su Linux, macOS e Windows (con / accettato come separatore ovunque), il che le rende più portabili rispetto all'esecuzione di mkdir o ls tramite exec().
Funzioni principali per le directory
| Funzione | Scopo |
|---|---|
mkdir($path, $mode, $recursive) | Crea una directory. Passa true per $recursive per creare le cartelle padre annidate. |
rmdir($path) | Rimuove una directory — deve essere vuota prima. |
is_dir($path) | Restituisce true se il percorso esiste ed è una directory. |
scandir($path) | Restituisce un array di ogni elemento in una directory (inclusi . e ..). |
opendir() / readdir() / closedir() | Apre un handle di directory e legge gli elementi uno alla volta. |
getcwd() | Restituisce la directory di lavoro corrente. |
chdir($path) | Cambia la directory di lavoro corrente. |
scandir() vs. opendir()
Entrambe elencano il contenuto di una directory, ma si adattano a esigenze diverse:
scandir()carica tutti gli elementi in un array in una sola volta. È concisa e facile da ordinare, ma utilizza memoria proporzionale al numero di file. Ideale per cartelle piccole o medie.opendir()/readdir()legge gli elementi uno alla volta in streaming. Mantiene la memoria costante anche per directory con decine di migliaia di file. Ideale per cartelle molto grandi.
Entrambe includono le voci speciali . (corrente) e .. (padre) — quasi sempre si vogliono ignorare.
Esempio: creare una directory ed elencarla
Questo script verifica se una directory esiste, la crea (insieme alle eventuali cartelle padre mancanti) se non esiste, poi ne stampa il contenuto:
<?php
$dir = 'uploads/images';
// Create the directory and any missing parents if it doesn't exist
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
echo "Directory created: $dir\n";
}
// List directory contents, skipping the . and .. entries
$files = scandir($dir);
echo "Contents of $dir:\n";
foreach ($files as $file) {
if ($file !== '.' && $file !== '..') {
echo "- $file\n";
}
}
?>Il terzo argomento di mkdir() (true) è il flag ricorsivo: senza di esso, mkdir('uploads/images') fallisce se uploads non esiste già. 0755 è una modalità di permesso ottale (il proprietario può leggere/scrivere/eseguire, gli altri possono leggere/eseguire) e viene ignorata su Windows.
Esempio: streaming con opendir()
Per directory di grandi dimensioni, leggi gli elementi uno alla volta invece di costruire un array completo:
<?php
$dir = __DIR__;
if ($handle = opendir($dir)) {
while (($entry = readdir($handle)) !== false) {
if ($entry !== '.' && $entry !== '..') {
$type = is_dir("$dir/$entry") ? 'dir ' : 'file';
echo "[$type] $entry\n";
}
}
closedir($handle);
}
?>Nota il confronto rigoroso !== false: un file chiamato letteralmente "0" è falsy, quindi un while ($entry = readdir(...)) debole si fermerebbe prematuramente. Confronta sempre esplicitamente con false.
Rimozione di directory
rmdir() elimina solo una directory vuota. Per rimuoverne una che contiene ancora file, elimina prima il contenuto — tipicamente con un helper ricorsivo:
<?php
function removeDir(string $dir): void {
foreach (scandir($dir) as $entry) {
if ($entry === '.' || $entry === '..') {
continue;
}
$path = "$dir/$entry";
is_dir($path) ? removeDir($path) : unlink($path);
}
rmdir($dir);
}
?>Questo scorre ogni elemento, ricorrendo nelle sottodirectory e usando unlink() sui file, così la directory è vuota al momento dell'esecuzione di rmdir().
Errori comuni
mkdir()senza il flag ricorsivo fallisce se manca qualsiasi cartella padre. Passatruequando crei percorsi annidati.- I permessi vengono sottratti da
umask— la modalità effettiva è$mode & ~umask(), quindi0777può diventare0755. rmdir()su una cartella non vuota restituiscefalseed emette un avviso. Svuotala prima.scandir()include.e..— filtrali prima di elaborarli.- I percorsi relativi dipendono da
getcwd(), che è la directory di lavoro dello script, non la posizione del file. Usa__DIR__per ancorare i percorsi al file corrente.
Flusso di lavoro con le directory in sintesi
graph TD
A[Check Directory] --> B{Exists?}
B -->|No| C[mkdir]
B -->|Yes| D[scandir / opendir]
C --> E[Create Subdirectories]
D --> F[Read Entries]
F --> G[Process Files]
G --> H[close / rmdir]Riepilogo
Le funzioni per directory di PHP offrono un modo portabile e integrato per gestire le cartelle: mkdir() e rmdir() le creano e rimuovono, is_dir() le verifica, e scandir() o opendir()/readdir() ne elencano il contenuto. Usa scandir() per le cartelle piccole per la sua semplicità, e lo streaming con opendir() per quelle grandi per mantenere la memoria costante. Combina queste funzioni con le funzioni per i file PHP e la gestione dei file per costruire funzionalità robuste di upload, cache ed esportazione.