Foros del Web » Programando para Internet » PHP »

Pseudo-cron para WINDOWS server

Estas en el tema de Pseudo-cron para WINDOWS server en el foro de PHP en Foros del Web. Hola gente.. bueno no he podido solucionar mi problema con las tareas programadas en mi servidor ya que aparentemente no tienen, y me tengo que ...
  #1 (permalink)  
Antiguo 20/06/2007, 03:22
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Pseudo-cron para WINDOWS server

Hola gente.. bueno no he podido solucionar mi problema con las tareas programadas en mi servidor ya que aparentemente no tienen, y me tengo que basar de un Pseudo-cron. Lo que hace este script al llamarlo con un include es realizar tareas al igual que un cron común, salvo que este lo hace cada vez que se recarga el archivo que lo llama en el include. EJ: si en index.php incluímos el pseudo-cron.php realizará las tareas.

¿Alguien me puede explicar cómo realizar un llamado a un script de envio de mails, extraidos de una base de datos, y que vaya de 60 en 60 cada 1 hora?
Espero que alguien lo entienda y me pueda ayudar.

Así es como se configurarían las órdenes que este script ejecutaría:

Código HTML:
All job definitions are made in a text file on the server with a user-definable name (usually crontab.txt). Here is an example of a valid crontab file:

#comments start with '#'
#mi  h    d    m    dow      job                       comment
0    5    *    *    Sun      cronjobs/dump.inc.php     # make db dump every sunday at 5 am
40   5    2    *    *        cronjobs/sendlog.inc.php  # send last month's web server logs
*/15 8-19 *    *    Mon-Fri  cronjobs/refr_ext.inc.php # refresh external news sources
The last line will call cronjobs/refr_ext.inc.php every 15 minutes between 8am and 7pm on Monday to Friday.

Código PHP:
$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/";

$useLog true;

$sendLogToEmail "";

$maxJobs 1;

$debug false;

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($dateArr1"mday");
        } else {
            
$dateArr["minutes"] = 0;
            
$dateArr["seconds"] = 0;
            
$dateArr["hours"]++;
        }
    } elseif (
$unit=="minute") {
        if (
$dateArr["minutes"]==59) {
            
incDate($dateArr1"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 (
$debugvar_dump($jobs);
    return 
$jobs;
}

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

$jobs parseCronFile($cronTab);
$jobsRun 0;
for (
$i=0;$i<count($jobs);$i++) {
    if (
$maxJobs==|| $jobsRun<$maxJobs) {
        if (
runJob($jobs[$i])) {
            
$jobsRun++;
        }
    }
}
if (
$debug) echo "</pre>";
?> 
Agradezco muchísimo la ayuda!!
Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:43.