Aktueller Standort: Startseite> Neueste Artikel> So implementieren Sie die Datenübertragung von Socket, indem Sie Daten über die FSocopen -Funktion senden? Was sind die Tipps?

So implementieren Sie die Datenübertragung von Socket, indem Sie Daten über die FSocopen -Funktion senden? Was sind die Tipps?

gitbox 2025-06-21

In PHP ist die FSocopen -Funktion eine häufig verwendete Funktion zum Erstellen von Socket -Verbindungen, mit der Sie Daten mit Remote -Servern kommunizieren können. Mit FSOCCKOPEN können Sie eine einfache Socket-Datenübertragung implementieren, die für Anwendungen, die Niedrigbetrieb benötigen, sehr nützlich ist. In diesem Artikel wird untersucht, wie mit FSocopen die Datenübertragung implementiert und einige Tipps weitergegeben werden, die während der Verwendung verwendet werden können.

1. grundlegende Verwendung der FSOCCKOPEN -Funktion

Mit der FSOCCKOPEN -Funktion wird eine Netzwerkverbindung geöffnet und kann zum Erstellen von TCP- oder UDP -Sockeln verwendet werden. Der grundlegendste Funktionsprototyp ist wie folgt:

 <span><span>resource </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$hostname</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$port</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> &amp;</span><span><span class="hljs-variable">$errno</span></span><span> [, </span><span><span class="hljs-keyword">string</span></span><span> &amp;</span><span><span class="hljs-variable">$errstr</span></span><span> [, </span><span><span class="hljs-keyword">float</span></span><span> </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ini_get</span></span><span>(</span><span><span class="hljs-string">"default_socket_timeout"</span></span><span>) ]]] )
</span></span>
  • $ hostname : Der Ziel -Hostname oder die IP -Adresse.

  • $ port : Die Zielportnummer.

  • $ errno und $ errstr : optionale Parameter zum Erfassen von Fehlermeldungen.

  • $ Timeout : Optionale Verbindungszeitlimit in Sekunden.

Ein einfaches Beispiel für die Verwendung:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'www.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">80</span></span><span>;
</span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">30</span></span><span>; </span><span><span class="hljs-comment">// Stellen Sie die Zeitüberschreitungszeit auf 30 Zweite</span></span><span>

</span><span><span class="hljs-comment">// verwenden fsockopen Eine Verbindung herstellen</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-variable">$timeout</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Fehler: <span class="hljs-subst">$errno</span></span></span><span> - </span><span><span class="hljs-subst">$errstr</span></span><span>&lt;br /&gt;\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Mit erfolgreich verbunden <span class="hljs-subst">$host</span></span></span><span>:</span><span><span class="hljs-subst">$port</span></span><span>&lt;br /&gt;\n";
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

2. Verwenden Sie FSocopen für die Datenübertragung

Sobald die Verbindung hergestellt ist, können Sie die Datenübertragung mit dem Server starten. Für die HTTP -Protokollkommunikation müssen Sie normalerweise einen Anforderungsheader senden, und der Server reagiert auf die entsprechenden Daten. Hier ist ein einfaches Beispiel für HTTP -Anforderungen:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'www.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">80</span></span><span>;
</span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">30</span></span><span>;

</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-variable">$timeout</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Fehler: <span class="hljs-subst">$errno</span></span></span><span> - </span><span><span class="hljs-subst">$errstr</span></span><span>&lt;br /&gt;\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-comment">// Bauen HTTP Header anfordern</span></span><span>
    </span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET / HTTP/1.1\r\n"</span></span><span>;
    </span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$host</span></span></span><span>\r\n";
    </span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Connection: close\r\n"</span></span><span>;
    </span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"\r\n"</span></span><span>;

    </span><span><span class="hljs-comment">// Senden Sie eine Anfrage</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$request</span></span><span>);

    </span><span><span class="hljs-comment">// Empfangs- und Ausgabeserver Antwort</span></span><span>
    </span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">128</span></span><span>);
    }

    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

Im obigen Code verwenden wir FSocopen , um die Verbindung herzustellen, und senden dann den HTTP -Anforderungsheader über die FWRET -Funktion an den Server und verwenden die Funktion der FGETS , um die vom Server zurückgegebenen Daten zu lesen. Schließlich schließen Sie die Socket -Verbindung über FCLOSE .

3.. Häufige Tipps und Vorsichtsmaßnahmen

3.1 Timeout einstellen

Bei der Netzwerkprogrammierung ist das Festlegen einer angemessenen Zeitüberschreitung sehr wichtig, insbesondere wenn Sie mit einem Remote -Server interagieren. Das Verbindungszeitlimit kann über den $ Timeout -Parameter von fSocopen gesteuert werden. Wenn die Zeitüberschreitung, die Sie festgelegt haben, zu kurz ist, kann dies zu einer vorzeitigen Verbindungsunterbrechung führen. Wenn es zu lang ist, kann das Programm ausgesetzt werden, wenn es keine Verbindung herstellt. Es wird normalerweise empfohlen, das Zeitüberschreitungen innerhalb von 30 Sekunden festzulegen.

 <span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">10</span></span><span>; </span><span><span class="hljs-comment">// Stellen Sie die Auszeit auf 10 Zweite</span></span><span>
</span></span>

3.2 Fehlerbehandlung

Der Rückgabewert der FSOCCKOPEN -Funktion ist ein Ressourcentyp (der Handle zur Socket -Verbindung), und wenn die Verbindung fehlschlägt, gibt sie false zurück. Um Fehler zu vermeiden und zu verarbeiten, wird empfohlen, den Fehlercode $ errno und die Fehlermeldung $ errstr für detaillierte Datensätze zu verwenden:

 <span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Verbindung ist fehlgeschlagen:<span class="hljs-subst">$errno</span></span></span><span> - </span><span><span class="hljs-subst">$errstr</span></span><span>&lt;br /&gt;\n";
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>

3.3 Datenübertragungsmodus

Zusätzlich zum Senden von HTTP -Anforderungen kann FSocopen auch verwendet werden, um Daten aus anderen Protokollen wie FTP, SMTP, POP3 usw. zu senden. Unabhängig vom Protokoll besteht die Kernidee darin, Daten über FWRITE , FREED oder FETS zu senden, um die Antwort zu erhalten. Abhängig vom Protokoll kann sich das Datenformat ändern. Es wird empfohlen, das Anforderungsformat des Zielprotokolls vor dem Senden der Daten vertraut zu machen.

3.4 Anhaltende Verbindung

In einigen Fällen kann es wünschenswert sein, eine langfristige Verbindung mit dem Server aufrechtzuerhalten, der durch http persistente Verbindungen (Keep-Alive) erreicht werden kann. Durch Hinzufügen von Verbindungen: Keep-Alive Im Anforderungsheader können Sie die Verbindung zwischen mehreren Anforderungen nicht abgeschlossen halten:

 <span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET / HTTP/1.1\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$host</span></span></span><span>\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Connection: keep-alive\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"\r\n"</span></span><span>;
</span></span>

3.5 Verwenden eines Proxy -Servers

Manchmal müssen Sie möglicherweise über einen Proxy -Server mit dem Zielserver kommunizieren. Zu diesem Zeitpunkt können die Adresse und der Port des Proxy -Servers an fSocopen übergeben werden, anstatt sich direkt mit dem Zielserver zu verbinden:

 <span><span><span class="hljs-variable">$proxy</span></span><span> = </span><span><span class="hljs-string">'proxy.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$proxyPort</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;

</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$proxy</span></span><span>, </span><span><span class="hljs-variable">$proxyPort</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-variable">$timeout</span></span><span>);
</span></span>

Es ist zu beachten, dass der Proxy -Server möglicherweise spezifische Authentifizierungsinformationen (z. B. Benutzername und Kennwort) benötigt, und zu diesem Zeitpunkt muss der Anforderungsheader gemäß den Anforderungen des Proxy -Protokolls erstellt werden.

4. Zusammenfassung

FSOCCKOPEN ist eine sehr leistungsstarke Funktion in PHP und geeignet für die Netzwerkkommunikation auf niedriger Ebene. Wenn Sie Daten mit Remote -Servern austauschen müssen, bietet FSocopen einen direkten und flexiblen Weg. Mastering grundlegende Nutzungsmethoden, Zeitüberschreitungseinstellungen, Fehlerbehebung und Übertragungstechniken gemeinsamer Protokolle können Sie effizienter mit Socket -Datenübertragungen realisieren. Denken Sie in praktischen Anwendungen daran, die Parameter entsprechend den Anforderungen anzupassen und die Stabilität von Netzwerkanforderungen sicherzustellen.