2012-07-06 10 views
17

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

+0

Utwórz tabelę w bazie danych, aby przesłać dane, a następnie uruchom zadania crontab kiedykolwiek x, aby je odebrać? – BugFinder

+0

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

+0

To był punkt cronjob do uruchomienia zadania do przetworzenia, dostępu do bazy danych i aktualizacji go – BugFinder

Odpowiedz

1

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.

0

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.

4

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.