Ich mag die Empfehlung von Ramy Talal, einen Warteschlangenserver wie Gearman zu verwenden, aber ich glaube nicht, dass Gearman verzögerte Aufträge unterstützt - es wird im Gearman-Protokoll weder http://gearman.org/protocol/ erwähnt. Ich würde mit etwas wie Bohnenkohl gehen.
http://kr.github.io/beanstalkd/
Sie haben einen PHP-Prozess verantwortlich für die mit einer Verzögerung in einer Warteschlange einen Job setzen und einen zweiten PHP-Prozess aus der Warteschlange für das Konsumieren.
Eine nette Bibliothek Client für Bohnenstange ist Pheanstalk. https://github.com/pda/pheanstalk, die Sie über Composer installieren können.
einfaches Anwendungsbeispiel:
Produzent
$pheanstalk = new Pheanstalk('127.0.0.1');
$delay = 3; // delay in seconds
$pheanstalk
->useTube('choose_tube_name')
->put("job payload goes here\n",
PheanstalkInterface::DEFAULT_PRIORITY, // 1024 as standard
$delay,
PheanstalkInterface::DEFAULT_TTR // I think that after 60 seconds by default, if not deleted by consumer after reserving job, it is automatically released back onto the queue to be consumed by another consumer.
);
Consumer
while (1) {
$job = $pheanstalk
->watch('choose_tube_name')
->ignore('default')
->reserve();
echo $job->getData();
$pheanstalk->delete($job);
}
So im Wesentlichen, legt der Hersteller einen Job auf die choose_tube_name
Rohr/Warteschlange mit einer 3 Sekunden Verzögerung. Nach 3 Sekunden ist es bereit, von jedem Verbraucher konsumiert zu werden, der in der Warteschlange zuhört.
Der Verbraucher sitzt dort warten auf einen Job, wenn man ankommt, es reserviert es, dann echos die Ausgabe und löscht den Job und weil es in einer Weile Schleife ist, wird es warten, bis ein anderer Job kommt zu verarbeiten.
Um zu skalieren, können Sie mehrere Produzenten und mehrere Verbraucher haben. Eine Sache, an die Sie sich jedoch erinnern sollten, ist, dass Ihr Verbraucher im obigen Beispiel ein lang andauernder Prozess ist. Achten Sie also auf Speicherauslastung/-lecks und seien Sie vorsichtig bei der Freigabe von Objekten zwischen Jobs. z.B. Wenn Sie eine Klasse außerhalb der while-Schleife instanziieren und sie in der while-Schleife verwenden/ändern, werden die Eigenschaften in andere Jobs verschoben.
Warum verwenden Sie keinen Cronjob für jeden Timer? –
@Victor Radu Ich kenne Cron noch nicht. Diese Aufgabe kann mit Cron gelöst werden? – Log
Der 'cron' Service hilft hier nicht. Es wird verwendet, um Befehle auf dem System zu bestimmten Zeitpunkten (mit einer Auflösung von 1 Minute) auszuführen. – axiac