Beim Erstellen eines Socket-basierten Servers mit PHP ist Socket_accept () eine Schlüsselfunktion, um die serverseitige Verbindung zum Client zu implementieren. Wenn Sie solche Programme jedoch in einem Docker -Container ausführen, kann die Netzwerkkonfiguration dazu führen, dass Socket_accept () nicht ordnungsgemäß funktioniert, z. B. Verbindungszeitüberschreitungen, Unfähigkeit zum Anhören oder Client -Verbindungsfehler. Dieser Artikel enthält detaillierte Anweisungen zur Konfiguration des Netzwerks in einer Docker -Umgebung, sodass der Socket -Server von PHP reibungslos ausgeführt werden kann.
Socket -Dienste in PHP werden im Allgemeinen in den folgenden Schritten implementiert:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
$client = socket_accept($socket);
Grundsätzlich gibt es kein Problem, den oben genannten Code in einer lokalen Entwicklungsumgebung auszuführen, aber nachdem Sie ihn in einem Docker -Container bereitgestellt haben, stoßen Sie häufig auf Socket_accept () Blocking und der Client kann keine Verbindung herstellen. Die meisten Probleme beruhen aus der Netzwerkkonfiguration von Docker.
Wenn der vom Server angehaltene Port beim Starten des Containers dem Host nicht zugeordnet ist, kann der Client natürlich keine Verbindung herstellen. Zum Beispiel:
docker run -d php-server
In dem obigen Befehl wird keine Portzuordnung angegeben, und der vom PHP -Server angehaltene 8080 -Port ist für die Außenwelt nicht sichtbar.
Wenn Sie Socket an 127.0.0.1 binden, können nur Programme im Container auf diesen Dienst zugreifen. Um den Zugriff auf den Host oder einen anderen Container zu ermöglichen, sollten Sie an 0.0.0.0 binden.
Wenn zwischen mehreren Containern Kommunikation erforderlich ist, müssen sie mit demselben Docker -Netzwerk verbunden sein, da sie ansonsten unsichtbar sind.
Verwenden Sie beim Starten des Containers den Parameter -P , um den Containerport dem Host zuzuordnen:
docker run -d -p 8080:8080 php-server
Dadurch wird der Port 8080 des Containers an denselben Port auf dem Host abgebildet, und der Client kann über http://m66.net:8080/ darauf zugreifen.
Stellen Sie im PHP -Socket -Programm sicher, dass Sie 0.0.0.0 verwenden, um die Adresse zu binden:
socket_bind($socket, '0.0.0.0', 8080);
Auf diese Weise können Sie alle verfügbaren Netzwerkschnittstellen anhören, einschließlich der internen Adresse des Containers und der vom Host abgebildeten Ports.
Wenn mehrere Container (z. B. ein PHP -Socket -Service -Container und ein Client -Container) zur Kommunikation erforderlich sind, wird empfohlen, ein benutzerdefiniertes Netzwerk zu erstellen:
docker network create my-network
Verwenden Sie dann dieses Netzwerk, um den Container zu starten:
docker run -d --name php-server --network my-network php-server
docker run -it --network my-network php-client
Zu diesem Zeitpunkt kann PHP-Client direkt über den Containernamen PHP-Server eine Verbindung zum Dienst herstellen, z. B.:
socket_connect($client, 'php-server', 8080);
Bei Verwendung von Docker Compose können Sie das Netzwerk in Docker-compose.yml explizit angeben:
version: '3'
services:
php-server:
build: .
ports:
- "8080:8080"
networks:
- app-net
php-client:
build: ./client
networks:
- app-net
networks:
app-net:
driver: bridge
Der Client-Code kann weiterhin über PHP-Server: 8080 auf den Dienst zugreifen.
Verwenden Sie Netstat -tlnp oder SS -TLNP, um festzustellen, ob der Port zuhört.
Verwenden Sie Telnet M66.NET 8080 oder NC -ZV M66.NET 8080, um die Anschlussverbindung zu testen.
Überprüfen Sie die Docker -Protokolle und PHP -Fehlerprotokolle, um zu überprüfen, ob die Erstellung und Bindung von Socket falsch sind.
Wenn Socket_accept () in Docker -Containern verwendet wird, ist das Hauptproblem häufig nicht die Funktion selbst, sondern der Grund für eine unsachgemäße Netzwerkkonfiguration. Wenn Sie sicherstellen, dass die Höradresse 0,0.0.0 beträgt, ist der Containeranschluss korrekt zugeordnet und die Netzwerkverbindung zwischen Containern ist der Schlüssel zum Erreichen stabiler Socket -Dienste. Durch die Kombination des Docker -Netzwerkmodus und des Docker -Komponierungs -Service -Erkennungsmechanismus kann die Debugging -Schwierigkeit erheblich reduziert und die Effizienz der Bereitstellung verbessert werden.
Mit einer angemessenen Konfiguration können Sie stabile und effiziente PHP-Socket-Dienste in Docker-Containern erstellen und eine leistungsstarke Unterstützung für die Kommunikation zwischen Systemen bieten.