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!

#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.
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