Ver Mensaje Individual
  #21 (permalink)  
Antiguo 29/05/2007, 19:26
elbastardo
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 20 años, 1 mes
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

Bueno es bastante largo el script, no tengo otra manera de mostrártelo que publicándolo acá. Aparentemente es para realizar tareas programadas durante el día, back ups, etc. Fijate si lo entendés y me decis que te parece.

Aquí va la parte del script:

Código PHP:
<?

/****************************************/
/*        config section                    */
/****************************************/

// || PLEASE NOTE:
// || all paths used here and in cron scripts 
// || must be absolute or relative to pseudo-cron.inc.php!
// ||
// || To easily use absolute paths, have a look at how the
// || crontab location is defined below.


// The file that contains the job descriptions.
$cronTab = dirname(__FILE__)."/cronjobs/crontab.txt";

// The directory where the script can store information on completed jobs and its log file.
// include trailing slash
$writeDir = dirname(__FILE__)."/cronjobs/";

// Control logging, true=use log file, false=don't use log file
$useLog = true;

// Where to send cron results.
//$sendLogToEmail = "[email protected]";
$sendLogToEmail = "";

// Maximum number of jobs run during one call of pseudocron.
// Set to a low value if your jobs take longer than a few seconds and if you scheduled them
// very close to each other. Set to 0 to run any number of jobs.
$maxJobs = 1;

// Turn on / off debugging output
// DO NOT use this on live servers!
$debug = false;

/****************************************/
/*        don't change anything here        */
/****************************************/

define("PC_MINUTE",    1);
define("PC_HOUR",    2);
define("PC_DOM",    3);
define("PC_MONTH",    4);
define("PC_DOW",    5);
define("PC_CMD",    7);
define("PC_COMMENT",    8);
define("PC_CRONLINE", 20);

$resultsSummary = "";

function 
logMessage($msg) {
    GLOBAL 
$writeDir, $useLog, $debug, $resultsSummary;
    if (
$msg[strlen($msg)-1]!="\n") {
        
$msg.="\n";
    }
    if (
$debug) echo $msg;
    
$resultsSummary.= $msg;
    if (
$useLog) {
        
$logfile = $writeDir."pseudo-cron.log";
        
$file = fopen($logfile,"a");
        
fputs($file,date("r",time())."  ".$msg);
        
fclose($file);
    }
}

function 
lTrimZeros($number) {
    GLOBAL 
$debug;
    while (
$number[0]=='0') {
        
$number = substr($number,1);
    }
    return 
$number;
}

function 
multisort(&$array, $sortby, $order='asc') {
   foreach(
$array as $val) {
       
$sortarray[] = $val[$sortby];
   }
   
$c = $array;
   
$const = $order == 'asc' ? SORT_ASC : SORT_DESC;
   
$s = array_multisort($sortarray, $const, $c, $const);
   
$array = $c;
   return 
$s;
}

function 
parseElement($element, &$targetArray, $numberOfElements) {
    GLOBAL 
$debug;
    
$subelements = explode(",",$element);
    for (
$i=0;$i<$numberOfElements;$i++) {
        
$targetArray[$i] = $subelements[0]=="*";
    }
    
    for (
$i=0;$i<count($subelements);$i++) {
        if (
preg_match("~^(\\*|([0-9]{1,2})(-([0-9]{1,2}))?)(/([0-9]{1,2}))?$~",$subelements[$i],$matches)) {
            if (
$matches[1]=="*") {
                
$matches[2] = 0;        // from
                
$matches[4] = $numberOfElements;        //to
            
} elseif ($matches[4]=="") {
                
$matches[4] = $matches[2];
            }
            if (
$matches[5][0]!="/") {
                
$matches[6] = 1;        // step
            
}
            for (
$j=lTrimZeros($matches[2]);$j<=lTrimZeros($matches[4]);$j+=lTrimZeros($matches[6])) {
                
$targetArray[$j] = TRUE;
            }
        }
    }
}

function 
incDate(&$dateArr, $amount, $unit) {
    GLOBAL 
$debug;
    
    if (
$debug) echo sprintf("Increasing from %02d.%02d. %02d:%02d by %d %6s ",$dateArr[mday],$dateArr[mon],$dateArr[hours],$dateArr[minutes],$amount,$unit);
    if (
$unit=="mday") {
        
$dateArr["hours"] = 0;
        
$dateArr["minutes"] = 0;
        
$dateArr["seconds"] = 0;
        
$dateArr["mday"] += $amount;
        
$dateArr["wday"] += $amount % 7;
        if (
$dateArr["wday"]>6) {
            
$dateArr["wday"]-=7;
        }

        
$months28 = Array(2);
        
$months30 = Array(4,6,9,11);
        
$months31 = Array(1,3,5,7,8,10,12);
        
        if (
            (
in_array($dateArr["mon"], $months28) && $dateArr["mday"]==28) ||
            (
in_array($dateArr["mon"], $months30) && $dateArr["mday"]==30) ||
            (
in_array($dateArr["mon"], $months31) && $dateArr["mday"]==31)
        ) {
            
$dateArr["mon"]++;
            
$dateArr["mday"] = 1;
        }
        
    } elseif (
$unit=="hour") {
        if (
$dateArr["hours"]==23) {
            
incDate($dateArr, 1, "mday");
        } else {
            
$dateArr["minutes"] = 0;
            
$dateArr["seconds"] = 0;
            
$dateArr["hours"]++;
        }
    } elseif (
$unit=="minute") {
        if (
$dateArr["minutes"]==59) {
            
incDate($dateArr, 1, "hour");
        } else {
            
$dateArr["seconds"] = 0;
            
$dateArr["minutes"]++;
        }
    }
    if (
$debug) echo sprintf("to %02d.%02d. %02d:%02d\n",$dateArr[mday],$dateArr[mon],$dateArr[hours],$dateArr[minutes]);
}

function 
getLastScheduledRunTime($job) {
    GLOBAL 
$debug;

    
$extjob = Array();
    
parseElement($job[PC_MINUTE], $extjob[PC_MINUTE], 60);
    
parseElement($job[PC_HOUR], $extjob[PC_HOUR], 24);
    
parseElement($job[PC_DOM], $extjob[PC_DOM], 31);
    
parseElement($job[PC_MONTH], $extjob[PC_MONTH], 12);
    
parseElement($job[PC_DOW], $extjob[PC_DOW], 7);
    
    
$dateArr = getdate(getLastActualRunTime($job[PC_CMD]));
    
$minutesAhead = 0;
    while (
        
$minutesAhead<525600 AND 
        (!
$extjob[PC_MINUTE][$dateArr["minutes"]] OR 
        !
$extjob[PC_HOUR][$dateArr["hours"]] OR 
        (!
$extjob[PC_DOM][$dateArr["mday"]] OR !$extjob[PC_DOW][$dateArr["wday"]]) OR
        !
$extjob[PC_MONTH][$dateArr["mon"]])
    ) {
        if (!
$extjob[PC_DOM][$dateArr["mday"]] OR !$extjob[PC_DOW][$dateArr["wday"]]) {
            
incDate($dateArr,1,"mday");
            
$minutesAhead+=1440;
            continue;
        }
        if (!
$extjob[PC_HOUR][$dateArr["hours"]]) {
            
incDate($dateArr,1,"hour");
            
$minutesAhead+=60;
            continue;
        }
        if (!
$extjob[PC_MINUTE][$dateArr["minutes"]]) {
            
incDate($dateArr,1,"minute");
            
$minutesAhead++;
            continue;
        }
    }

    
//if ($debug) print_r($dateArr);
    
    
return mktime($dateArr["hours"],$dateArr["minutes"],0,$dateArr["mon"],$dateArr["mday"],$dateArr["year"]);
}

function 
getJobFileName($jobname) {
    GLOBAL 
$writeDir;
    GLOBAL 
$debug;
    
$jobfile = $writeDir.urlencode($jobname).".job";
    return 
$jobfile;
}

function 
getLastActualRunTime($jobname) {
    GLOBAL 
$debug;
    
$jobfile = getJobFileName($jobname);
    if (
file_exists($jobfile)) {
        return 
filemtime($jobfile);
    }
    return 
0;
}

function 
markLastRun($jobname, $lastRun) {
    
$jobfile = getJobFileName($jobname);
    
touch($jobfile);
}

function 
runJob($job) {
    GLOBAL 
$debug, $sendLogToEmail, $resultsSummary;
    
$resultsSummary = "";
    
    
$lastActual = $job["lastActual"];
    
$lastScheduled = $job["lastScheduled"];
    
    if (
$lastScheduled<time()) {
        
logMessage("Running     ".$job[PC_CRONLINE]);
        
logMessage("  Last run:       ".date("r",$lastActual));
        
logMessage("  Last scheduled: ".date("r",$lastScheduled));
        if (
$debug) {
            
$e = @error_reporting(0);
            include(
dirname(__FILE__)."/".$job[PC_CMD]);        // display errors only when debugging
            
@error_reporting($e);
        } else {
            
$e = @error_reporting(0);
            @include(
$job[PC_CMD]);        // any error messages are supressed
            
@error_reporting($e);
        }
        
markLastRun($job[PC_CMD], $lastScheduled);
        
logMessage("Completed    ".$job[PC_CRONLINE]);
        if (
$sendLogToEmail!="") {
            
mail($sendLogToEmail, "[cron] ".$job[PC_COMMENT], $resultsSummary);
        }
        return 
true;
    } else {
        if (
$debug) {
            
logMessage("Skipping     ".$job[PC_CRONLINE]);
            
logMessage("  Last run:       ".date("r",$lastActual));
            
logMessage("  Last scheduled: ".date("r",$lastScheduled));
            
logMessage("Completed    ".$job[PC_CRONLINE]);
        }
        return 
false;
    }
}

function 
parseCronFile($cronTabFile) {
    GLOBAL 
$debug;
    
$file = file($cronTabFile);
    
$job = Array();
    
$jobs = Array();
    for (
$i=0;$i<count($file);$i++) {
        if (
$file[$i][0]!='#') {
//            old regex, without dow abbreviations:
//            if (preg_match("~^([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-7,/*]+|Sun|Mon|Tue|Wen|Thu|Fri|Sat)\\s+([^#]*)(#.*)?$~i",$file[$i],$job)) {
            
if (preg_match("~^([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-7,/*]+|(-|/|Sun|Mon|Tue|Wed|Thu|Fri|Sat)+)\\s+([^#]*)\\s*(#.*)?$~i",$file[$i],$job)) {
                
$jobNumber = count($jobs);
                
$jobs[$jobNumber] = $job;
                if (
$jobs[$jobNumber][PC_DOW][0]!='*' AND !is_numeric($jobs[$jobNumber][PC_DOW])) {
                    
$jobs[$jobNumber][PC_DOW] = str_replace(
                        Array(
"Sun","Mon","Tue","Wed","Thu","Fri","Sat"),
                        Array(
0,1,2,3,4,5,6),
                        
$jobs[$jobNumber][PC_DOW]);
                }
                
$jobs[$jobNumber][PC_CMD] = trim($job[PC_CMD]);
                
$jobs[$jobNumber][PC_COMMENT] = trim(substr($job[PC_COMMENT],1));
                
$jobs[$jobNumber][PC_CRONLINE] = $file[$i];
            }
            
$jobfile = getJobFileName($jobs[$jobNumber][PC_CMD]);
            
            
$jobs[$jobNumber]["lastActual"] = getLastActualRunTime($jobs[$jobNumber][PC_CMD]);
            
$jobs[$jobNumber]["lastScheduled"] = getLastScheduledRunTime($jobs[$jobNumber]);
        }
    }
    
    
multisort($jobs, "lastScheduled");
    
    if (
$debug) var_dump($jobs);
    return 
$jobs;
}

if (
$debug) echo "<pre>";

$jobs = parseCronFile($cronTab);
$jobsRun = 0;
for (
$i=0;$i<count($jobs);$i++) {
    if (
$maxJobs==0 || $jobsRun<$maxJobs) {
        if (
runJob($jobs[$i])) {
            
$jobsRun++;
        }
    }
}
if (
$debug) echo "</pre>";
?>
Perdón el tamaño del mismo, pero no tengo otra manera de publicarlo.
Agradezco tu opinión acerca de esto y cómo lo usarías.

Sigue...