Cronjob via PHP

  • Themenstarter Themenstarter ByeBye 242513
  • Beginndatum Beginndatum
B

ByeBye 242513

Moin Leute,

ich habe ein Hostingpaket mit 3 Cronjobs, was mir momentan zu wenig ist.
Nun bin ich gerade am überlegen wie ich mehr Cronjobs simulieren kann ohne fremde Hilfe (wie z. B. http://www.cronjob.de).

Da kam mir folgende Idee:
Ich lass eine PHP-Datei alle 5 Minuten aufrufen mit Hilfe eines Cronjobs:
Code:
lynx -dump http://www.domain.de/cronjob.php >/dev/null 2>&1

In dieser werden mittels file_get_contents Seitenaufrufe Simuliert, wenn gewisse Variablen zutreffen:
PHP:
<?php
  if($var_domain01 == 15) { file_get_contents("http://www.domain01.de/cron123.php"); }
  if($var_domain02 == 23) { file_get_contents("http://www.domain02.de/cron123.php"); }
  if($var_domain03 == 35) { file_get_contents("http://www.domain03.de/cron123.php"); }
  ...
?>

Meine Frage ist nun:
Hat diese Methode irgendwelche Nachteile, zum Beispiel wenn zuviele Aufrufe gleichzeitig passieren (50 Seiten und mehr) oder kennt jemand sogar eine bessere Methode?
 
Zuletzt bearbeitet von einem Moderator:
Frag doch einfach mal bei Deinem Hosting-Provider nach was zusätzliche Cronjobs kosten.

Solange es keine 100 sind, sind wir bei unseren Kunden sehr großzügig und bieten die mehr Cronjobs z.T. auch kostenlos an.
 
Da sieht man mal wieder wie wichtig die Wahl eines guten Hosters ist.

:-)

Aber gemäß Deinem Beispiel sollte es auch funktionieren, nur wenn es zuviele sind kann es zum Timeout kommen!
 
Du könntest die Jobs in einer MySQL-Datenbank steuern. Dazu könntest du eine Spalte erzeugen, in der die genaue Zeit drin steht und eine, in der der Job definiert wird. Eine zusätzliche Spalte für Flags wäre auch gut, dann kannst du definieren, ob in der Job-Spalte eine Datei referenziert wird oder obs Script-Code ist. Natürlich brauchst du dann noch eine ID. So könnte das SQL-Create aussehen:

SQL:
CREATE TABLE crons (
id int not null auto_increment,
flags int,
job text,
exectime char[10],
PRIMARY KEY(id)
);

Und hier ein Denkanstoß fürs PHP-Script, was als Cronjob angelegt wird und die Jobs aus deiner Tabelle ausließt und anstößt:

PHP:
define('JOB_TYPE_SCRIPT', 1);
define('JOB_TYPE_FILE', 2);

function exec_cronjob($job)
{
  error_log("Executing cronjob with id " .$job['id']. "...");

  $script = '';
  if($job['flags'] & 2)
  {
    $script = file($job['job']);
    $script = implode('\n', $script);
  }
  else
  {
    $script = $job['job'];
  }
  $script = escapeshellcmd($script);

  exec($script, $results, $return_code);
  if($return_code != 0)
  {
    error_log("Could not execute job " . $job['id']. " : " . implode('\n', $results));
  }
  else
  {
    error_log("Successfully executed job " . $job['id']);
  }

  return $return_code;
}

mysql_connect('localhost', 'user', 'passwd') or die(mysql_error());
mysql_select_db('cronjob_db') or die(mysql_error());

$_query = "SELECT * FROM cronjobs";
$_result = mysql_query($_query) or die(mysql_error());
while(($job = mysql_fetch_assoc($_result)) != 0)
{
  if(job['exectime'] == strftime("H:M", time())
  {
    exec_cronjob($job);
  }
}
mysql_free_result($_result);

Das ist natürlich völligst ungetestet und kann enorm verbessert werden. Nur als Denkanstoß.
 
WOW! Das sieht sehr gut aus!

Nun noch eine kleine Frage zu "exec". Wenn ich einen Crontab mit Hilfe von exec eintrage, läuft dieser dauerhaft im Hintergrund (soweit ich es richtig verstanden habe). Muss ich dieses dann mit einem speziellen Befehl beenden, wenn ich das will?
 
Zuletzt bearbeitet von einem Moderator:
exec läuft nicht im Hintergrund. exec startet eine Kind-Shell und führt dort den angegebenen Befehl aus. Aus exec kommt man erst dann zurück, wenn der Kind-Prozess fertig ist (oder max_execution_time erreicht wird).

Wenn du den Prozess in den Hintergrund legen willst, brauchst du passthru und musst den Befehl in den Hintergrund legen:

PHP:
passthru('/usr/bin/php /pfad/zu/script.php &'); // Hier evtl noch Ausgabe pipen

Aber das steht auch in den Kommentaren zu exec.
 
Zurück