Individuelle Verzeichnisse per ZIP / PHP / BASH komprimieren

PHP Script, um unabhängig vom Backup-Werkzeug beliebge Verzeichnisse unter Ausschluss frei definierbarer Pfade zu komprimieren
require_once($_SERVER['DOCUMENT_ROOT'] . '/weblication/grid.php');

if( wUserCur::getType() !== 'admin' ) {
    exit( 'noPermission' );
}

// Zu sicherndes Verzeichnis
$project = 'base-wAssets';

// Auszuschliessende Pfade
$excludedDirs = [
    'wThumbnails/',
    'documents/versions/',
    'weblication/index/',
];


$targetDir = $_SERVER['DOCUMENT_ROOT'] . '/';
$targetFile = $targetDir . 'project-' . $project . '.zip';

$zipDir = $_SERVER['DOCUMENT_ROOT'] . '/' . $project . '/';

if( !is_dir( $zipDir ) ) {
    exit( 'zipDir does not exist: ' . $zipDir );
}

$excludedString = '';

if( !empty( $excludedDirs ) ) {
    $excludedString = ' -x';
    foreach( $excludedDirs as $dir ) {
        $excludedString .= ' **' . wPathName::removeSlashBefore( $dir ) . '*';
    }
}

$cmd = 'zip -r ' . $targetFile . ' ' . $zipDir . $excludedString;

if( is_file( $targetFile ) ) {
    wRepository::deleteDocument( wPathName::removeDocumentRoot( $targetFile ) );
}

echo exec( $cmd );
$link = str_replace( $_SERVER['DOCUMENT_ROOT'], '', $targetFile );
$size = wDocumentData::getSize( $link, 'MB' );
$downloadLink = '<br/><a href="' . $link . '" target="_blank">Download ' . $project . ' (' . $size . ')</a > ';

echo $downloadLink;