web-dev-qa-db-fra.com

PHP Comment implémenter le traitement des files d'attente en php

Je veux que les données envoyées par mes clients (via post) soient placées dans une file d'attente et qu'un script php sur mon serveur vérifie d'abord si la file d'attente est vide. Si la file d'attente n'est pas vide, le script doit traiter toutes les données de la file d'attente une par une. Comment puis-je le faire?

17
ASHUTOSH

Vous pouvez utiliser quelque chose comme Zero MQ

Voir Exemple de Rasmus Lerdorf .

Vous pouvez également envisager d'utiliser Gearman pour répartir la charge.

8
Bernhard Kircher

C'est quelque chose que vous pourriez facilement faire avec enqueue library. Tout d'abord, vous pouvez choisir parmi une variété de transports , tels que AMQP, STOMP, Redis, Amazon SQS, Système de fichiers, etc. 

Deuxièmement, c'est super facile à utiliser. Commençons par l'installation:

Vous devez installer la bibliothèque enqueue/simple-client et l'un des transports . En supposant que vous choisissiez le système de fichiers, installez la bibliothèque enqueue/fs. Résumer:

composer require enqueue/simple-client enqueue/fs 

Voyons maintenant comment vous pouvez envoyer des messages à partir de votre 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');

Le script de consommation: 

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

Exécutez autant de processus consumer.php que vous en utilisant supervisord ou d’autres gestionnaires de processus, sur un ordinateur local, vous pouvez l’exécuter sans librairies ni packages supplémentaires. 

C'est un exemple élémentaire et la mise en file d'attente comporte de nombreuses autres fonctionnalités qui pourraient s'avérer utiles. Si cela vous intéresse, consultez la documentation mise en file d'attente out. 

5
Maksim Kotlyar

Regardez this

Il utilise memcached pour la persistance. 

3
nullpotent

Le problème avec l'approche cronjob est que cronjob peut être défini au maximum à un intervalle d'une minute. Il y a donc un délai d'une minute pour l'exécution du travail. Si c'est acceptable, vous pouvez utiliser des files d'attente avec un script d'interrogation.

1
Faisal Ameer

Voici un autre excellent tutoriel pour cela:

http://squirrelshaterobots.com/programming/php/building-a-queue-server-in-php-part-1-understanding-the-project/

L’autre solution consiste à utiliser Gearman qu’ils semblent avoir incorporé dans PHP (ce n’était pas la dernière fois que je jouais avec elle): http://php.net/manual/fr/book. gearman.php

1
Brian

Étant donné que les bases de données relationnelles (Ex: MySQL) sont très flexibles et bien comprises par les développeurs Web, elles sont utilisées pour de nombreux types de files d'attente de travaux. De nombreuses applications PHP utilisent cette solution comme solution de secours lorsque la mise en cache des objets n'est pas configurée. C'est la méthode de dernier recours car c'est un moyen très coûteux d'implémenter une file d'attente.

Si vous devez utiliser MySQL comme file d’attente, l’un des ingénieurs de Percona a écrit cette entrée de blog sur la gestion des problèmes potentiels. 

Si vous souhaitez une implémentation la plus évolutive possible, je vous recommande fortement ZeroMQ. Cependant, il ne s’agit pas d’une extension par défaut ni particulièrement courante, PHP. Donc, pour un projet où vous ne contrôleriez pas la pile de serveurs Web: Utilisez Objets APC, Memcache ou Memcached, puis utilisez une table de cache MySQL.

0
J. M. Becker