How to detect whether a PHP script is already running?

后端 未结 9 1334
借酒劲吻你
借酒劲吻你 2021-01-31 11:26

I have a cron script that executes a PHP script every 10 minutes. The script checks a queue and processes the data in the queue. Sometimes the queue has enough data to last ov

相关标签:
9条回答
  • 2021-01-31 11:52

    I know this is an old question but in case someone else is looking here I'll post some code. This is what I have done recently in a similar situation and it works well. Put put this code at the top of your file and if the same script is already running it will leave it be and end the new one.

    I use it to keep a monitoring system running at all times. A cron job starts the script every 5 minutes but unless the other has stopped from some reason (usually if it has crashed, which is very rare!) the new one will just exit itself.

    // The file to store our process file
    define('PROCESS_FILE', 'process.pid');
    
    // Check I am running from the command line
    if (PHP_SAPI != 'cli') {
        log_message('Run me from the command line');
        exit;
    }
    
    // Check if I'm already running and kill myself off if I am
    $pid_running = false;
    if (file_exists(PROCESS_FILE)) {
        $data = file(PROCESS_FILE);
        foreach ($data as $pid) {
            $pid = (int)$pid;
            if ($pid > 0 && file_exists('/proc/' . $pid)) {
                $pid_running = $pid;
                break;
            }
        }
    }
    if ($pid_running && $pid_running != getmypid()) {
        if (file_exists(PROCESS_FILE)) {
            file_put_contents(PROCESS_FILE, $pid);
        }
        log_message('I am already running as pid ' . $pid . ' so stopping now');
        exit;
    } else {
        // Make sure file has just me in it
        file_put_contents(PROCESS_FILE, getmypid());
        log_message('Written pid with id '.getmypid());
    }
    

    It will NOT work without modification on Windows, but should be fine in unix based systems.

    0 讨论(0)
  • 2021-01-31 11:53

    A common way for *nix daemons (though not necessarily PHP scripts, but it will work) is to use a .pid file.

    When the script starts check for the existence of a .pid file named for the script (generally stored in /var/run/). If it doesn't exist, create it setting its contents to the PID of the process running the script (using getmypid) then continue with normal execution. If it does exist read the PID from it and see if that process is still running, probably by running ps $pid. If it is running, exit. Otherwise, overwrite its contents with your PID (as above) and continue normal execution.

    When execution finished, delete the file.

    0 讨论(0)
  • 2021-01-31 11:55

    This worked for me. Set a database record with a lock flag and a time stamp. My script should complete well within 15min so added that as a last locked feild to check:

           $lockresult = mysql_query("
           SELECT *
           FROM queue_locks
           WHERE `lastlocked` > DATE_SUB(NOW() , INTERVAL 15 MINUTE)    
           AND `locked` = 'yes'
           AND `queid` = '1'
           LIMIT 1
            "); 
    $LockedRowCount = mysql_num_rows($lockresult);
    
    if($LockedRowCount>0){
        echo "this script is locked, try again later";
        exit;   
    }else{
    //Set the DB record to locked and carry on son
    $result = mysql_query("
                UPDATE `queue_locks` SET `locked` = 'yes', `lastlocked` = CURRENT_TIMESTAMP WHERE `queid` = 1;
                ");
    
    }
    

    Then unlock it at the end of the script:

        $result = mysql_query("UPDATE `queue_locks` SET `locked` = 'no' WHERE `queid` = 1;");
    
    0 讨论(0)
提交回复
热议问题