2011-01-05 4 views
0

Bevor ich mich mit dem Kern der Sache beschäftige, muss ich zunächst das aktuelle Szenario skizzieren. Ich habe derzeit ein PHP-Skript, das über CLI ausgeführt wird, um einige Daten zu verarbeiten. Es geht ungefähr so:Optimale Sprache für die asynchrone Verarbeitung von Informationen

  • Der Benutzer einige Daten über die Website einreicht und in einer Datenbank
  • ein PHP-Skript ausgeführt wird durch CLI-Zyklen durch alle Daten in der Datenbank alle 5 Minuten oder so gespeichert ist, . Er liest die vom Benutzer in der Datenbank übermittelten Informationen, verarbeitet sie und erstellt dann mehrere andere Einträge in anderen Datenbanken. Oft muss es möglicherweise etwas über http mit file_get_contents posten.
    • kann ich nicht immer die Informationen einfach bearbeitet haben, wenn der Benutzer es aus logistischen Gründen einreicht (dies ist nicht verhandelbar)

Der Code für sie so etwas wie folgt aussehen würde:

$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']); 

} 

Die Funktionen "some_function" und "another_function" sind die Stellen, an denen die eigentliche Verarbeitung der Informationen stattfindet. Hier ist das Problem: Oft gibt es viele Einträge zum Durchlaufen und es gibt eine viel zu große Verzögerung zwischen dem Zeitpunkt der Verarbeitung des ersten Eintrags und dem letzten Eintrag. Ich brauche alle Daten mit minimaler Verzögerung zwischen dem ersten und letzten Eintrag verarbeitet. Die Funktionen selbst sind gut optimiert und laufen ziemlich schnell, das ist nicht das Problem. Da zukünftige Funktionsaufrufe nicht auf Daten früherer Funktionsaufrufe verweisen müssen, denke ich, dass die Funktionen asynchron ausgeführt werden müssen. Auf diese Weise kann das Skript zum nächsten Eintrag wechseln, ohne auf die Verarbeitung des ersten Eintrags zu warten.

Das PHP CLI-Skript, das ich erstellt habe, dient hauptsächlich zu Testzwecken. Es funktioniert gut für vorläufige Tests, aber sobald ich starten, wird die Menge der Daten deutlich größer sein. Was ist die ideale Sprache für die Bearbeitung einer solchen Aufgabe? Ich brauche sicherlich die Funktionen asynchron ausgeführt werden. Wenn jedoch zu viele asynchrone Aufrufe gleichzeitig vorliegen, könnte das System überlastet werden oder die Informationen werden nicht ordnungsgemäß verarbeitet. Daher muss es auch einen effizienten Weg geben, damit umzugehen. Kann ich das noch in PHP machen oder sollte ich etwas anderes machen und warum?

Die Anforderungen sind, dass ich HTTP-Anfragen mit GET-Daten machen kann (ich muss nicht auf die Ergebnisse warten), in der Lage sein, mysql und memcached zu verwenden.

Realistisch gesehen, werde ich Programmierer einstellen, um daran zu arbeiten. Also, ich suche wirklich so viele Informationen wie möglich, um genau zu bestimmen, welche Fähigkeiten ich in den Programmierern suchen sollte.

Empfehlen Sie auch nicht einen schnelleren Server. Ich konzentriere mich auf die Optimierung der Software. Verbesserungen des physischen Servers, die für einen verbesserten Software-Ansatz erforderlich sind, können berücksichtigt werden. Ich versuche jedoch zu vermeiden, einfach Geld in die Hardware-Infrastruktur zu pumpen, um Software-Ineffizienz auszugleichen.

Antwort

1

Ich empfehle Ihnen, jetzt Gearmand zu verwenden.

Es ist sehr einfach mit PHP mit dieser Erweiterung zu verwenden http://php.net/manual/fr/book.gearman.php

einfach einen gearman Server einrichten und Refactoring Code der gesamten Verarbeitung an diesen Server zu delegieren.

Ihre vorherige Code kann wie das Refactoring:

<?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

Ihnen sehr danken. Ich untersuche das gerade jetzt. – user396404

+0

Neugierig, wenn es nicht genügend Mitarbeiter gibt, um alle Kundenanforderungen zu erfüllen, erstellt Gearmman automatisch eine Reihe von Jobs, bis ein Mitarbeiter verfügbar wird? – user396404

+0

Genau. Standardmäßig sind alle Jobwarteschlangen im Speicher abgelegt. Sie können die Warteschlange jedoch in MySQL speichern, wie in http://gearman.org/index.php?id=manual:job_server#persistent_queues beschrieben –