2010-04-19 14 views
6

Ich habe einige echte Probleme mit der Verzögerung durch die Verwendung von fgets, um die Antwort des Servers auf einige Batch-Datenbankaufrufe, die ich mache zu ergreifen.PHP schnellste Methode zum Lesen der Serverantwort

Ich sende durch eine Charge von sagen, 10.000 Anrufe und ich habe die Verzögerung nach unten zu Fgets verfolgt verursacht den Halt in der Geschwindigkeit meiner Anwendung als die Antwort für jeden Anruf muss ergriffen werden.

ich diesen Thread http://bugs.php.net/bug.php?id=32806 gefunden habe, das das Problem recht gut erklärt, aber er hat eine Datei zu lesen, keine Serverantwort so könnte fread ein bisschen schwierig sein, wie ich Teil der nächsten Zeile bekommen konnte und zusätzliche Sachen die ich don Ich will nicht.

Also meine Frage ist, was ist der beste/schnellste Weg, um die Antwort vom Server als Alternative zu Fgets zu lesen?

+0

was Sie fragen? PHP-Sprache haben nichts wie Geschwindigkeit Verarbeitung, aber diese Sprache ist nicht für. – Svisstack

+0

Und können Sie etwas Code anzeigen? Welche Art von Datenbankaufrufen sind das? –

+0

sie sind Anrufe zu Redis NoSQL Server –

Antwort

0

Nicht wirklich genug Informationen hier.

Vermutlich meinst du, dass irgendwo PHP läuft, die fgets aufrufen, um Daten von etwas anderem einzulesen - aber was ist das noch etwas? Sie weisen darauf hin, dass es keine Datei ist - also was ist es? Ein lokales Programm? ein Rohr? eine Netzwerkdose? eine Internetseite? ... etwas anderes?

Können Sie es lesen schneller ein anderes Werkzeug verwenden? Was hast du probiert? Auf welchem ​​Betriebssystem laufen Sie? Hast du Shell-Zugang, um netcat oder ähnliches zu betreiben?

Auch Sie sprechen über Verzögerung, während der "Bug", auf den Sie sich beziehen, hauptsächlich die Bandbreite anspricht.

Ohne viel mehr über das Problem seiner unmöglich zu wissen, eine Lösung vorzuschlagen.

C.

+0

Sicher, gute Punkte - im einen PHP-Framework (Predis) mit einer Redis Datenbank zu interagieren mit. Es scheint, dass, wenn ich eine Reihe von Befehlen über eine Socket-Verbindung von PHP zu Redis sende, das fgets, das verwendet wird, um die Antwort des Redis-Servers zu lesen, die Verzögerung verursacht. Grundsätzlich ist die Predis Framework verwendet fgets Antworten vom Server zu lesen und das ist, wo die ganze Zeit ausgegeben wird - beim Senden und Daten über den Draht zu empfangen. –

+0

Die nächste Frage ist also, woher wissen Sie, dass das Problem am PHP-Ende liegt? Hast du es mit einem anderen Kunden getestet? Haben Sie versucht, den Socket als nicht blockierend auszuführen? – symcbean

+0

Und sind Sie sicher, dass die Verzögerung in PHP und nicht auf der Datenbankseite ist. –

2

file_get_contents (oder stream_get_contents wenn Sie einen Stream) sollte der schnellste Weg, um eine Server-Antwort zu lesen. Nun, es ist der schnellste Weg, um Daten abzurufen, aber oft ist es der verschwenderischste Weg, wenn man die Speicherauslastung betrachtet, da es die gesamte Datei gleichzeitig in den Speicher liest, während fgets nicht mehr als eine Zeile im Speicher behalten muss.

Sie verwenden auch fread, das ist schneller als fgets und liest die Datei in Blöcken einer bestimmten Größe, die Sie definieren können.

Wenn Sie Daten zeilenweise lesen müssen, können Sie file() verwenden, das langsamer als file_get_contents ist, aber Ihnen ein Array mit den Zeilen der Datei liefert.

Um Ihnen eine bessere Antwort zu geben - wie bereits oben erwähnt - benötigen wir weitere Informationen.

Verwandte Themen