php - php fopen() 没有使用 Symfony/Component/Process 类在同一进程中创建的文件的此类文件或目录
问题描述
我正在尝试进行 mysqldump 备份并将该备份上传到 aws s3。一切都在单独工作,但是当在一个脚本中尝试两者时,即使 file_exists 也无法读取文件,fopen 也找不到该文件。请有人帮忙。这是代码
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() 构造函数接受一个数组,而不是一个字符串。以下是文档中的一些有用示例,概述了正确的用法。
幸运的是,有一个静态帮助Process::fromShellCommandline()
程序可用于从字符串命令创建新的 Process 对象。
然后,您可以将代码修改为类似于:
$process = Process::fromShellCommandline(sprintf(
'mysqldump --routines=true --compact --comments=false -u%s -p%s %s |gzip > %s', escapeshellarg($DBUSER),
escapeshellarg($DBPASSWD),
$db,
$path
));
您没有收到任何错误的原因可能是由于您的错误报告。为了证明这个工作我不得不修改你的脚本并运行命令'echo "%s:%s %s" | gzip > %s',
而不是 ymmv。
推荐阅读
- java - 是否可以将 JMH 与 JDK 17 一起使用?
- javascript - 如何查找对象数组是否包含javascript中的元素?如果包含,如何访问它?
- visual-studio-code - 如何从 vscode 扩展 API 中的 html 标签获取类字符串
- javascript - 如何在范围外使用套接字?
- java - 运行此 Spring Batch 应用程序时发生“HikariDataSource 已关闭”异常,为什么?怎么修?
- javascript - 限制 Google 自定义搜索中的广告数量
- reactjs - 反应原生:命令失败:./gradlew app:installDebug
- c# - 如何在 GET-Method 中排除 JSON 中的一些模型字段?
- python - Python列表排序与仿真优化问题
- msbuild - 进行 WebDeploy 时不要删除 web.config