Aufruf von Foren-Funktionen per Cronjob

 
ramstein
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Aachen
Beiträge: 409
Dabei seit: 05 / 2005
Betreff:

Aufruf von Foren-Funktionen per Cronjob

 · 
Gepostet: 14.07.2019 - 14:26 Uhr  ·  #1
Hi,

leider ist es seit CF4 nicht mehr möglich per Cronjob einzelne Forenfunktionen aufzurufen. Anwendungsfall für mich wäre z.B. ein Automatismus den ein Plugin bereitstellt, der nicht durchs Web gesteuert ausgeführt werden soll sondern über die Konsole (z.B. /usr/bin/php cron.php). In CF3 war das noch mit der Konstante CONSOLE möglich. Die gibts jetzt aber nicht mehr - oder übersehe ich etwas?

Zwirni (im Namen von ramstein)
cback
Admin
Avatar
Geschlecht:
Herkunft: Saarland
Alter: 37
Homepage: cback.net
Beiträge: 17610
Dabei seit: 12 / 2003
Betreff:

Re: Aufruf von Foren-Funktionen per Cronjob

 · 
Gepostet: 15.07.2019 - 12:56 Uhr  ·  #2
Hallo Zwirni!

Also grundlegend kann ich sagen, dass es weder im CF3 noch im CF4 irgendwelche Maßnahmen gibt oder gab, um Cronscripte entweder zu fördern oder gar zu verhindern. :)

Entspechend gehe ich davon aus, dass die Konstante "CONSOLE" die Du ansprichst damals von Deiner PHP Umgebung kam, denn im CBACK Forum gab es die von meiner Seite aus nie.


Es sollte also auch mit dem CF4 nach wie vor kein Problem sein, Cronjobs laufen lassen bzw. Cronscripte anzuwenden.


Ich habe aber vielleicht zwei Hinweise für Dich wo der Fehler u.U. entstehen könnte, vielleicht hilft Dir das bei der Problemsuche:

- das CF4 stellt höhere Anforderungen an die Serverungebung als das CF3. Entsprechend ist das CF4 z.B. nicht mehr auf PHP Versionen älter als 5.6 lauffähig. Wenn Du einen Cronjob von der Konsole aus zündest wird allerdings meist die PHP Version des Betriebssystems genommen und je nach Serverkonfiguration kann es z.B. gerade bei LTS Betriebssystemen sein, dass die Betriebssystem PHP Version mitunter noch älter ist als die z.B. per CGI Modul auf dem Webspace genutzte. In diesem Fall könnte das CF4 sich nicht ausführen, weil es mindestens 5.6 dafür braucht und Dein Script schlägt sozusagen gegen die Wand.

- eine andere Idee wäre, dass Du vielleicht das Plugin, welches sich per Cron ausführen soll, irgendwo hingehängt hast, wo man als Gast nicht ran kann. Da der Cronjob keinen Login ausführt müsstest Du mal nachsehen, ob Du die Jobdatei ggf. manuell ausführen kannst, wenn Du nicht eingeloggt bist oder ob Du die Position einfach verschiebst.


Ein eventueller Workaround wäre ein einfaches zusätzliches PHP Script, welches per curl einfach regulär Dein Forum bzw. ein Script darin aufruft (gesichert z.B. mit einem zusätzlichen Token o.ä.) und es damit einfach anstößt und es sozusagen so ansurft, wie ein User das Forum ansurfen würde. Du kannst für sowas ja auch ggf. eine eigene Datei anlegen oder die Funktion über den globalen Hook der xt.php anstoßen über den Parameter ?app=...

Viele Grüße,
Chris
ramstein
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Aachen
Beiträge: 409
Dabei seit: 05 / 2005
Betreff:

Re: Aufruf von Foren-Funktionen per Cronjob

 · 
Gepostet: 15.07.2019 - 21:20 Uhr  ·  #3
Ich würde das ja gerne über die xt.php lösen, aber es kommt beim Aufruf per Konsole eine Fehlermeldung.

Hab dir mal ein Beispiel zusammengepackt im Anhang. Installiere das mal bei dir. Wenn Du es per HTTP aufrufst mit "/xt.php?app=crontest" kommt korrekt ein "Hallo Welt". Wenn du es an der Konsole aber mit

Code
php xt.php app=crontest


aufrufst kommt:

Code
<!doctype html><html lang="en" dir="ltr"><head><meta charset="utf-8" /><meta name="application-name" content="CF4" /><meta name="author" content="Christian Knerr" /><meta name="generator" content="CBACK Forum" /><meta name="robots" content="noindex,nofollow" /><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
<style>body { margin: 0; padding: 0; color: #000000; background: #dcdcdc; font: 16px Tahoma, Arial, Verdana, sans-serif; font-weight: 200; width:100%; height:100%; }
@keyframes errflasher { from { background: #b50000; } to { background: #3c0000; } }
@-webkit-keyframes errflasher { from { background: #b50000; } to { background: #3c0000; } }
.red { display: block; height: 10px; background: #b50000; animation: errflasher 1.5s ease-out infinite alternate; -webkit-animation: errflasher 1.5s ease-out infinite alternate; margin: 0; }
.err_head { display: block; padding: 10px; text-align: center; font-weight: 400; font-size: 1.1em; color: #cbcbcb; background: #000000; letter-spacing: 1px; } strong { font-weight: 600; }
.err_footer { text-align:center; position: absolute; bottom: 0; width: 100%; font-size: 0.8em; border-top: 1px #868686 solid; margin: 0; padding: 0; background: #bababa; }
.err_footer>p { display: block; padding: 6px; margin: 0; }
.err_content, #debug_wrap { display: block; padding: 30px; }
.err_content { margin-top: 10px; }
.debug_code { font-family: Monaco, "Courier New", Courier, monospace; display: block; border: 1px #c0c0c0 solid; box-shadow: 0 0 1px rgba(0,0,0,0.2); color: #227c00; padding: 10px; font-size: 0.8em; }
.dbg_small { width: 800px; }
</style><title>CBACK&reg; Forum &middot; Error Message</title></head><body><div class="red">&nbsp;</div><div class="err_head"><strong>Critical Error</strong> &middot; Code 256</div><div class="red">&nbsp;</div><div class="err_content"><strong>Sorry, the CF4 Core ran into a critical error while trying to handle your request.</strong><br />The following message was received from the system before the script was stopped:<br /><br /><div class="debug_code dbg_small">Ungültige IP Adresse</div></div><div id="debug_wrap"><strong>Debugger Output</strong><br />The debug mode is currently turned <i>on</i>, so you get some additional information in the box below.<br />It is highly recommended to <strong>turn off</strong> the debug mode on a productive site to hide this box!<br /><br /><div class="debug_code dbg_small">157<br />/var/www/clients/client1/web97/web/classes/core/User.class.php</div></div><div class="err_footer"><p>Powered by <strong>CBACK Forum</strong> - &copy; 1999-2019 <a href="http://cback.net" target="_blank">CBACK&reg; Software</a></p></div></body></html>


Dabei spielt es keine Rolle welche PHP-Version genutzt wird. Auch nicht ob mit oder ohne aktiviertem Debug vom Forum. Der Grund ist die Prüfung, ob die zugreifende IP eine gültige IP-Adresse ist. Wenn ich aber von der Konsole aus aufrufe gibt es gar keine IP in "REMOTE_ADDR".

Ich vermute aus dem Grund hatte ich bei unserem CF3 damals diese CONSOLE-Konstante eingebaut .. ist aber schon ewig her. Jetzt wäre für mich interessant zu wissen wie das mit CF4 geht :)
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.
cback
Admin
Avatar
Geschlecht:
Herkunft: Saarland
Alter: 37
Homepage: cback.net
Beiträge: 17610
Dabei seit: 12 / 2003
Betreff:

Re: Aufruf von Foren-Funktionen per Cronjob

 · 
Gepostet: 15.07.2019 - 21:30 Uhr  ·  #4
Huhu,

danke Dir für die Info!

Du hast auch tatsächlich genau gefunden wo der Schuh drückt, da macht das CF4 in der Tat Dicht, weil es keine Sessions ohne IP Adresse zulässt und sicherstellt, dass eine gültige IPv4 oder IPv6 Adresse vorliegt. Hat auch teilweise mit Spamschutz oder Angriffen auf Serverebene zu tun. Allerdings war diese Prüfung im CF3 auch schon vorhanden, also das hätte ggf. immer schon anschlagen müssen. Ansonste überrascht mich das, ich hätte fast gewettet das Cronscript sendet dort auch localhost oder 127.0.0.1 mit.


So wirkliche Optionen auf Boardebene hast Du da zumindest grundlegend nicht und ich würde auch nicht empfehlen diese Prüfroutine auszuhebeln weil es ja schon zusätzlich der Forensicherheit dient. Vermutlich hattest Du damals beim CF3 einfach diese Prüfstelle in der Userklasse dann ausgehebelt oder? Dann kämst Du natürlich durch das stimmt.


Als mögliche Alternativlösung würden mir jetzt spontan nur folgende Dinge einfallen:

- entweder Du machst Dir wirklich ein blankes PHP Script nur für den Cronjob, welcher die URL die Du manuell aufrufen wolltest einfach per curl ansteuert (eine Cookie File wie bei der verlinkten Anleitung brauchst Du dafür übrigens nicht, bei Gästen ist das eh egal), dann sollte das Board zumindest eine ::1 oder 127.0.0.1 zu sehen kriegen und es müsste damit dann eigentlich funktionieren. Ich hab einen Kunden, da werden per Cronjob die brisantesten Themen von einer API / Schnittstelle des Forums als XML abgerufen, da ist das Script ein einfaches curl und das funktioniert. Müsste also ohne Umbauten am Forum zu einer Lösung führen, vor allem, wenn Du nur eine Handlung im Board "anstupsen" möchtest.

- die andere Idee wäre, dass Du Dir nur für Crons ein eigenes zusätzliches PHP Script machst, welches im Grunde den Startup der init.php ohne die User / Session Klasse macht, also sozusagen fast nur auf die DB verbindet und sozusagen halbwegs extern agiert. Allerdings finde ich das eher eine schlechte Lösung, weil Du dann viel Code selber schreiben musst, weil Du im Grunde nie das ganze CF4 Core hochgestartet kriegst.


Eventuell gibt es auch eine Möglichkeit bei Crons über Konsole ein IP Flag zu setzen, vielleicht ne Servervariable damit vorbelegen, aber da muss ich jetzt auf Serverebene ein bisschen passen, das ist ja vermutlich auch bei jeder Distribution ein bisschen anders.

Ich persönlich würde vermutlich über die curl Lösung gehen.

LG,
Chris
ramstein
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Aachen
Beiträge: 409
Dabei seit: 05 / 2005
Betreff:

Re: Aufruf von Foren-Funktionen per Cronjob

 · 
Gepostet: 15.07.2019 - 21:34 Uhr  ·  #5
Den Aufruf kannst Du per
https://php.net/php_sapi_name
unterscheiden. Das wird von PHP erzeugt und ist meines Wissens nicht Systemabhängig.

Meine aktuelle Alternative per HTTP hab ich ja schon, also keine Sorge. Ich wünsche mir nur etwas weniger Apache-Last wg. solchem Kram ;)
cback
Admin
Avatar
Geschlecht:
Herkunft: Saarland
Alter: 37
Homepage: cback.net
Beiträge: 17610
Dabei seit: 12 / 2003
Betreff:

Re: Aufruf von Foren-Funktionen per Cronjob

 · 
Gepostet: 15.07.2019 - 21:37 Uhr  ·  #6
Joah mit IP wird ja auch ziemlich viel identifiziert, zumindest wenn eine Session zustande kommt, da ist Leerstring auch nicht immer so super. :)

Denke also gemessen daran ist die http Lösung dann doch die bessere. Denke mal wenn Du den Cron nicht all zu oft zünden musst sollte das passen. :) Die drumrum-Resourcen werden ja zumindest dann beim Aufruf nicht mit angefragt.

LG,
Chris
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.