PHP套接字连接socket_connect():无法连接[111

insrf1ej  于 2023-02-07  发布在  PHP
关注(0)|答案(1)|浏览(219)

我已经创建了下面的docker-composer yml文件来创建连接php到套接字服务器的环境。

services:
  websocket-server:
    build: .
    command: php -S 127.0.0.1:1000 -t /var/www/html/websocket
    volumes:
      - ./src:/var/www/html
    ports:
      - 1000:1000
  
  php-tutorial:
    build: .
    volumes: 
      - ./src:/var/www/html
    ports:
      - 7000:80

我的Dockerfile看起来像

FROM php:8.0-apache
WORKDIR /var/www/html
RUN apt-get update -y && apt-get install -y telnet libmariadb-dev
RUN docker-php-ext-install mysqli sockets

在构建了Docker容器之后,两个容器都运行良好,在websocket-server中我得到了下面的日志

[Fri Feb 3 05:12:43 2023] PHP 8.0.27 Development Server (http://127.0.0.1:1000) started

现在我已经写了一个php代码来连接socket

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, 0);

if (socket_connect($socket, '127.0.0.1', 1000) === false) {
    echo "Unable to connect to server\n";
    exit;
}

socket_write($socket, "Hello, server!");

$response = socket_read($socket, 1024);

echo "Response from server: $response\n";

socket_close($socket);

在浏览器中运行后,我得到以下警告

Warning: socket_connect(): unable to connect [111]: Connection refused in /var/www/html/index.php on line 4
Unable to connect to server

我找不到解决办法。

qij5mzcb

qij5mzcb1#

你需要连接两个container到同一个网络,forward端口只是连接container端口你的主机,它不会帮助你连接每个container,所以你的php container可以接触socket container。
读取文档:https://docs.docker.com/network/
我不确定这个示例是否有效,但您可以尝试一下:

services:
  websocket-server:
    build: .
    command: php -S 127.0.0.1:1000 -t /var/www/html/websocket
    volumes:
      - ./src:/var/www/html
    ports:
      - 1000:1000
    networks:
      - dev
  php-tutorial:
    build: .
    volumes: 
      - ./src:/var/www/html
    ports:
      - 7000:80
    networks:
      - dev
networks:
  dev:
    driver: bridge

即使你连接到同一个网络,你仍然需要改变你的代码:

if (socket_connect($socket, '127.0.0.1', 1000) === false)

// change to below

if (socket_connect($socket, 'websocket-server', 1000) === false)

相关问题