2012-07-06 48 views
17

Quiero que los datos enviados por mis clientes (por correo) sean colocados en una cola y un script php en mi servidor comprueba primero si la cola está vacía. Si la cola no está vacía, el script procesará todos los datos en la cola uno por uno. ¿Cómo hago esto?PHP ¿Cómo implemento el proceso de cola en php

+0

Crear una tabla en una base de datos para enviar datos, y luego ejecutar trabajos crontab ever x para recogerlo? – BugFinder

+0

Sí. Me gusta este enfoque. Pero después de insertar la tarea en la tabla, ¿cómo recupero la tarea y actualizo la tabla cuando la tarea se completa? – ASHUTOSH

+0

Ese fue el punto del cronjob para ejecutar una tarea para procesar, acceder a la base de datos y actualizarla – BugFinder

Respuesta

3

Eche un vistazo a this.

Utiliza memcached para la persistencia.

1

Problema con el enfoque cronjob es que el cronjob puede establecerse en un intervalo de 1 minuto, por lo que hay un retraso de 1 minuto en la ejecución del trabajo; si eso es aceptable, de lo contrario debería usar colas con script de sondeo.

0

Dado que los DB relacionales (por ejemplo, MySQL) son muy flexibles y los desarrolladores web los entienden bien, se utilizan para muchos tipos de colas de trabajos. Muchas aplicaciones PHP usan esta solución como alternativa cuando el almacenamiento en caché de objetos no está configurado. Es el método de último recurso porque es una forma muy costosa de implementar una cola.

Si debe utilizar MySQL como su cola, uno de los ingenieros de Percona escribió este blog entry para gestionar los posibles puntos débiles.

Si desea la implementación más escalable, le recomiendo ZeroMQ. Sin embargo, no es una extensión PHP predeterminada o particularmente común. Por lo tanto, para un proyecto en el que no controlaría la pila del servidor web: use objetos APC, Memcache o Memcached, y luego vuelva a utilizar una tabla de caché MySQL.

4

Esto es algo que podría hacer fácilmente con la biblioteca enqueue. En primer lugar, puede elegir entre una variedad de transports, como AMQP, STOMP, Redis, Amazon SQS, Sistema de archivos, etc.

En segundo lugar, es super fácil de usar. Comencemos desde la instalación:

Tienes que instalar la biblioteca enqueue/simple-client y one of the transports. Suponiendo que elige el sistema de archivos, instale la biblioteca enqueue/fs.Para resumir:

composer require enqueue/simple-client enqueue/fs 

Ahora vamos a ver cómo se puede enviar mensajes desde el script de 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'); 

el guión 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(); 

ejecutar tantas consumer.php procesos como la que mediante el uso de supervisord u otros administradores de procesos, en la computadora local puede ejecutarlo sin ningún libs o paquetes adicionales.

Ese es un ejemplo básico y enqueue tiene muchas otras características que pueden ser útiles. Si está interesado, marque enqueue documentation.

Cuestiones relacionadas