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.

Cómo detectar el apagado de una tarea programada (cronjob) de PHP cuando el servidor se reinicia.

En el marco del desarrollo de una aplicación tipo CMS, utilizo un script periódico con php porque no puedo utilizar crontab, al no ser un administrador del servidor.

Este pseudo-cronjob está funcionando bien. Sin entrar en detalles, se ve así:

public function activateCron()
{
    ignore_user_abort(true);
    set_time_limit(0);
    $time_sleep = 600;

    while ($this->IsStopCron() == 1) {
        sleep($time_sleep);
        exec('php ExecCron.php');
    }
}

Sin embargo, el problema es que si el servidor se reinicia, se detiene.

No creo que haya una forma de reiniciarlo automáticamente (además, no me parece una buena idea), pero me gustaría saber si hay alguna manera de detectar cuando el servidor se detiene, por ejemplo, para enviar automáticamente un correo al administrador del servidor solicitando reiniciarlo.

En mis búsquedas en Google encontré register_shutdown_function, pero no estoy seguro de si eso soluciona mi problema o cómo hacerlo. En cualquier caso, no tuve éxito al intentar usarlo.

Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para detectar el apagado del servidor con PHP

    Si no eres administrador del servidor y no puedes usar crontab para tareas periódicas, entonces puedes usar un script periódico con PHP, como ya has hecho. Sin embargo, si el servidor se reinicia, tu script se detiene, lo cual es un problema.

    Una solución es utilizar la función register_shutdown_function para detectar cuando el servidor se detiene y realizar alguna acción antes de que el script se detenga.

    Aquí tienes un ejemplo de cómo puedes usar register_shutdown_function en tu código existente:

    public function activateCron()
    {
        ignore_user_abort(true);
        set_time_limit(0);
        $time_sleep = 600;
    
        // Registrar la función de apagado
        register_shutdown_function(array($this, 'shutdown'));
    
        while ($this->IsStopCron() == 1) {
            sleep($time_sleep);
            exec('php ExecCron.php');
        }
    }
    
    // La función de apagado
    public function shutdown()
    {
        // Comprobar si el script se detuvo debido a un apagado del servidor
        if (function_exists('connection_status') && connection_status() == CONNECTION_TIMEOUT) {
            // Realizar alguna acción, como enviar un correo electrónico al administrador del servidor
            mail('admin@example.com', 'Apagado del servidor', 'El servidor ha sido apagado.');
        }
    }
    

    Este código registra una función de apagado llamada shutdown, que se llamará cuando el script se detenga por cualquier motivo, incluido un apagado del servidor.

    La función connection_status() devuelve el estado de la conexión actual y si devuelve CONNECTION_TIMEOUT, significa que el script se detuvo debido a un apagado o reinicio del servidor.

    Puedes reemplazar la función mail con cualquier otro código que desees usar para realizar una acción cuando el servidor se apaga.

    ¡Espero que esto te sea de ayuda!

Comments are closed.