You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel压缩public_html根目录失败,本地正常服务器报错

解决Laravel中压缩public_html目录时的open_basedir限制问题

问题根源

报错SplFileInfo::isDir(): open_basedir restriction in effect是因为代码尝试访问了public_html的上级目录(/home/admin/web/abc.com/),而服务器open_basedir配置仅允许访问/home/admin/web/abc.com/public_html和/home/admin/tmp,权限设置777无法突破这个路径限制。

改进后的压缩函数

以下函数严格限制操作范围在public_html目录内,跳过.和..目录,避免触发路径限制:

use ZipArchive;
use Illuminate\Support\Facades\File;

function compressPublicHtml($outputPath)
{
    $rootPath = '/home/admin/web/abc.com/public_html';
    if (!File::isDirectory($rootPath)) {
        throw new \Exception('目标目录不存在');
    }

    $zip = new ZipArchive();
    if ($zip->open($outputPath, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) {
        throw new \Exception('无法创建压缩文件');
    }

    // 递归遍历目录,自动跳过.和..
    $files = new \RecursiveIteratorIterator(
        new \RecursiveDirectoryIterator($rootPath, \RecursiveDirectoryIterator::SKIP_DOTS),
        \RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $file) {
        $filePath = $file->getRealPath();
        // 额外校验确保文件在允许路径内
        if (str_starts_with($filePath, $rootPath)) {
            $relativePath = substr($filePath, strlen($rootPath) + 1);
            $file->isDir() ? $zip->addEmptyDir($relativePath) : $zip->addFile($filePath, $relativePath);
        }
    }

    $zip->close();
    return $outputPath;
}

// 使用示例:输出到open_basedir允许的tmp目录
$zipFile = '/home/admin/tmp/public_html_backup.zip';
compressPublicHtml($zipFile);

替代方案:使用Shell命令(服务器允许时)

若服务器允许执行shell命令,这是更高效的方式,通常不受open_basedir限制:

function compressPublicHtmlViaShell()
{
    $rootPath = '/home/admin/web/abc.com/public_html';
    $outputPath = '/home/admin/tmp/public_html_backup.zip';
    // 进入目标目录后压缩所有内容
    $command = "cd {$rootPath} && zip -r {$outputPath} .";
    shell_exec($command);
    
    if (!file_exists($outputPath)) {
        throw new \Exception('压缩失败');
    }
    return $outputPath;
}

注意事项

  • 压缩文件输出路径必须在open_basedir允许范围内(比如示例中的/home/admin/tmp)。
  • 不要使用realpath('')动态获取根路径,直接写死绝对路径更可靠,避免因当前工作目录变化触发上级目录访问。

内容的提问来源于stack exchange,提问作者Anonymous Girl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:25:21