» PHPCron - Cronjobs ohne Crontab

Alternative zu MySQLDumper und phpMyAdminNeuen Thread eröffnenNeue Antwort erstellenFatal/Parse Error abfangen und z.B. per E-Mail erhalten
AutorNachricht
Administrator 

Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 52423
Wohnort: Lohmar


Meine eBay-Auktionen:
12.02.2015, 09:18
zitieren

Es hat eine ganze Weile gedauert bis ich die Race Conditions in den Griff bekommen habe. Aber schlussendlich hat es dann doch geklappt. Bitte beachtet, dass ich diesen Code nur auf Linux getestet habe. In Windows kann es zu Problemen kommen, da die max_execution_time dort vom sleep beeinflusst wird. D.h. es kann gut sein, dass das Script unerwartet stoppt. Feedback ist dazu erwünscht.

Das Script ruft sich selbst alle 15 Sekunden auf. D.h. 4x pro Minute. Selbst wenn 3 davon abbrechen, kann der letzte alle anderen wiederherstellen. Das Script bricht also erst zusammen, wenn der Server knapp über eine Minute nicht erreichbar ist.

15 Sekunden ist entsprechend der kleinstmögliche Intervall. Wer eine sekündliche Ausführung wünscht muss das dann innerhalb vom Cronjob selbst lösen.

Hier nun das Script:
<?php
// (c) 2015 http://Gutt.IT/
/* PHPCron V1.1 */
define('WEBMASTER_EMAIL', 'john.doe@example.org');
function isSecure() {
return ((isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443) ? 's' : '';
}
function _get($var, $else=null, $force=false) {
if (!$force) {
return isset($_GET[$var]) ? $_GET[$var] : $else;
}
else {
$force = array_flip($force);
return isset($_GET[$var]) && isset($force[$_GET[$var]]) ? $_GET[$var] : $else;
}
}
function display_tracking_image() {
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// image data
$im = imagecreate(1, 1);
$blk = imagecolorallocate($im, 0, 0, 0);
imagecolortransparent($im, $blk);
// image output
header("Content-type: image/gif");
imagegif($im);
// free memory
imagedestroy($im);
}
function cron_request($sec) {
$sec = intval($sec);
$cron_filename = 'cache/' . $sec . '_crnsec_lock';
if (file_exists($cron_filename) || !mkdir($cron_filename)) {
return;
}
// add one minute if necessary
$date = new DateTime();
$cron_date = new DateTime();
$cron_date->setTime($cron_date->format('H'), $cron_date->format('i'), $sec);
$diff = $date->diff($cron_date);
if ($diff->invert && $diff->s > 0) {
$cron_date->setTime($cron_date->format('H'), $cron_date->format('i') + 1, $sec);
}
$diff = $date->diff($cron_date);
// we use sleep() as time_sleep_until() starts one second to early (https://bugs.php.net/bug.php?id=69044)
sleep($diff->s);
// str > regex
$request_uri = $_SERVER['REQUEST_URI'];
if (strpos($request_uri, 'cron_second=') === false) {
$request_uri .= (strpos($request_uri, '?') === false ? '?' : '&') . 'cron_second=' . $sec;
}
else {
$request_uri = str_replace(array('&cron_second=', '?cron_second='), 'cron_second=', $request_uri);
$request_uri = str_replace(array('cron_second=0', 'cron_second=15', 'cron_second=30', 'cron_second=45'), '', $request_uri);
$request_uri .= (strpos($request_uri, '?') === false ? '?' : '&') . 'cron_second=' . $sec;
}
// note: filter_input returns the unchanged SERVER var (http://php.net/manual/de/function.filter-input.php#99124)
// note: filter_var is unsecure (http://www.d-mueller.de/blog/why-url-validation-with-filter_var-might-not-be-a-good-idea/)
$url = 'http' . isSecure() . '://' . filter_input(INPUT_SERVER, 'HTTP_HOST', FILTER_SANITIZE_URL) . htmlspecialchars($request_uri, ENT_QUOTES, 'UTF-8');
$context = stream_context_create(array(
'http' => array(
'timeout' => 1.0
)
));
// note: return "failed to open stream: HTTP request failed!" because timeout < time_sleep_until
if ($fp = @fopen($url, 'r', false, $context)) {
fclose($fp);
}
rmdir($cron_filename);
}
function mycron($title) {
mail(WEBMASTER_EMAIL, "this cron runs $title " . date('c'), htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES, 'UTF-8'));
}
if (!ini_get('allow_url_fopen')) {
mail(WEBMASTER_EMAIL, 'allow_url_fopen', 'fopen not possible on this host!');
exit;
}
if (!file_exists('cache/')) {
if (!mkdir('cache')) {
mail(WEBMASTER_EMAIL, 'cache', 'cache folder does not exist and it was not possible to create it!');
}
exit;
}
$allowed_crons = array(0, 15, 30, 45);
$cron_second = intval(_get('cron_second', 0, $allowed_crons));
$cron_filename = 'cache/' . $cron_second . '_crnsec_lock';
if (isset($_GET['cron_second'])) {
if ($cron_second === 0 && !(date('i') % 15)) {
mycron('every 15 minutes');
}
if ($cron_second === 0 && !(date('i') % 60)) {
mycron('every hour');
}
}
// cron monitoring
foreach ($allowed_crons as $cron_second) {
$cron_filename = 'cache/' . $cron_second . '_crnsec_lock';
// start missing cron requests
if (!file_exists($cron_filename)) {
cron_request($cron_second);
}
// restart interrupted cron requests
else if (filemtime($cron_filename) + 90 < time()) {
rmdir($cron_filename);
cron_request($cron_second);
}
}
if (!headers_sent()) {
display_tracking_image();
}
?>

Den eigenen Cron platziert man da wo "mycron()" ausgeführt wird. Zwei Beispiele um den Cronjob jede Stunde bzw. alle 15 Minuten zu starten sind enthalten. Denkt aber dran, dass sich das Script egal was man einstellt weiterhin alle 15 Sekunden aufruft. In Euren http-Logs wird der Zugriff entsprechend häufig vorkommen (4x pro Minute = 5.760 Requests pro Tag).

Nachteile gegenüber dem klassischen Crontab:
  • das Script muss manuell gestartet werden (außer man bindet es irgendwo ein)
  • es werden in der Regel mehr http Requests auf dem Server verursacht als Cronjobs notwendig sind
Es ist übrigens auch möglich das Script als verstecktes Bild zu starten:
<img src="cronjob.php" width="1" height="1" alt="" />


 PHPCron startet zuverlässig alle 15 Sekunden

2015-02-12 10_22_54-Papierkorb - gutt.it - Mozilla Thunderbird.png
2015-02-12 10_22_54-Papierkorb - gutt.it - Mozilla Thunderbird.png - [Bild vergrößern]


pn email
Gast 
12.02.2015, 09:18
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "PHPCron - Cronjobs ohne Crontab" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Risikolebensversicherung auch ohne Risiko? (ohne Umsatz-/Gewinn-/überschussanteile)
Hi, ich wollte eine Risikolebensversicherung abschließen und habe dabei festgestellt, dass man hier überhaupt keine Preise vergleichen kann, weil jeder Versicherer einen anderen Prozentsatz an "Gewinn-Beteiligung" annimmt, mit der er den...
von mgutt
16
705
02.12.2014, 23:52
Rallyeman
FrontStoßstange Gesucht aus GFK mit Papiere zum Eintragen ohne risse und ohne PLatzer
FrontStoßstange Gesucht aus GFK mit Papiere zum Eintragen ohne risse und ohne PLatzer ;) PM me please........ danke FÜRN HONDA CIVIC COUPE EJ6...
von honda0093
1
204
05.06.2017, 18:50
*micha*
PS3: Dualshock ohne USB? HD ohne HDMI? Ego-Shooter ab 16?
hi,ich wollte mal fragen ob die dualshok kontroller eigentlich kabellos sind oder ob ich ein usb gabel brauche ???? Meine 2 frage wär ob ich um in hd zu spielen ein hdmi kabel benötige oder nicht??? 3tens welchen ego-shooter ab 16 findet ihr am besten...
von BLACK_VORTEX
2
421
30.03.2010, 13:38
BLACK_VORTEX
Toyota ohne Schlüssel und ohne Alufelgen
https://www.youtube.com/watch?v=r3w3w_rGTBw...
von mgutt
1
449
20.08.2014, 14:29
sanders
Fahren ohne TÜV, Ohne Zulassung, Mit Versicherung
Moin Leute, ich habe da mal eine Frage, die mir das Internet irgendwie nicht ganz beantworten kann... Es ist ja seit dem 01.04.2015 nicht mehr möglich ein Kurzzeitkennzeichen für nen Fahrzeug ohne TÜV zu bekommen... So, wenn ich jetzt nen Fahrzeug hier...
von NoBody89
2
996
15.08.2016, 15:16
NoBody89
Suche Tacho EH6 ohne Airbag ohne ABS
Hallo Zusammen, hat von Euch zufällig noch jemand einen Tacho in der Schublade liegen ? :P...
von Vti_82
2
424
24.03.2012, 20:19
Vti_82
"Momo" Lenkrad ohne Type und ohne KBA Nummer
Hallo. Ich habe mir übers internet ein "Momo" Millenium Evo Lenkrad gekauft (gebraucht) Heute kam es bei mir an und beim reinigen fiel mir auf das auf der Rückseite des Lenkrades keine Type und keine KBA Nummer eingestanzt ist. Papiere waren...
von Bughitaa
2
1.004
06.01.2015, 11:17
Bughitaa
Klr für ed9 bj 89 ohne KAT !!!!!
Hab endlich wieder nen honda gefunden jedoch ohne kat !!! gibt es für den auch nen klr oder ein umrüstsatz ???der kostet ja 400 im jahr das is viel holz !!! wenn ja wo kann ich es kaufen (links) und was kostet es...
von gaku320i
8
699
17.12.2006, 17:56
gaku320i
Ohne Kat!!
Hallo Leute! Fährt einer von euch mit seinem 2.2 ohne Kat? Will mir nehmlich eine DC Atrappe drunter bauen! Läuft er danach schlechter oder regelt das Steuergerät dies wieder? mfg littel...
von littel V
17
2.100
14.01.2008, 22:53
littel V
MSD für ED9 ohne Kat
Hallo Leute, suche für meinen CRX einen MSD ohne Kat (Also etwaslänger) Habe den 7100 456 - 131 PS. Wo finde ich den.... edit: also das zwischenstück ab Krümmer bis...
von Avadis
7
239
30.01.2012, 16:48
_-_CRX46_-_
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |