我有stream_socket_client()
功能问题,但仅在某些情况下。
我正在使用 docker-compose 构建包含 nginx、php-fpm (7.1.3) 和 schickling/mailcatcher(以及其他几个不重要的容器)的环境。
我的问题与 SwiftMailer 有关,但我已将问题隔离到以下代码:
// /var/www/web/app_dev.php
$streamContext = stream_context_create();
$timeout = 5;
$_stream = stream_socket_client('172.21.0.106:1025', $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $streamContext);
var_dump($_stream);
172.21.0.106:1025
是正确的静态IP:Mailcatcher 的端口。
现在,如果我通过浏览器请求这个文件,我得到:
/var/www/web/app_dev.php:8:resource(4, 流)
哪个是对的。
当我这样做时docker exec php_container /var/www/web/app_dev.php
,我得到:
/var/www/web/app_dev.php:9:资源(20)类型(流)
这也是正确的。
但是,当我使用配置的 Docker 远程解释器(通常工作正常)通过 PhpStorm(选项“运行>运行...”)运行此脚本时,我得到输出:
docker://php_container:latest/php /var/www/web/app_dev.php
警告:stream_socket_client():无法连接到第 5 行 /var/www/web/app_dev.php 中的 172.21.0.106:1025(连接超时)
调用堆栈:0.0001 349080 1. {main}() /var/www/web/app_dev.php:0 0.0032 360960 2.stream_socket_client() /var/www/web/app_dev.php:5
进程以退出代码 0 结束
我做了一些测试,似乎在尝试使用任何其他容器的主机:端口时存在问题,但是在使用 docker 网络之外的任何东西时它都可以工作。
例如,使用'172.21.0.103:3306'
(MySQL 容器)问题仍然存在,但使用'google.com:80'
,它也可以通过 PhpStorm 运行功能工作。
docker-compose.yml 的重要部分:
services:
php:
build: ./docker/php
container_name: php_container
volumes:
- .:/var/www
networks:
mynet:
ipv4_address: 172.21.0.102
mailcatcher:
image: schickling/mailcatcher
container_name: mailcatcher
ports:
- "1080:1080"
networks:
mynet:
ipv4_address: 172.21.0.106
networks:
mynet:
ipam:
config:
- subnet: 172.21.0.0/24
PHP Docker 文件:
FROM php:7-fpm
RUN apt-get update && apt-get install -y git zlib1g-dev zip unzip libgd-dev
RUN docker-php-ext-install pdo pdo_mysql zip gd
RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache
RUN pecl install xdebug-2.5.0 && docker-php-ext-enable xdebug
WORKDIR /var/www
将docker-compose.yml
, all Dockerfile
s 等放在这里的内容非常多,所以如果需要配置的任何其他特定部分,请让我现在在评论中。