Sto cercando di risolvere un problema in uno script di auto-zip per alcune immagini, che ho scritto qualche tempo fa e che ha funzionato fino ad ora. Tutto sembra bene fino $zip->close();
che ha pronunciato la seguente:Avviso su ZipArchive Chiudi
<b>Warning</b>: ZipArchive::close(): Read error: No such file or directory in <b></b> on line <b>287</b><br />
ho letto i documenti e alcuni forum e ho scoperto che questo possa accadere in uno dei seguenti scenari:
- Se non vengono aggiunti file effettivi allo zip, da PHP 5.6-questa potrebbe essere una probabile spiegazione dato che ho recentemente aggiornato a PHP 5.6. Tuttavia:
- verifico che ogni file esistente prima di aggiungerlo
- ho cercato di aggiungere un file di testo non vuoto fittizio per la zip. Aggiungendo alla zip restituisce true, come fa
file_exists()
sul file - Quando mi associo
$zip->numFiles
e dà una serie di almeno 1 (quando la zip ha nessun file, tranne il fittizio)
- Se la directory al punto in cui lo zip deve essere scritto non esiste o non ha i permessi giusti: questo non sembra essere il caso, ma per sicurezza, ho scritto un file di testo nella stessa cartella nello stesso script e non si sono verificati problemi
- Se si verifica un problema durante la scrittura nella directory temporanea. È un po 'più difficile da controllare, ma ho uno script di caricamento nello stesso sistema che funziona, e ho assicurato che non ci siano problemi di spazio su disco ecc.
Ecco il codice relativo. Alcune variabili sono definite in anticipo. Nota che scrivo ogni problema sul mio log, e questo script non genera alcuna voce!
$zip_file = 'Project'.$project_id.'.zip';
$zip = new ZipArchive;
if ($zip_result = $zip->open($zip_path.'/'.$zip_file, ZIPARCHIVE::CREATE) !== true) {
echo 'Error creating zip for project: '.$project_id.'. Error code: '.$zip_result;
help::debugLog('Error creating zip for project: '.$project_id.'. Error code: '.$zip_result);
return false;
}
$file_list = array();
foreach ($item_thumbs as $item)
{
$full_thumb_path = $thumb_dir.'/'.$item['thumb'];
if (file_exists($full_thumb_path) and $item['thumb'])
{
$file_added = $zip->addFile($full_thumb_path, basename($item['thumb']));
if (!$file_added)
help::debugLog('Failed to add item thumb to project zip. Project: '.$project_id.', file name: '.$item['thumb']);
else
$file_list[] = $item['thumb'];
}
elseif ($item['thumb']) /* If thumb indicated in DB doesn't exist in file system */
help::debugLog('Item thumb file '.$item['thumb'].' from item: '.$item['id'].' is missing from its indended location: '.$full_thumb_path);
}
/* Added 2016-05-18 -- creates dummy file for the zip listing its contents, important in case zip is empty */
$file_list_path = $zip_path.'/file_list.txt';
if (!($file_list_file = fopen($file_list_path, 'w+')))
help::debugLog('Failed to create list file (intended for zip) for project: '.$project_id);
fwrite($file_list_file, "File list:\n");
fwrite($file_list_file, implode("\n", $file_list));
if (file_exists($file_list_path))
{
fclose($file_list_file);
if (!$zip->addFile($file_list_path))
help::debugLog('Failed to add list file to project zip for project: '.$project_id);
unlink($file_list_path);
}
else
help::debugLog('Failed to create list file (intended for zip) for project: '.$project_id);
$zip->close(); // line 287
Quindi, come sei riuscito a risolvere il problema nel tuo codice? – Grigio
Ho spostato $ zip-> close() in un punto prima che il file di testo venga eliminato. – Ynhockey