Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过Docker-can';t连接到redis容器(组合设置)_Php_Docker_Redis_Phpredis - Fatal编程技术网

Php 通过Docker-can';t连接到redis容器(组合设置)

Php 通过Docker-can';t连接到redis容器(组合设置),php,docker,redis,phpredis,Php,Docker,Redis,Phpredis,我正在尝试使用PHP中的phpredis建立从HTTP服务器容器到Redis容器的连接 这是撰写文件: version: '3' services: arcade: build: context: . args: - HOST_IP=${HOST_IP} - XDEBUG_PORT=${XDEBUG_PORT} image: arcade-dev:latest ports: - "80:80"

我正在尝试使用PHP中的phpredis建立从HTTP服务器容器到Redis容器的连接

这是撰写文件:

version: '3'
services:
  arcade:
    build:
      context: .
      args:
        - HOST_IP=${HOST_IP}
        - XDEBUG_PORT=${XDEBUG_PORT}
    image: arcade-dev:latest
    ports:
      - "80:80"
    volumes:
      - ../../..:/var/www/localhost/htdocs
    links:
      - marry
    networks:
      - arcade_net
  marry:
    image: mariadb
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=s3cr3t
    volumes:
      - arcade_data:/var/lib/mysql
    networks:
      - arcade_net
  arcade_cache:
    image: redis
    volumes:
      - arcade_cache_data:/data
    ports:
      - "6379:6379"
    networks:
      - arcade_net
volumes:
  arcade_data: {}
  arcade_cache_data: {}
networks:
  arcade_net:
    driver: bridge
这是Redis客户端设置:

use Redis;

final class ArcadeCache
{

    public static function getClient(): Redis
    {
        $redis = new Redis();
        $redis->connect('arcade_cache');
        return $redis;
    }
}
这是我使用phpunit来测试连接的一个测试

public function testRedisConnection(): void
{
    $client = ArcadeCache::getClient();

    $client->append('testKey', 'BAZINGA');
    $bazinga = $client->get('testKey');

    $this->assertEquals('BAZINGA', $bazinga);
}
当我运行测试(使用“arcade”服务的映像构建)时,我得到以下错误:

RedisException : php_network_getaddresses: getaddrinfo failed: Name does not resolve
 /opt/project/Infrastructure/ArcadeCache.php:14
 /opt/project/Tests/Infrastructure/ArcadeCacheTest.php:22

 Caused by
 PHPUnit\Framework\Error\Warning: Redis::connect(): php_network_getaddresses: getaddrinfo failed: Name does not resolve

 /opt/project/Infrastructure/ArcadeCache.php:14
 /opt/project/Tests/Infrastructure/ArcadeCacheTest.php:22
当我“exec”到http服务器容器“arcade\u cache”时,主机名已正确解析

bash-5.0# ping arcade_cache
PING arcade_cache (172.28.0.3): 56 data bytes
64 bytes from 172.28.0.3: seq=0 ttl=64 time=0.152 ms
64 bytes from 172.28.0.3: seq=1 ttl=64 time=0.080 ms
当我尝试使用IP(
$redis->connect('172.28.0.3');
)而不是主机名连接时,get超时:

RedisException : Operation timed out
 /opt/project/Infrastructure/ArcadeCache.php:14
 /opt/project/Tests/Infrastructure/ArcadeCacheTest.php:21

Time: 1.05 minutes, Memory: 6.00 MB

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

Process finished with exit code 2
使用“marry”主机名连接到数据库工作正常


有什么想法吗?

你可以尝试使用
网络,就像这样


除非我遗漏了什么,否则我会用同样的方式使用它。在未指定网络的情况下也尝试过(默认情况下,所有容器都应位于compose中的同一网络上),但给出了完全相同的结果。除了在容器之间ping有效之外,这也是为什么我感到困惑:)您还可以删除所有显式声明的
网络:
,并使用Compose为您提供的
默认
网络,如中所述。问题中的
网络:
声明是自一致的,这似乎不是问题所在。您在哪里以及如何运行测试?(从主机,Dockerfile,一个单独的
docker run
命令,
docker compose run
,其他什么?)从PhpStorm,我将php解释器设置为由compose文件(arcade dev:latest)构建的容器,右键单击测试方法或整个套件,然后单击run test。