Symfony进程组件mysqldump gzip
我试图弄清楚如何使用Symfony进程组件将带有gzip压缩的管道添加到mysqldump命令中。我所拥有的,但似乎不起作用的是:Symfony进程组件mysqldump gzip,symfony,Symfony,我试图弄清楚如何使用Symfony进程组件将带有gzip压缩的管道添加到mysqldump命令中。我所拥有的,但似乎不起作用的是: $date = Carbon::now(); $fileName = $date->format('Y-m-d_H-i-s').'.sql'; $command = [ $this->mysqldumpPath, '--add-drop-table', '--skip-comments', '--default-cha
$date = Carbon::now();
$fileName = $date->format('Y-m-d_H-i-s').'.sql';
$command = [
$this->mysqldumpPath,
'--add-drop-table',
'--skip-comments',
'--default-character-set=utf8mb4',
$this->ignoreTables(),
'--user='.$this->dbConfig['username'],
'--password='.$this->dbConfig['password'],
$this->dbConfig['database'],
];
if ($this->compress) {
$command[] = '| gzip -9';
$fileName = $fileName.'.gz';
}
$file = $this->backupPath($fileName);
$process = new Process(array_merge(
$command,
['--result-file='.$file]
));
$process->run();
我得到的错误是
mysqldump:找不到表:“| gzip-9”
ignoreTables()
方法
private function ignoreTables(): ?string
{
if (empty($this->ignoreTables)) {
return null;
}
return collect($this->ignoreTables)->map(
fn(string $table) => sprintf(
'--ignore-table=%s.%s',
$this->dbConfig['database'],
$table
)
)->implode(' ');
}
知道如何将管道gzip标志传递给命令吗?您仍然可以将命令构建为字符串,并在shell中运行它 不过,我认为您的命令不会像编写的那样工作,因此我正在进行我认为必要的更改(您也可以清理这个问题,而不使用数组来构建命令) 主要内容: 助手方法:
private function ignoreTables(): array
{
return collect($this->ignoreTables)->map(
fn(string $table) => sprintf(
'%s.%s',
$this->dbConfig['database'],
$table
)
);
}
private function getIgnoredTablesArguments(): array
{
$arguments = [];
foreach ($this->ignoreTables as $k => $v) {
$argName = sprintf('${:IGNORE_%s}', $k);
$arguments[] = sprintf('--ignore-table="%s"', $argName);
}
return $arguments;
}
private function getIgnoredTablesParameters(): array
{
$envs = [];
foreach ($this->ignoreTables() as $k => $v) {
$argName = sprintf('IGNORE_%s', $k);
$envs = array_merge($envs, [$argName => $v]);
}
return $envs;
}
您仍然可以将命令构建为字符串,并在shell中运行 不过,我认为您的命令不会像编写的那样工作,因此我正在进行我认为必要的更改(您也可以清理这个问题,而不使用数组来构建命令) 主要内容: 助手方法:
private function ignoreTables(): array
{
return collect($this->ignoreTables)->map(
fn(string $table) => sprintf(
'%s.%s',
$this->dbConfig['database'],
$table
)
);
}
private function getIgnoredTablesArguments(): array
{
$arguments = [];
foreach ($this->ignoreTables as $k => $v) {
$argName = sprintf('${:IGNORE_%s}', $k);
$arguments[] = sprintf('--ignore-table="%s"', $argName);
}
return $arguments;
}
private function getIgnoredTablesParameters(): array
{
$envs = [];
foreach ($this->ignoreTables() as $k => $v) {
$argName = sprintf('IGNORE_%s', $k);
$envs = array_merge($envs, [$argName => $v]);
}
return $envs;
}
我也没有找到任何方法来做这件事-也许写那个文件更好,在第二个过程中压缩它?我也没有找到任何方法来做这件事-也许写那个文件更好,然后在第二个过程中压缩它?谢谢@msg-但是这样我必须自己处理转义和可移植性,而不是使用数组格式。这并不理想,但一个解决方案应该真的没有其他选择。它正在与占位符抗争,并且一直告诉我
mysqldump:unknown option'-9.
,当我删除-9
时,它会告诉我|gzip
表不存在。看来唯一可行的办法就是在所有变量都被替换的情况下通过声明-真丢脸,但我看不出其他办法可行。谢谢。除了ignoreTables()
,它确实有效-我已经更新了票证以显示此方法的实现。谢谢@msg-但是这种方式我必须自己处理转义和可移植性,而不是使用数组格式。这并不理想,但一个解决方案应该真的没有其他选择。它正在与占位符抗争,并且一直告诉我mysqldump:unknown option'-9.
,当我删除-9
时,它会告诉我|gzip
表不存在。看来唯一可行的办法就是在所有变量都被替换的情况下通过声明-真丢脸,但我看不出其他办法可行。谢谢。除了ignoreTables()
,它确实起作用了-我已经更新了票据以显示此方法的实现。