i have an issue by making backup from database (Postgresql 11) with Symfony(6.01) Command. I use also for that the Process Bundle of Symfony.
Problem is, if the Controller Action calls the command to backup the database, it saves finally an empty SQL-File. There is also no errors in dev.log or Postgreql logfile.
But when i print out the command to the browser and execute this in the terminal the SQL-File is filled correctly and not empty.
Any Idea what could be the problem. Thanks in advise. PS: I can not use shell script. Didn't got it better here with CodeFormatting of the command class.
<?php
namespace App\XXXXXX\YYYYYYBundle\Command;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Process\Process;
#[AsCommand( name: 'xxxxx:dump-database', description: 'Creates a xxxxx database dump.', aliases: ['xxxxx:dump-database'], hidden: false, )]
class DatabaseDumpCommand extends Command {
/**
* @var string
*/
private string $rootDir;
/**
* @var string
*/
private string $databaseHost;
/**
* @var string
*/
private string $databaseName;
/**
* @var string
*/
private string $databaseUser;
/**
* @var string
*/
private string $databasePW;
/** * @param string $databaseHost
* @param string $databaseName
* @param string $databaseUser
* @param string $databasePW
* @param KernelInterface $kernel
*/
public function __construct(
string $databaseHost,
string $databaseName,
string $databaseUser,
string $databasePW,
KernelInterface $kernel)
{
$this->databaseName = $databaseName;
$this->databaseUser = $databaseUser;
$this->databaseHost = $databaseHost;
$this->databasePW = $databasePW;
$this->rootDir = $kernel->getProjectDir();
parent::__construct();
}
protected function configure(): void
{
parent::configure();
$this
->addArgument('file-name', InputArgument::OPTIONAL, 'Name of dump file')
->addArgument('time', InputArgument::OPTIONAL, 'created at')
;
}
public function execute(InputInterface $input, OutputInterface $output): int
{
set_time_limit(0);
$time = $input->getArgument('time');
if (!$time) {
$time = date('Y-m-dH:i:s');
}
$fileName = $input->getArgument('file-name');
if(!$fileName) {
$fileName = "xxxxxDbDump";
}
$fileName .= "$time.sql";
$backupPath = $this->rootDir."/DUMPS/";
$backupPathTemp = '/tmp/';
$path = "/usr/bin/pg_dump";
$sqlQuery = "export PGPASSWORD='$this->databasePW';$path --host=$this->databaseHost --port=5432 --username=$this->databaseUser --create --clean
--verbose $this->databaseName > $backupPathTemp$fileName;cp /tmp/$fileName $backupPath$fileName";
//echo $sqlQuery;
$cmd = method_exists(Process::class, 'fromShellCommandline') ? Process::fromShellCommandline($sqlQuery, null, null, null, null) : new Process($sqlQuery, null, null, null, null);
/** @var Process $cmd */
$cmd->run();
if (!$cmd->isSuccessful()) {
return false;
}
return true;
}
}
This has worked after the $sqlQuery was written in the CommandClass by this way:
$dumpQuery = 'export PGPASSWORD="' . $this->databasePW . '"; ' .
$path . ' ' .
'--host=' . $this->databaseHost . ' ' .
'--username=' . $this->databaseUser . ' ' .
'--port='.$this->databasePort . ' ' .
'--no-password ' .
'--create ' .
'--clean ' .
'--verbose ' .
$this->databaseName . ' ' . '> ' . $backupPathTemp.$fileName .';' .
'cp ' . $backupPathTemp.$fileName . ' ' . $backupPath.$fileName;