Chcę, aby dane wysłane przez moich klientów (przez pocztę) zostały umieszczone w kolejce, a skrypt php na moim serwerze najpierw sprawdza, czy kolejka jest pusta. Jeśli kolejka nie jest pusta, skrypt przetwarza wszystkie dane w kolejce jeden po drugim. Jak to zrobić?PHP Jak zaimplementować przetwarzanie kolejki w php
Odpowiedz
Spójrz na this.
Używa memcached do utrwalania.
Można użyć coś takiego Zero MQ
Zobacz Example by Rasmus Lerdorf.
Można również rozważyć użycie Gearman do dystrybucji obciążenia.
Oto kolejny świetny poradnik dla tego:
Innym rozwiązaniem jest użycie Gearman które wydają się być włączona do PHP (nie był to ostatni raz grałem z nim): http://php.net/manual/en/book.gearman.php
Problem z metodą cronjob polega na tym, że cronjob może być ustawiony co najwyżej na 1 minutę, więc w realizacji zadania występuje opóźnienie o 1 minutę, jeśli jest to dopuszczalne, to w porządku, w przeciwnym razie należy użyć kolejek ze skryptem odpytywania.
Ponieważ relacyjne bazy danych (Ex: MySQL) są tak elastyczne i dobrze zrozumiałe dla twórców stron internetowych, są używane w wielu typach kolejek zadań. Wiele aplikacji PHP używa tego rozwiązania jako rezerwowego, gdy buforowanie obiektów jest nieskonfigurowane. Jest to metoda ostateczna, ponieważ jest to bardzo kosztowny sposób na zaimplementowanie kolejki.
Jeśli musisz użyć MySQL jako swojej kolejki, jeden z inżynierów Percona napisał to blog entry o zarządzaniu potencjalnymi punktami bólu.
Jeśli chcesz najbardziej skalowalną implementację, zdecydowanie polecam ZeroMQ. Jednak nie jest to domyślne lub szczególnie popularne rozszerzenie PHP. Tak więc w przypadku projektu, w którym nie będziesz kontrolować stosu serwera WWW: użyj obiektów APC, Memcache lub Memcached, a następnie przejdź do tabeli pamięci podręcznej MySQL.
Jest to coś, co można łatwo zrobić z biblioteką enqueue. Po pierwsze, możesz wybierać spośród różnych transports, takich jak AMQP, STOMP, Redis, Amazon SQS, Filesystem i tak dalej.
Po drugie, jest to bardzo łatwe w użyciu. Zacznijmy od instalacji:
Musisz zainstalować bibliotekę enqueue/simple-client
i one of the transports. Zakładając, że wybierzesz system plików jeden, zainstaluj bibliotekę enqueue/fs
.Podsumowując:
composer require enqueue/simple-client enqueue/fs
Teraz zobaczmy, w jaki sposób można wysyłać wiadomości z Twojego skryptu postu:
<?php
// producer.php
use Enqueue\SimpleClient\SimpleClient;
include __DIR__.'/vendor/autoload.php';
$client = new SimpleClient('file://'); // the queue will store messages in tmp folder
$client->sendEvent('a_topic', 'aMessageData');
skrypt zużycie:
<?php
// consumer.php
use Enqueue\SimpleClient\SimpleClient;
use Enqueue\Psr\PsrProcessor;
use Enqueue\Psr\PsrMessage;
include __DIR__.'/vendor/autoload.php';
$client = new SimpleClient('file://');
$client->bind('a_topic', 'a_processor_name', function(PsrMessage $psrMessage) {
// processing logic here
return PsrProcessor::ACK;
});
// this call is optional but it worth to mention it.
// it configures a broker, for example it can create queues and excanges on RabbitMQ side.
$client->setupBroker();
$client->consume();
Uruchom jako wielu consumer.php
procesów jak ty za pomocą supervisord lub innych menedżerów procesów, na komputerze lokalnym można go uruchomić bez żadnych dodatkowych bibliotek ani pakietów.
To podstawowy przykład, a kolejka ma wiele innych przydatnych funkcji. Jeśli jesteś zainteresowany, sprawdź enqueue documentation na zewnątrz.
Utwórz tabelę w bazie danych, aby przesłać dane, a następnie uruchom zadania crontab kiedykolwiek x, aby je odebrać? – BugFinder
Tak. Podoba mi się to podejście. Ale po wstawieniu zadania do tabeli, jak mogę pobrać zadanie do wykonania i zaktualizować tabelę po zakończeniu zadania? – ASHUTOSH
To był punkt cronjob do uruchomienia zadania do przetworzenia, dostępu do bazy danych i aktualizacji go – BugFinder