Рекурсивная архивация файлов и папок PHP

Всем привет и заранее спасибо за помощь! p.s. Не душите за нарушение MVC паттерна. Впервые пишу достаточно глобальный проект с его реализацией.

В общем и целом, по нажатию на кнопку необходимо либо скачивать файл сразу (если он один, если это не папка), либо, если целью скачивания является директория - закинуть все файлы и подкаталоги, находящиеся в ней в архив. Пытаюсь сделать это всё через рекурсию, но на данном этапе при попытке скачивания директории - скачивается файл который лежит глубже всех и создаются архивы папок, который лежат на пути к этому файлу.

    public function downloadFile($name, $path)
    {
        $url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $sdPath = $path . $name;
        $ex = pathinfo($sdPath, PATHINFO_EXTENSION);
        if ($ex === "") {
            $zip = new \ZipArchive();
            $zip->open($sdPath . ".zip", \ZipArchive::CREATE);
            $files = scandir($sdPath);
            unset($files[0], $files[1]);
            if (count($files) === 0) {
                ?>
                <script> alert("Папка пуста!") </script> <?php
            } else {
                foreach ($files as $file) {
                    $zip->addFile($sdPath . "/{$file}", $name . "/{$file}");
                    $this->downloadFile($file, $sdPath . "/");
                }
                $zip->close();
                ?>
                <script>alert("Создан архив для скачивания!")</script> <?php
            }
        } else {
            $this->model->downloadFile($sdPath);
        }
    }

Вот model->downloadFile():

public function downloadFile($fileName){
        $ex = pathinfo($fileName, PATHINFO_EXTENSION);
        $linkHash = substr($_SERVER['QUERY_STRING'], 5);
        $link = mysqli_connect("localhost", "root", "root", "file-manager");

        if ($ex == ""){
            header("Content-Type: application/octet-stream");
            header("Accept-Ranges: bytes");
            header("Content-Length: ".filesize($fileName));
            header("Content-Disposition: attachment; filename=". basename($fileName) .".zip");
            readfile($fileName);
            exit();
        }
        else{
            header("Content-Type: application/octet-stream");
            header("Accept-Ranges: bytes");
            header("Content-Length: ".filesize($fileName));
            header("Content-Disposition: attachment; filename=". basename($fileName));
            readfile($fileName);
            exit();
        }
    }

Ответы (0 шт):