2012-07-06 16 views
17

Desidero che i dati inviati dai miei clienti (tramite post) siano messi in coda e uno script php sul mio server controlli prima se la coda è vuota. Se la coda non è vuota, lo script deve elaborare tutti i dati nella coda uno per uno. Come faccio?PHP Come implementare l'elaborazione della coda in php

+0

Creare una tabella in un database per inviare dati e quindi eseguire x lavori di crontab x per raccoglierlo? – BugFinder

+0

Sì. Mi piace questo approccio. Ma dopo aver inserito l'attività nella tabella, come faccio a recuperare l'attività da fare e aggiornare la tabella quando l'attività è stata completata? – ASHUTOSH

+0

Questo era il punto del cronjob per eseguire un'attività da elaborare, accedere al db e aggiornarlo – BugFinder

risposta

3

Dai uno sguardo allo this.

Utilizza memcached per la persistenza.

1

Problema con l'approccio cronjob, cronjob potrebbe al massimo impostare un intervallo di 1 minuto, quindi c'è un ritardo di 1 minuto nell'esecuzione del lavoro, se questo è accettabile allora va bene altrimenti dovrebbero usare le code con lo script di polling.

0

Poiché i DB relazionali (Es: MySQL) sono così flessibili e ben compresi dagli sviluppatori Web, vengono utilizzati per molti tipi di code di lavoro. Molte applicazioni PHP utilizzano questa soluzione come fallback quando la cache degli oggetti non è configurata. È il metodo di ultima istanza perché è un modo molto costoso per implementare una coda.

Se è necessario utilizzare MySQL come coda, uno degli ingegneri Percona ha scritto questo blog entry sulla gestione dei potenziali punti critici.

Se si desidera l'implementazione più scalabile, consigliamo vivamente ZeroMQ. Tuttavia non è un'estensione PHP predefinita o particolarmente comune. Quindi per un progetto in cui non si controllerebbe lo stack del server Web: utilizzare oggetti APC, Memcache o Memcached e quindi eseguire il fallback su una tabella di cache MySQL.

4

Questo è qualcosa che si potrebbe facilmente fare con la libreria enqueue. Innanzitutto, è possibile scegliere tra una varietà di transports, ad esempio AMQP, STOMP, Redis, Amazon SQS, Filesystem e così via.

In secondo luogo, è semplicissimo da usare. Iniziamo dall'installazione:

È necessario installare la libreria enqueue/simple-client e one of the transports. Supponendo di aver scelto il filesystem, installa la libreria enqueue/fs.Per riassumere:

composer require enqueue/simple-client enqueue/fs 

Ora vediamo come è possibile inviare messaggi dal vostro script POST:

<?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'); 

Lo script di consumo:

<?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(); 

Esegui come molti consumer.php processi come voi utilizzando supervisord o altri process manager, sul computer locale è possibile eseguirlo senza librerie o pacchetti aggiuntivi.

Questo è un esempio di base e Enqueue ha un sacco di altre caratteristiche che potrebbero tornare utili. Se sei interessato, controlla lo enqueue documentation.

Problemi correlati