Das blockiert mir dann meine Console für 5 Minuten ich erhalte diese Ausgabe:
[OK] Consuming messages from transports "failed, async, low_priority".
// The worker will automatically exit once it has exceeded 512M of memory, been running for 300s or received a stop
// signal via the messenger:stop-workers command.
// Quit the worker with CONTROL-C.
Scheduled task runner stopped due to time limit of 300s reached
Welchen Teil habe ich hier übersehen? Wo stelle ich ein wann der Job ausgeführt werden soll?
Du hast anscheinend den Unterschied zwischen Befehl und Cronjob verstanden. Ein Befehl wird in der CLI ausgeführt. Ein Cronjob ist ein Programm, dass nach zeitlichen Mustern Befehle ausführt.
Falls du einen eigenen Server hast, kannst du bspw. per crontab -e die Cronjobs für deinen Benutzer öffnen. Solche Rechte hast du bei Managed Servern in der Regel aber nicht, daher gibt es Anleitungen, wie schon hier im Forum verlinkt.
Das --time-limit ist dafür da, dass der Befehl nicht unendlich läuft und nach x Sekunden beendet wird. Je nachdem in welchem Minutentakt der Cronjob den Befehl aufruft, desto niedriger/höher musst du --time-limit setzen. Achte aber darauf, dass --time-limit den Befehl nicht abbricht, sondern ein „Beende die Ausführung am nächstmöglichen Zeitpunkt“ sendet. Daher würde es bei --time-limit=60 und Cronjob jede Minute zu Überschneidungen kommen, was deinen RAM des Servers komplett aufbrauchen kann. Um das zu verhindern gibt es weitere Programme, siehe FAQ.
Habe das wie in der eingangs erwähnten Bash am Laufen.
Nur getrennt in 2 Files:
messenger_consume.sh
und
scheduled_task_run.sh
Die werden dann per Cron alle 5 min. aufgerufen.
Die Aufrufe sollten sich halt zeitlich nicht überschneiden.
Denke die Lösung ist besser als über PHP public. Denn die kann theoretisch ohne extra Schutz jeder von außen aufrufen. Die Bash Scripte kannst du außerhab der Web root ablegen.
OK, wenn man keine andere Wahl hat, dann muss das wohl so.
Gibt sicher ein paar Schutzmechanismen wie z.B. IP Check des Aufrufs oder htaccess, etc.
Auf einen reinen Namen, der nicht bekannt ist, würde ich mich nicht verlassen.
Nur falls das auch andere lesen, hat man die Möglichkeit über Bash oder direktem CLI call, dann besser immer den Weg wählen als die PHP Lösung.
Mir scheint, dass du nicht wirklich verstehst wie das ganze Funktioniert.
Mit dem Interval * * * * * gibst du an, wie häufig der Cronjob ausgeführt werden soll. So jede Minute. Mit --time-limit=55 gibst du an, dass der Befehl 55 Sekunden lang laufen soll.
Somit ergibt sich, dass der Befehl mindestens 55 von 60 Sekunden (90% der Zeit) lang laufen würde.
Was du da als Idee hattest, macht überhaupt kein Sinn.
Falls 90% der Zeit nicht ausreichen, dann benötigst du einen zweiten Worker/Cronjob. Dafür sind dann Cronjobs aber nicht mehr sehr gut geeignet. Das kannst du dann aber alles in der Entwickler Dokumentation nachlesen.
Wenn der Cronjob einen Fehler wirft, was durchaus passieren kann, dann läuft er ggf. für 5 Stunden überhaupt nicht mehr, bis er erneut aufgerufen wird.
Und bisher hat das langsame Volllaufen der Queue über Wochen noch keine kritischen Fehler verursacht. Im schlimmsten Fall würden ein paar Stunden ein paar Sachen nicht updaten.
Ich beobachte weiter, kann ich immer noch auf eine Stunde umbauen.