Hallo, ich habe hier ein seltsames verhalten. In einem Plugin habe ich einen Cronjob registriert. Dieser ruft eine Methode in der Bootstrap auf. Darin wiederum wird eine Methode einer ausgelagerten Klasse aufgerufen. Soweit funktioniert alles prächtig und wie es sein soll. Seit gestern, habe ich das Problem, dass nach jedem Aufruf des Cronjobs der Server voll ausgelastet ist. Ein top auf der Konsole verrät mir, dass der Apache2 einen CPU load von bis zu 105 verursacht. Das ganze liegt irgendwie an der Methode in der ausgelagerten Klasse. wenn ich diese mit einem die(); anstatt einem return; abschließe, läuft die gesamte logik sauber durch und verursacht auch keinen übermäßigen server load. Hat jemand einen Tipp oder eine Idee woran das liegen kann? vielen Dank, H.
ok, ich hab das jetzt mal weiter getestet. es liegt nicht an der ausgelagerten Klasse. Ich habe jetzt mal aus der Methode, die über den Cronjob aufgerufen wird, alles raus genommen. public function onRun(Shopware\_Components\_Cron\_CronJob $job) { return true; //die(); }
den Cronjob habe ich wie folgt registriert: $cron = $this-\>createEvent( 'Shopware\_CronJob\_MyPlugin', 'onRun' ); $this-\>subscribeEvent($cron); $this-\>subscribeCron("MyPlugin","MyPlugin",300,true);
sobald ich jetzt http://local.shopware.de/backend/cron aufrufe, ist der Server voll ausgelastet und nur ein Neustart des Apache hilft. Was mache ich falsch, bzw. was ist seit gestern passiert? Das ganze lief ja bis gestern ganz normal.
ok, ich habe vielleicht den Fehler gefunden. Ich habe im Nachhinein den Intervall im Backend auf 0 gestellt. Ich vermute, dass der Cronjob nun nicht beendet werden kann. Wie genau funktioniert der Aufruf der Cronjobs? in /engine/Library/Enlight/Components/Cron/Manager.php gibt es folgende Methode protected function endJob(Enlight\_Components\_Cron\_Job $job) { $now = new Zend\_Date(); $now = $now-\>getTimestamp(); $interval = $job-\>getInterval(); $next = $job-\>getNext()-\>getTimestamp(); do { $next += $interval; } while ($now \>= $next); $job-\>setNext($next); $job-\>setEnd($now); $this-\>adapter-\>updateJob($job); }
Wenn ich das richtig verstehe, läuft in meinem Fall die do-while Schleife unendlich, da $next bei $interval = 0 immer gleich aber <= $now bleibt. Die Möglichkeit, den Intervall auf 0 stellen zu können ist dürfte es dann doch eigentlich gar nicht geben oder?
Hallo, ich habe mich auch dumm und dämlich gesucht und durch zufall gemerkt, dass der cronjob beim Intervall 0 nicht beendet wird und sogar auf “inaktiv” gestellt wird. @ Shopware Team: endweder ist das ein Fehler bei euch im System (ich meine dass es bei 3.X nicht so war) oder ihr solltet eine Info dazu schreiben, dass 0 ein Sonderfall ist! Laut dem Ticket 4268 ignoriert ihr dieses Verhalten einfach.