Via fgets() alle responses auslesen

  • Themenstarter Themenstarter Bgag
  • Beginndatum Beginndatum
B

Bgag

Abend!
Wie ist es möglich via fgets() alle Anworten einer Socket-Verbindung, die mit fsockopen() erstellt wurde, aus zu lesen, ohne ewig dafür zu brauchen. stream_get_contents habe ich bereits versucht, aber das gibt nur Ärger. Deshalb suche ich nun eine Alternative. Achso bei der Verbindung handelt es sich übrigens um eine Verbindung zu meinem FTP-Server. Wäre euch für eure Hilfe echt dankbar.
MfG, Andy

//EDIT: Man kann es ja auch wie folgt machen, aber diese Methode ist sehr Zeitaufwendig. Ich suche eigentlich eher etwas schnelleres.
PHP:
// Send some command to the server
fwrite($fp, $out);

// read until there is no response anymore
while (!feof($fp)) {
   $response .= fgets($fp, 128);
}
 
Zuletzt bearbeitet von einem Moderator:
Morgen!
Danke erstmal für deine Antwort. Wie müsste denn eine solche Abfrage aussehen. Denn fpassthru() liefert ja entweder einen Integer oder FALSE zurück. Das eigentliche Suchergebnis wrd ja in den Ausgabepuffer geschrieben. Wie müsste denn das dann aussehen. Am besten wäre es ja, wenn man die Zurückgegebenen Zeilen in ein Array packen könnte. Ein weiteres Problem ist, dass ja nicht immer sofort eine Rückmeldung gesendet wird. Habe mal den Code den ich momentan verwende mitgeschickt.
MfG, Andy
PHP:
<?php
/**
	* getReply() - Gets the reply of the ftp-server
	*
	* @access: public
	* @param Int $i
	* @return String
	*/
	public function getReply($i = 0)
	{
		// get response from ftp-connection
		$reply = fgets($this->ctrlCon);
		if($reply == '')
		{
			if($i == 30)
			{
				return "";
			}
			
			else
			{
				sleep(1);
				return $this->getReply($i + 1);
			}
		}	
			
		$this->log($reply);
		
		return $reply;	 
	}
?>
 
Ich würde für so etwas immer fget statt fgets verwenden. Wenn du eh das File einließt, ist das schon besser wenn er nicht die Zeilenenden suchen muss.

Aber andere Frage: was ist "ewig"?
Millisekunden? Sekunden? Minuten?

Und was ist am fget lesen zu langsam?
hier auch: was ist langsam? Der Verbindungsaufbau? Die Übertragung? Die Zeit den Code zu schreiben?

Abhängig von dem File das du überträgst kannst du ja ruhig die Puffergröße erhöhen.

Das Problem das man bei solchen Verbindungen teilweise hat ist meist das der Server kein EOF Sendet, und das script so auf den timeout wartet. Hier hilft es eben diesen stark herunterzusetzen.

Oder Bitgenau soviel Daten lesen wie zu lesen sind.
 
Hallo!
Danke erstmal für deine Antwort. Also pass auf. Eigentlich ist es ganz einfach. Ich fange mit fgets() die Responses des FTP-Servers ab und speichere sie. Diese Responses sind keine Dateien sondern reine Statuscodes! Ich lese also aus einem Stream. Da es dort nicht immer ein EOF gibt, kann ich nicht auf diese Funktion zurückgreifen sondern muss, nachdem ich einen Befehl, wie zum Beispiel USER oder PASS gesendet habe, auf den Response warten, der aber nicht gleich sofort kommt. Deshalb zähle ich solange durch bis ich eine Antwort erhalte. Bleibt diese Antwort aus, wird einfach abgebrochen. Mit fgets() kann ich leider immer nur eine Zeile in ein String lesen. Allerdings können auf einen Befehl wie LIST mehrere Antworten kommen. Die möchte ich auch auslesen, da zumeist die letzte für mich wichtig ist. Und dort suche ich nun eine Alternative zu meinem Codesnipet.

Zu der Sache mit fget oder fgets: Ich wüsste nicht, dass es eine Funktion fget() gibt. Zumindest konnte mir das Manual darüber auch keine Auskunft geben. Es gibt nur diverse Alias. fgetc(), fget_ftp, fget_csv etc. Viele davon benötigen allerdings eine Bibliothek, auf die ich allerdings nicht zurückgreifen möchte.

MfG, Andy

//EDIT: Mir ist gerade eingefallen, dass ich das Abfangen von weiteren Statuscodes ja einfach von den empfangenen Codes abhängig machen kann, da die ja auch darüber eine Auskunft geben. Versuche das gleich mal.
 
Morgen!
Entschuldigt das Doppel-Posting, aber ich habe da noch eine kleine Frage. Könnte ich mein Problem mit der socket_select()-Funktion lösen? Wenn ich das richtig verstanden habe, kann ich doch mit dieser Funktion auch testen, ob der Server auf einen Befehl antwortet und wenn das der Fall ist die Antwort auslesen!?
MfG, Andy
 
Zurück