es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Symfony: Redirigir la salida de un proceso

Estoy actualizando una aplicación antigua de Symfony (v2.8) a Symfony 5.3. Estoy utilizando el componente de proceso donde los argumentos deben ser pasados de otra manera que antes.

Mi código anterior era así:

use Symfony\Component\Process\Process;

$cmd = sprintf('mysqldump mydatabase > %s', $outputTarget);
$process = new Process($cmd);
$process->run();

Ahora, el constructor de Proceso de Symfony espera que el binario y los argumentos se pasen como un array (ver aquí).

¿Cómo puedo lograr la redirección de salida con el nuevo estilo?

$process = new Process(['mysqldump', 'mydatabase', '>', $outputTarget]);
$process->run();

No funcionará, porque el símbolo > sería escapado.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la redirección de salida con el nuevo estilo de pasar argumentos al constructor de Process de Symfony, se puede usar el método setInput() para establecer la entrada del comando como el contenido del volcado. Aquí hay un ejemplo:

    use Symfony\Component\Process\Process;
    
    $process = new Process(['mysqldump', 'mydatabase']);
    $process->setInput(file_get_contents($outputTarget));
    $process->run();
    

    Este código crea una nueva instancia de Process con el comando mysqldump y el argumento mydatabase como un array. Luego, utiliza el método setInput() para establecer el contenido del volcado como entrada del comando, en lugar de usar la redirección de salida. Finalmente, ejecuta el proceso con el método run(), tal como en el código antiguo.

    Tenga en cuenta que este enfoque puede no ser el mejor para volcados muy grandes, ya que puede ocupar mucha memoria. En ese caso, podría usar la clase ProcessBuilder para construir el comando como una cadena y pasarlo al constructor de Process, lo que le permitiría usar la redirección de salida como antes.

Comments are closed.