• PHP: controlul execuției din linie de comanda (ex: cron job)

    by  • 13 august 2013 • Tutoriale • 0 Comments

    Atunci când rulezi scripturi PHP din linie de comanda, mai ales scripturi programate (cron jobs), ai nevoie de un mecanism de verificare astfel încât sa elimini suprapunerea execuțiilor. Cel mai simplu mecanism de acest fel poate fi crearea unui fișier la începutul execuției și ștergerea lui la sfârșit. Dar ce se întâmplă dacă, dintr-un oarecare motiv, scriptul se blochează în timpul execuției și fișierul nu se mai șterge? Ajungi în situația in care nu-ți mai pornește execuția pentru că fișierul există.
    De aceea ai nevoie de un mecanism mai deștept de verificare.

    function isLocked ($lockFile) {
        # dacă fișierul există, se verifică dacă scriptul încă rulează
        # dacă nu există, se crează fișierul și se returnează FALSE
    
        if ( file_exists ( $lockFile ) ) {
            # se ia ID-ul procesului din fișier (PID)
            $lockingPID = trim ( file_get_contents( $lockFile ) );
     
            # se iau toate ID-urile care rulează în sistem
            $pids = explode ( "\n", trim ( `ps -e | awk '{print $1}'` ) );
     
            # dacă PID-ul se afla printre PID-urile care rulează se returnează TRUE
            if( in_array ( $lockingPID, $pids ) )  return true;
     
            # fișierul există dar procesul nu mai rulează, înseamnă ca s-a blocat
            echo "Șterg fișierul pid.\n";
            unlink ( $lockFile );
        }
     
        file_put_contents ( $lockFile, getmypid() . "\n" );
        return false;
    }

    Exemplu de utilizare

    #!/usr/bin/php 
    <?php 
     
    $pidFile = "/var/run/". basename ( __FILE__ ) .".pid";
    if ( !isLocked ( $pidFile ) ) {
        // aici se execută
        // scriptul tău
    }
     
    // ștergem fișierul cu toate că
    // logica de mai sus iți permite să lași fișierul pe disc
    unlink ( $pidFile );
    ?>

    About

    Webmaster la Bitdefender. Pasionat de tot ce tine de gadgeturi, in special de Web si Android. Facebook: www.facebook.com/manuel.enache Twitter: twitter.com/enakero

    http://www.enake.ro

    Comments

    Loading Facebook Comments ...

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *