Hello,
I’m trying to compress a directory into zip format using php and or exec.
I cannot notice it in small size files, but when compressing 1.5GB in zip format, I can see the compression process by frequently updating the page in the cPanel File Manager.
I tried many things but I couldn’t fix the problem.
Sometimes, multiple compression processes continue in a row, as I show in the picture below.
Sometimes, the first compression process ends and another compression process starts immediately and ends when the second compression process is completed.
I implemented a session into the function, if the session is empty, I applied compression and locking, but the problem still persists.
I called the function on the simple page as shown below, and it performs multiple consecutive zip operations for the same directory.
I create a zip with exec, the process shown in the picture, but the same problem occurs with php zip.
It is the compression process for the same directory.
NOTE: If the file name is fixed, when creating zips one after the other, the same names after the compression process is completed are overwritten with the zip file just created.
If the file name is specified as date('Y-m-d-H-i-s')
on the function page, it creates multiple files one second apart.
My codes on the page where I call the function
<?php
require_once __DIR__ . '/zipyap.php';
$zipyap_sonucu = zipDataUsingSystem('../directoryname', '../ZIPLER/directoryname-2024-05-23-17-39-00.zip', 'directoryname');
$zipyap_sonucu = zipDataUsingZipArchive('../directoryname', '../ZIPLER/directoryname-2024-05-23-17-39-00.zip', 'directoryname');
echo '<pre>' . print_r($zipyap_sonucu, true) . '</pre>';
?>
It creates multiple zips but the result is only one
Array
(
[0] => Zip Arşivi Başarıyla Oluşturuldu
[dosya_adi] => ../ZIPLER/directoryname-2024-05-23-17-39-00.zip
)
My zip creation function code in zipyap.php file
if (!function_exists('zipDataUsingZipArchive')) {
function zipDataUsingZipArchive($source, $destination, $comment = '') {
$zipsonuc = [];
// Kaynak dizin veya dosyanın var olup olmadığını kontrol et
if (!file_exists($source)) {
$zipsonuc[] = "Kaynak dosya veya dizin mevcut değil: " . $source;
return $zipsonuc;
}
// Hedef dizinin mevcut olup olmadığını kontrol et ve gerekirse oluştur
$destinationDirRealPath = dirname($destination);
if (!file_exists($destinationDirRealPath)) {
if (!mkdir($destinationDirRealPath, 0755, true)) {
$zipsonuc[] = "Hedef dizin oluşturulamadı: " . $destinationDirRealPath;
return $zipsonuc;
}
}
// Kilit dosyasının yolunu belirleyin
$lockFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . md5(realpath($source)) . '.lock';
// Kilit dosyasını oluştur ve kilitle
$fp = fopen($lockFile, 'c');
if (!$fp) {
$zipsonuc[] = "Kilit dosyası oluşturulamadı: " . $lockFile;
return $zipsonuc;
}
// Kilit işlemi
if (!flock($fp, LOCK_EX | LOCK_NB)) {
fclose($fp);
$zipsonuc[] = "Başka bir zip işlemi devam ediyor: " . $source;
return $zipsonuc;
}
// Zip işlemi
$zip = new ZipArchive();
if ($zip->open($destination, ZipArchive::CREATE) !== TRUE) {
$zipsonuc[] = "Zip arşivi açılamadı: " . $destination;
// Kilidi serbest bırak ve kilit dosyasını kapat
flock($fp, LOCK_UN);
fclose($fp);
return $zipsonuc;
}
$sourceRealPath = realpath($source);
if (is_dir($sourceRealPath)) {
// Kaynak bir dizinse, tüm dosyaları ve alt dizinleri ekleyin
$sourceIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($sourceRealPath), RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($sourceIterator as $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($sourceRealPath) + 1);
$zip->addFile($filePath, $relativePath);
}
}
} elseif (is_file($sourceRealPath)) {
// Kaynak bir dosyaysa, sadece bu dosyayı ekleyin
$zip->addFile($sourceRealPath, basename($sourceRealPath));
}
// Yorum ekleme işlemi
if ($comment !== '') {
$zip->setArchiveComment($comment);
}
$zip->close();
// Orijinal dosya adındaki tek tırnakları kaldır
$destinationClean = str_replace("'", "", $destination);
$zipsonuc[] = "Zip Arşivi Başarıyla Oluşturuldu";
$zipsonuc["dosya_adi"] = $destinationClean;
// Kilidi serbest bırak ve kilit dosyasını kapat
flock($fp, LOCK_UN);
fclose($fp);
unlink($lockFile); // Kilit dosyasını sil
return $zipsonuc;
}
}
######################################################################################################################################################
if (!function_exists('zipDataUsingSystem')) {
function zipDataUsingSystem($source, $destination, $comment = '') {
$zipsonuc = [];
// Kaynak dizin veya dosyanın var olup olmadığını kontrol et
if (!file_exists($source)) {
$zipsonuc[] = "Kaynak dosya veya dizin mevcut değil: " . $source;
return $zipsonuc;
}
// Dosya yollarını işlemek ve güvenli hale getirmek
$sourceRealPath = realpath($source);
$destinationSafe = escapeshellarg($destination); // Sadece komut için güvenli hale getir
// Kilit dosyasının yolunu belirleyin
$lockFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . md5($sourceRealPath) . '.lock';
// Kilit dosyasını oluştur ve kilitle
$fp = fopen($lockFile, 'c');
if (!$fp) {
$zipsonuc[] = "Kilit dosyası oluşturulamadı: " . $lockFile;
return $zipsonuc;
}
// Kilit işlemi
if (!flock($fp, LOCK_EX | LOCK_NB)) {
fclose($fp);
$zipsonuc[] = "Başka bir zip işlemi devam ediyor: " . $source;
return $zipsonuc;
}
// Hedef dizinin mevcut olup olmadığını kontrol et ve gerekirse oluştur
$destinationDirRealPath = dirname($destination);
if (!file_exists($destinationDirRealPath)) {
if (!mkdir($destinationDirRealPath, 0755, true)) {
$zipsonuc[] = "Hedef dizin oluşturulamadı: " . $destinationDirRealPath;
// Kilidi serbest bırak ve kilit dosyasını kapat
flock($fp, LOCK_UN);
fclose($fp);
return $zipsonuc;
}
}
// zip komutunu oluştur, kaynak dizinin içine girip içeriklerini ekle
$command = "cd " . escapeshellarg($sourceRealPath) . " && zip -r $destinationSafe .";
$output = [];
$return_var = 0;
exec($command, $output, $return_var);
// Sonuçları kontrol et
if ($return_var === 0) {
// Yorum ekleme işlemi
if ($comment !== '') {
$comment = escapeshellarg(iconv(mb_detect_encoding($comment, mb_detect_order(), true), "UTF-8", $comment));
$commentCommand = "zip -z $destinationSafe <<< $comment";
exec($commentCommand);
}
// Orijinal dosya adındaki tek tırnakları kaldır
$destinationClean = str_replace("'", "", $destination);
$zipsonuc[] = "Zip Arşivi Başarıyla Oluşturuldu";
$zipsonuc["dosya_adi"] = $destinationClean;
} else {
$zipsonuc[] = "Zip Arşivi Bir Hatadan Dolayı Oluşturulamadı: " . implode("<br>", $output);
}
// Kilidi serbest bırak ve kilit dosyasını kapat
flock($fp, LOCK_UN);
fclose($fp);
unlink($lockFile); // Kilit dosyasını sil
return $zipsonuc;
}
}
Thank you from now