Для серверов Linux вам просто нужна одна строка кода для рекурсивного копирования при сохранении разрешения:
exec('cp -a '.$source.' '.$dest);
Другой способ сделать это:
mkdir($dest);
foreach ($iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST) as $item)
{
if ($item->isDir())
mkdir($dest.DIRECTORY_SEPARATOR.$iterator->getSubPathName());
else
copy($item, $dest.DIRECTORY_SEPARATOR.$iterator->getSubPathName());
}
, но он медленнее и делаетне сохранять разрешения.