Login   Register  
PHP Classes
elePHPant
Icontem

File: example.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Barbushin Sergey  >  Script Alone  >  example.php  >  Download  
File: example.php
Role: Example script
Content type: text/plain
Description: Example
Class: Script Alone
Manage the execution of PHP daemon scripts
Author: By
Last change:
Date: 4 years ago
Size: 3,470 bytes
 

Contents

Class file image Download
<?php

/**
 * 
 * @desc This is example of using class ScriptAlone. 
 *
 * Example task: you have a live queue of emails(for example in DB) that must
 *               be sent as soon as possible.
 *
 * 1. You need to have some PHP-script that will check if there are any emails 
 *    in queue, and if yes so send them.
 * 2. This PHP-script must be runned all time, and check queue every second.
 * 3. Only one instance of this PHP-script can be runned, to be shure that one
 *    email was not sent twice.
 * 4. PHP-script can be interrupted in any moment by some error, so in this 
 *    case it must be restarted as soon as possible.
 * 5. PHP-script can have a bug on some iteration, mean: it will be lunched
 *    but not sending emails, so in this case it must be restarted as soon 
 *    as possible.
 * 6. PHP-script should be restarted every 5-10 hours to prevent memory leaks
 *    and do it in safe way (when all current tasks are complete)
 * 7. Ability to stop script in any moment.
 *
 * What you do:
 * 1. Use ScriptAlone in way like in this PHP-script.
 * 2. Configure CRON(http://wikipedia.org/wiki/Cron) that will lunch this 
 *    PHP-script every 5 minutes.
 *
 * What you have:
 * 1. Script will be runned all time, and checked emails every second.
 * 2. There will be only one instance of runned script.
 * 3. Script will be restarted if there will be any errors or iteration time
 *    limit expire.
 * 3. Script will be restarted in safe way every 5 hours.
 * 4. You can any time check if script is runned by checking existing file
 *    with $stateFilepath path (./examples.php.works)
 * 5. You can any time stop runned script by creating file with path
 *    $stateFilepath.'.stop'  (./examples.php.works.stop).
 * 6. All script restarts takes maximum 5 minutes (because of CRON try to run
 *    next script instance every 5 minute).
 * 
 * @see http://code.google.com/p/dabase
 * @author Barbushin Sergey http://www.linkedin.com/in/barbushin
 * 
 */


// example function that sends emails from queue 
function sendEmailsFromQueue($limit) {
    
// ... send some emails from queue
    
return mt_rand(03); // return count of sent emails
}

function 
_debug($message) {
    echo 
$message.'<br />';
    
flush();
}

define('PAUSE_SECONDS_ON_EMPTY_QUEUE'1);
define('EMAILS_GET_FROM_QUEUE'5);
define('MAX_SECONDS_TO_SEND_ONE_EMAIL'3);
$withoutNotifyLifetime =  EMAILS_GET_FROM_QUEUE MAX_SECONDS_TO_SEND_ONE_EMAIL PAUSE_SECONDS_ON_EMPTY_QUEUE;

$stateFilepath __FILE__.'.works';
$scriptLifetime 60*60*5;

// if FALSE so you should check $scriptAlone->isReadyToStop() every time
// if TRUE so checking of $scriptAlone->isReadyToStop() will be doing automaticly in every calling of $scriptAlone->notifyItWorks()
//         and if $scriptAlone->isReadyToStop() == true, so $scriptAlone->notifyItWorks() will throw exception of class ScriptAlone_Stopped
$stopOnReadyToStop false

require_once(
'ScriptAlone.php');
$scriptAlone = new ScriptAlone($stateFilepath$withoutNotifyLifetime$scriptLifetime$stopOnReadyToStop);

_debug('script is runned, you can see it by created file'.$stateFilepath);

while (!
$scriptAlone->isReadyToStop()) {
    
_debug('sendEmailsFromQueue');
    if (!
sendEmailsFromQueue(EMAILS_GET_FROM_QUEUE)) {
        
_debug('sleep');
        
sleep(PAUSE_SECONDS_ON_EMPTY_QUEUE);
    }
    
_debug('notifyItWorks');
    
$scriptAlone->notifyItWorks();
}

_debug('done');