php fopen()对于使用Symfony / Component / Process类在同一进程中创建的文件,没有此类文件或目录

问题描述 投票:1回答:1

我正在尝试制作mysqldump备份并将该备份上传到AWS s3。一切都分开工作,但是当在单个脚本中尝试两者时,fopen找不到该文件,即使file_exists无法读取该文件。请有人帮忙。这是代码

function db_backup($db)
{
    date_default_timezone_set("Asia/Kolkata");
    $DBUSER = env('DB_USERNAME');
    $DBPASSWD = env('DB_PASSWORD');
    $today = date('YmdHis');
    $output_file = "{$db}_{$today}.sql.gz";
    if (!is_dir(storage_path('backups'))) mkdir(storage_path('backups'));
    $path = escapeshellarg(storage_path("backups/{$output_file}"));
    $process = new Process(
        sprintf(
            'mysqldump --routines=true --compact --comments=false -u%s -p%s %s |gzip > %s',
            escapeshellarg($DBUSER),
            escapeshellarg($DBPASSWD),
            $db,
            $path
        )
    );
    try {
        $process->run();
        if ($process->isSuccessful()) {
            if (file_exists($path)) {
                //$aws = resolve(S3Service::class);
                //$aws->upload($path, $output_file);
                Log::info("Daily Backup Successs {$path}");
            } else {
                echo "File Not Found: {$path} \n";
            }
        }
    } catch (ProcessFailedException $err) {
        Log::error('Daily Backup Failed', (array) $err);
    }
}

总是获取文件未找到,但备份成功。

php mysql amazon-s3 process fopen
1个回答
0
投票

Symfony的Process()构造函数采用数组,而不是字符串。这是一些useful examples in the documentation,概述了正确的用法。

幸运的是,有一个静态帮助器Process::fromShellCommandline(),可用于通过字符串命令创建新的Process对象。

然后您可以将代码修改为类似于以下内容:

Process::fromShellCommandline()

未收到任何错误的原因可能是由于您的错误报告所致。为了证明这项工作有效,我必须修改您的脚本并运行命令$process = Process::fromShellCommandline(sprintf( 'mysqldump --routines=true --compact --comments=false -u%s -p%s %s |gzip > %s', escapeshellarg($DBUSER), escapeshellarg($DBPASSWD), $db, $path )); 而不是ymmv。

© www.soinside.com 2019 - 2024. All rights reserved.