Symfony进程组件mysqldump gzip

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

我试图弄清楚如何使用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-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()
,它确实起作用了-我已经更新了票据以显示此方法的实现。