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($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>";
?>
Agradezco muchísimo la ayuda!!
Saludos