Arxiu ZIP temporal
Aquest exemple il·lustra una pràctica de codificació molt important i eficient: la creació de fitxers temporals per a processos que no requereixen emmagatzematge permanent, en aquest cas, un arxiu ZIP. L'exemple gestiona la neteja del fitxer temporal.
L'objectiu principal d'aquest codi és generar un arxiu ZIP que només existirà el temps necessari per ser creat i, habitualment, enviat a l'usuari (per descarregar).
| Element | Funció | Explicació |
tempnam() |
Creació del nom únic | Aquesta funció genera un nom de fitxer únic i aleatori al sistema. Això evita conflictes si molts usuaris intenten generar un ZIP alhora. |
sys_get_temp_dir() |
Directori de destí | Retorna la ruta del directori on el sistema operatiu desa habitualment els fitxers temporals (per exemple, /tmp a Linux o C:\Windows\Temp a Windows). |
ZipArchive::OVERWRITE |
Mode d'obertura | S'utilitza per assegurar que si tempnam ha creat el fitxer, ZipArchive el sobreescriu per garantir que sigui un arxiu ZIP buit i vàlid. |
El procés de creació, d'obertura amb OVERWRITE, d'afegir contingut amb addFile i de tancament amb close() és idèntic al procés de creació d'un ZIP permanent, però la clau és la ubicació i el nom generat per tempnam().
Exemple
El risc principal del codi és que no esborri el fitxer temporal després d'utilitzar-lo. Això pot omplir ràpidament el directori temporal del servidor i causar problemes d'emmagatzematge. Per això cal incloure la neteja (unlink) i una bona gestió d'errors.
<?php
/**
* Funció per crear un ZIP temporal, afegir fitxers i retornar la seva ruta.
*
* @param array $files_to_add Array associatiu amb: [Ruta_Real_Disc => Nom_Dins_ZIP]
* @return string|bool Retorna la ruta temporal del ZIP o FALSE en cas d'error.
*/
function create_temp_zip_archive(array $files_to_add): string|bool
{
// 1. Creació del Nom i la Ruta Temporal
// Prefix "INF" per identificar la font dels arxius temporals.
$temp_zip_file = tempnam(sys_get_temp_dir(), "INF");
$zip = new ZipArchive;
$res = $zip->open($temp_zip_file, ZipArchive::OVERWRITE);
if ($res !== TRUE) {
// En cas d'error en l'obertura/creació
return false;
}
// 2. Afegir Fitxers
foreach ($files_to_add as $real_path => $entry_name) {
if (file_exists($real_path)) {
$zip->addFile($real_path, $entry_name);
} else {
// Opcionalment, podríem registrar un error o continuar.
// Aquí continuem per si de cas només un dels fitxers falla.
}
}
// 3. Tancament (Finalització del ZIP)
$zip->close();
// 4. Retornar la ruta temporal
return $temp_zip_file;
}
// ---------------------------------------------------------------------------------
// CAS D'ÚS D'EXEMPLE
// ---------------------------------------------------------------------------------
// Simulem la creació de dos fitxers que s'adjuntaran
file_put_contents('document1.pdf', 'Contingut del PDF 1...');
file_put_contents('imatge_logo.png', 'Dades binàries...');
$files = [
'document1.pdf' => 'informes/document_final.pdf',
'imatge_logo.png' => 'assets/logo.png',
];
$zip_path = create_temp_zip_archive($files);
if ($zip_path) {
echo "Fitxer ZIP temporal creat correctament a: {$zip_path}";
// CAS D'ÚS: Enviament per descarregar (simulació)
// 1. Enviar el fitxer al navegador
// header('Content-Type: application/zip');
// header('Content-Disposition: attachment; filename="paquet_de_documents.zip"');
// readfile($zip_path);
// 2. Neteja obligatòria del zip temporal
unlink($zip_path);
echo "<br>🗑️ Arxiu temporal ({$zip_path}) esborrat correctament.";
} else {
echo "Error en la creació de l'arxiu ZIP temporal.";
}
// Neteja dels fitxers de simulació
unlink('document1.pdf');
unlink('imatge_logo.png');
?>
Descàrrega múltiples arxius
La creació d'un ZIP temporal és la solució ideal per a un dels casos més comuns en aplicacions web:
Escenari: Descàrrega de documents personalitzats
Un usuari vol descarregar totes les seves factures de l'últim any.
-
El codi PHP recupera les rutes de les 12 factures (guardades en un directori segur del servidor).
-
Crida a la funció
create_temp_zip_archive()per empaquetar les 12 factures en un sol fitxer ZIP temporal. -
Utilitza les funcions
header()ireadfile()de PHP per enviar el contingut del ZIP directament al navegador de l'usuari. -
Un cop enviat, s'executa
unlink($zip_path)per esborrar immediatament el fitxer del servidor, garantint que no quedi cap còpia residual al directori temporal.
D'aquesta manera, el servidor utilitza només recursos temporals per gestionar una descàrrega de fitxers combinats, maximitzant la seguretat i minimitzant l'ús de disc.