Manejo de procesos en Laravel: cómo dominar el comando Stop

  • Publicado el 14 octubre, 2024
  • Palabras: 409

¿Alguna vez iniciaste un proceso de larga duración en Laravel y te preguntaste cómo puedo detenerlo de forma segura? ¡Estás de suerte! Laravel ofrece algunas herramientas ingeniosas para iniciar y detener procesos de forma elegante. ¡Vamos a varlo!

Manejo de procesos en Laravel: cómo dominar el comando Stop

#Detener un solo proceso

 

Primero, veamos cómo detener un solo proceso:

 

$process = Process::timeout(120)->start('bash import.sh');

// Algo de código...

$process->stop();

 

¿Qué está pasando aquí?

 

  • Iniciamos un proceso que ejecuta 'import.sh' con un tiempo de espera de 2 minutos.
  • Cuando estamos listos, llamamos a stop() para finalizarlo correctamente.

 

#Manejo de un grupo de procesos

 

Pero, ¿qué ocurre si tienes que gestionar varios procesos? En este caso, los pools de procesos resultan útiles:

 

$this->pool = Process::pool(function (Pool $pool) {
    $pool->path(base_path())->command('sleep 5');
    $pool->path(base_path())->command('sleep 10');
})->start();

// Detiene todos los procesos en el pool sin problemas
$this->pool->stop();

 

En este ejemplo:

 

  • Creamos un grupo con dos procesos (uno permanece inactivo durante 5 segundos y el otro durante 10)
  • Iniciamos el grupo
  • Cuando terminamos, detenemos todos los procesos del grupo con un solo comando

 

#Uso de las signals

 

¿Quieres más control? Puedes especificar una señal al detener los procesos:

 

// Detiene los procesos con una señal específica
$this->pool->stop($signal);

 

Esto es útil si necesita enviar una señal de terminación específica a sus procesos.

 

#Ejemplo práctico: procesamiento de trabajos en segundo plano

 

Digamos que estás construyendo un sistema para procesar archivos grandes en segundo plano:

 

use Illuminate\Support\Facades\Process;

class FileProcessor
{
    protected $pool;

    public function processFiles(array $files)
    {
        $this->pool = Process::pool(function (Pool $pool) use ($files) {
            foreach ($files as $file) {
                $pool->command("php artisan process:file {$file}");
            }
        })->start();

        // Monitor progress...

        if ($this->shouldStop()) {
            $this->pool->stop();
            return 'Processing stopped';
        }

        return 'Processing completed';
    }

    private function shouldStop()
    {
        // Logic para determinar si el proceso debe terminar
    }
}

 

En este ejemplo:

 

  • Creamos un grupo de procesos para manejar varios archivos
  • Cada proceso ejecuta un comando Artisan para procesar un archivo
  • Tenemos un método para verificar si debemos detener el procesamiento
  • Si necesitamos detenerlo, llamamos a stop() en todo el grupo


Este enfoque le permite procesar varios archivos simultáneamente y detener todos los procesos sin problemas si es necesario.

Antonio Jenaro
Antonio Jenaro

Web Developer

Archivado en:

Fuente: Harris Raftopoulos

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión