2011-01-05 3 views
0

Avant de plonger dans le vif du sujet, je vais d'abord décrire le scénario actuel. J'ai actuellement un script php qui s'exécute via CLI pour traiter certaines données. Il va quelque chose comme ceci:Langage optimal pour le traitement asynchrone de l'information

  • L'utilisateur soumet des données sur le site Web et il est stocké dans une base de données
  • Un script php exécuter des cycles de CLI à travers toutes les données dans la base de données toutes les 5 minutes . Il lit les informations soumises par l'utilisateur dans la base de données, les traite, puis crée plusieurs autres entrées dans d'autres bases de données. Souvent, il peut être nécessaire de poster quelque chose via http en utilisant file_get_contents.
    • Je ne peux pas toujours les informations traitées simplement lorsque l'utilisateur soumet pour des raisons logistiques (ce qui est non négociable)

Le code pour cela ressemblerait à quelque chose comme ceci:

$q = mysql_query("SELECT username, infoA, infoB FROM data"); 

while($r = mysql_fetch_array($q)) 
{ 

some_function($r['username'], $r['infoA']); 
another_function($r['infoB']); 

} 

Les fonctions "une_fonction" et "autre_fonction" sont celles où se déroule tout le traitement effectif de l'information. Voici le problème: Souvent, il y a beaucoup d'entrées à parcourir et il y a beaucoup trop de retard entre le moment où la première entrée est traitée et le dernier. J'ai besoin de toutes les données traitées avec un délai minimal entre la première et la dernière entrée. Les fonctions elles-mêmes sont bien optimisées et fonctionnent assez vite, ce qui n'est pas le problème. Étant donné que les futurs appels de fonction n'ont pas besoin de référencer des données provenant d'appels de fonctions précédents, je pense que j'ai besoin que les fonctions soient exécutées de manière asynchrone. De cette façon, le script peut passer à l'entrée suivante sans attendre le traitement de la première entrée.

Le script php cli que j'ai créé est principalement à des fins de test. Cela fonctionne bien pour les tests préliminaires, mais une fois que je lancerai, la quantité de données sera significativement plus grande. Quel est le langage idéal pour gérer une tâche comme celle-ci? J'ai certainement besoin que les fonctions soient exécutées de manière asynchrone. Cependant, s'il y a trop d'appels asynchrones en même temps, cela peut surcharger le système ou les informations ne peuvent pas être traitées correctement. Par conséquent, il doit également y avoir un moyen efficace de gérer cela. Puis-je le faire en php, ou devrais-je passer à autre chose et pourquoi?

Les exigences sont que je peux faire des requêtes http avec des données GET (je n'ai pas besoin d'attendre les résultats), être capable d'utiliser mysql, et memcached. D'un point de vue réaliste, j'engagerai des programmeurs pour travailler sur ce sujet. Donc, je cherche vraiment autant d'informations que possible pour déterminer exactement quels ensembles de compétences je devrais rechercher dans les programmeurs.

Veuillez également ne pas recommander un serveur plus rapide. Je suis concentré sur l'optimisation de la fin du logiciel. Les améliorations du serveur physique requises pour une approche logicielle améliorée pourraient être prises en compte. Cependant, j'essaie d'éviter de simplement injecter de l'argent dans l'infrastructure matérielle pour compenser l'inefficacité du logiciel.

Répondre

1

Je vous recommande d'utiliser Gearmand dès maintenant.

Il est très facile à utiliser avec PHP avec cette extension http://php.net/manual/fr/book.gearman.php

Il suffit de configurer un serveur gearman et factoriser votre code à déléguer le traitement à ce serveur.

Votre code précédent peut être comme ça remaniée avec:

<?php 

# Client Code 
$client= new GearmanClient(); 
$client->addServer(); 
print $client->doBackground("action1", json_encode(array($username, $infoA))); 
print $client->doBackground("action2", $infoB); 


# Worker Code 
$worker= new GearmanWorker(); 
$worker->addServer(); 
$worker->addFunction("action1", "some_function"); 
$worker->addFunction("action2", "another_function"); 
while ($worker->work()); 

function some_function($job) 
{ 
    list($username, $infoA) = json_decode($job->workload(), true); 
    // do the stuff ... 
} 

function another_function($job) 
{ 
    $infoB = $job->workload(); 
    // do the stuff ... 
} 
+0

Merci beaucoup. Je regarde en ce moment. – user396404

+0

Curieux, s'il n'y a pas assez de travailleurs pour gérer toutes les demandes des clients, Gearman crée-t-il automatiquement un travail de travail jusqu'à ce qu'un travailleur devienne disponible? – user396404

+0

Exactement. Par défaut, toutes les files d'attente de travail sont stockées en mémoire. Mais vous pouvez stocker la file d'attente dans MySQL comme décrit dans http://gearman.org/index.php?id=manual:job_server#persistent_queues –

Questions connexes