我正在尝试制作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);
}
}
总是获取文件未找到,但备份成功。
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。