diff --git a/.github/psalm/cache/.gitignore b/.github/psalm/.gitignore similarity index 100% rename from .github/psalm/cache/.gitignore rename to .github/psalm/.gitignore diff --git a/.github/workflows/intl-data-tests.yml b/.github/workflows/intl-data-tests.yml index 17e26dad0d..0925858432 100644 --- a/.github/workflows/intl-data-tests.yml +++ b/.github/workflows/intl-data-tests.yml @@ -1,47 +1,50 @@ name: Intl data tests on: - push: - paths: - - 'src/Symfony/Component/Intl/Resources/data/**' - pull_request: - paths: - - 'src/Symfony/Component/Intl/Resources/data/**' + push: + paths: + - 'src/Symfony/Component/Intl/Resources/data/**' + pull_request: + paths: + - 'src/Symfony/Component/Intl/Resources/data/**' + +defaults: + run: + shell: bash jobs: + tests: + name: Tests (intl-data) + runs-on: ubuntu-latest - tests: - name: Tests (intl-data) - runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 - steps: - - name: Checkout - uses: actions/checkout@v2 + - name: Define the ICU version + run: | + SYMFONY_ICU_VERSION=$(php -r 'require "src/Symfony/Component/Intl/Intl.php"; echo Symfony\Component\Intl\Intl::getIcuStubVersion();') + echo "SYMFONY_ICU_VERSION=$SYMFONY_ICU_VERSION" >> $GITHUB_ENV - - name: Define the ICU version - run: | - SYMFONY_ICU_VERSION=$(php -r 'require "src/Symfony/Component/Intl/Intl.php"; echo Symfony\Component\Intl\Intl::getIcuStubVersion();') - echo "SYMFONY_ICU_VERSION=$SYMFONY_ICU_VERSION" >> $GITHUB_ENV + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + coverage: "none" + extensions: "zip,intl-${{env.SYMFONY_ICU_VERSION}}" + ini-values: "memory_limit=-1" + php-version: "7.4" - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - coverage: "none" - extensions: "zip,intl-${{env.SYMFONY_ICU_VERSION}}" - ini-values: "memory_limit=-1" - php-version: "7.4" + - name: Install dependencies + run: | + echo "::group::composer update" + composer update --no-progress --no-suggest --ansi + echo "::endgroup::" + echo "::group::install phpunit" + ./phpunit install + echo "::endgroup::" - - name: Install dependencies - run: | - echo "::group::composer update" - composer update --no-progress --no-suggest --ansi - echo "::endgroup::" - echo "::group::install phpunit" - ./phpunit install - echo "::endgroup::" + - name: Report the ICU version + run: icu-config --version && php -i | grep 'ICU version' - - name: Report the ICU version - run: icu-config --version && php -i | grep 'ICU version' - - - name: Run intl-data tests - run: ./phpunit --group intl-data -v + - name: Run intl-data tests + run: ./phpunit --group intl-data -v diff --git a/.github/workflows/phpunit-bridge.yml b/.github/workflows/phpunit-bridge.yml index bdda65de1b..8fa97980ff 100644 --- a/.github/workflows/phpunit-bridge.yml +++ b/.github/workflows/phpunit-bridge.yml @@ -1,28 +1,31 @@ name: PhpUnitBridge on: - push: - paths: - - 'src/Symfony/Bridge/PhpUnit/**' - pull_request: - paths: - - 'src/Symfony/Bridge/PhpUnit/**' + push: + paths: + - 'src/Symfony/Bridge/PhpUnit/**' + pull_request: + paths: + - 'src/Symfony/Bridge/PhpUnit/**' + +defaults: + run: + shell: bash jobs: + lint: + name: Lint + runs-on: ubuntu-latest - lint: - name: Lint - runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 - steps: - - name: Checkout - uses: actions/checkout@v2 + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + coverage: "none" + php-version: "5.5" - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - coverage: "none" - php-version: "5.5" - - - name: Lint - run: find ./src/Symfony/Bridge/PhpUnit -name '*.php' | grep -v -e /Tests/ -e ForV6 -e ForV7 -e ForV8 -e ForV9 -e ConstraintLogicTrait | parallel -j 4 php -l {} + - name: Lint + run: find ./src/Symfony/Bridge/PhpUnit -name '*.php' | grep -v -e /Tests/ -e ForV6 -e ForV7 -e ForV8 -e ForV9 -e ConstraintLogicTrait | parallel -j 4 php -l {} diff --git a/.github/workflows/psalm.yml b/.github/workflows/psalm.yml index 11027c374e..4c15203380 100644 --- a/.github/workflows/psalm.yml +++ b/.github/workflows/psalm.yml @@ -3,6 +3,10 @@ name: Static analysis on: pull_request: ~ +defaults: + run: + shell: bash + jobs: psalm: name: Psalm @@ -17,81 +21,38 @@ jobs: ini-values: "memory_limit=-1" coverage: none - - name: Checkout PR - uses: actions/checkout@v2 - with: - path: pr - - - name: Checkout base + - name: Checkout target branch uses: actions/checkout@v2 with: ref: ${{ github.base_ref }} - path: base + + - name: Checkout PR + uses: actions/checkout@v2 - name: Configure composer run: | - cd base - COMPOSER_HOME="$(composer config home)" - ([ -d "$COMPOSER_HOME" ] || mkdir "$COMPOSER_HOME") && cp .github/composer-config.json "$COMPOSER_HOME/config.json" - echo "COMPOSER_ROOT_VERSION=$(grep -m1 SYMFONY_VERSION .travis.yml | grep -o '[0-9.x]*').x-dev" >> $GITHUB_ENV - - - name: Determine composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: composer-${{ github.base_ref }} - restore-keys: composer- + COMPOSER_HOME="$(composer config home)" + ([ -d "$COMPOSER_HOME" ] || mkdir "$COMPOSER_HOME") && cp .github/composer-config.json "$COMPOSER_HOME/config.json" + echo "COMPOSER_ROOT_VERSION=$(grep -m1 SYMFONY_VERSION .travis.yml | grep -o '[0-9.x]*').x-dev" >> $GITHUB_ENV - name: Install Psalm run: | - composer require psalm/phar - cp ./vendor/bin/psalm.phar base/psalm.phar - cp ./vendor/bin/psalm.phar pr/psalm.phar - - - name: Install dependencies for base - run: | - cd base - echo "::group::modify composer.json" - composer remove symfony/phpunit-bridge --no-interaction --no-update - composer require --no-update phpunit/phpunit php-http/discovery psr/event-dispatcher - echo "::endgroup::" - echo "::group::composer update" - composer update --no-progress --ansi - echo "::endgroup::" + echo "::group::modify composer.json" + composer remove --no-update --no-interaction symfony/phpunit-bridge + composer require --no-update psalm/phar phpunit/phpunit php-http/discovery psr/event-dispatcher + echo "::endgroup::" + echo "::group::composer update" + composer update --no-progress --ansi + git checkout composer.json + echo "::endgroup::" + ./vendor/bin/psalm.phar --version - name: Generate Psalm baseline run: | - cd base - ./psalm.phar --set-baseline=.github/psalm/psalm.baseline.xml --no-progress - - - name: Copy baseline - run: | - cp base/.github/psalm/psalm.baseline.xml pr/.github/psalm/psalm.baseline.xml - - - name: Install dependencies for PR - run: | - cd pr - echo "::group::modify composer.json" - composer remove symfony/phpunit-bridge --no-interaction --no-update - composer require --no-update phpunit/phpunit php-http/discovery psr/event-dispatcher - echo "::endgroup::" - echo "::group::composer update" - composer update --no-progress --ansi - echo "::endgroup::" - - - name: Cache Psalm - uses: actions/cache@v2 - with: - path: pr/.github/psalm/cache/ - key: psalm-${{ github.base_ref }} - restore-keys: psalm- + git checkout -m ${{ github.base_ref }} + ./vendor/bin/psalm.phar --set-baseline=.github/psalm/psalm.baseline.xml --no-progress + git checkout -m FETCH_HEAD - name: Psalm run: | - cd pr - ./psalm.phar --version - ./psalm.phar --output-format=github --no-progress + ./vendor/bin/psalm.phar --output-format=github --no-progress diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b362a1d72a..bdcb488e63 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,190 +1,193 @@ name: Tests on: - push: - pull_request: + push: + pull_request: + +defaults: + run: + shell: bash jobs: + integration: + name: Integration + runs-on: ubuntu-latest - integration: - name: Integration - runs-on: ubuntu-latest + strategy: + matrix: + php: ['7.2', '7.4'] - strategy: - matrix: - php: ['7.2', '7.4'] + services: + postgres: + image: postgres:9.6-alpine + ports: + - 5432:5432 + env: + POSTGRES_PASSWORD: 'password' + ldap: + image: bitnami/openldap + ports: + - 3389:3389 + env: + LDAP_ADMIN_USERNAME: admin + LDAP_ADMIN_PASSWORD: symfony + LDAP_ROOT: dc=symfony,dc=com + LDAP_PORT_NUMBER: 3389 + LDAP_USERS: a + LDAP_PASSWORDS: a + redis: + image: redis:6.0.0 + ports: + - 6379:6379 + redis-cluster: + image: grokzen/redis-cluster:5.0.4 + ports: + - 7000:7000 + - 7001:7001 + - 7002:7002 + - 7003:7003 + - 7004:7004 + - 7005:7005 + - 7006:7006 + env: + STANDALONE: 1 + redis-sentinel: + image: bitnami/redis-sentinel:6.0 + ports: + - 26379:26379 + env: + REDIS_MASTER_HOST: redis + REDIS_MASTER_SET: redis_sentinel + REDIS_SENTINEL_QUORUM: 1 + memcached: + image: memcached:1.6.5 + ports: + - 11211:11211 + rabbitmq: + image: rabbitmq:3.8.3 + ports: + - 5672:5672 + mongodb: + image: mongo + ports: + - 27017:27017 + couchbase: + image: couchbase:6.5.1 + ports: + - 8091:8091 + - 8092:8092 + - 8093:8093 + - 8094:8094 + - 11210:11210 + sqs: + image: asyncaws/testing-sqs + ports: + - 9494:9494 + zookeeper: + image: wurstmeister/zookeeper:3.4.6 + kafka: + image: wurstmeister/kafka:2.12-2.4.1 + ports: + - 9092:9092 + env: + KAFKA_AUTO_CREATE_TOPICS_ENABLE: false + KAFKA_CREATE_TOPICS: 'test-topic:1:1:compact' + KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1 + KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' + KAFKA_ADVERTISED_PORT: 9092 - services: - postgres: - image: postgres:9.6-alpine - ports: - - 5432:5432 - env: - POSTGRES_PASSWORD: 'password' - ldap: - image: bitnami/openldap - ports: - - 3389:3389 - env: - LDAP_ADMIN_USERNAME: admin - LDAP_ADMIN_PASSWORD: symfony - LDAP_ROOT: dc=symfony,dc=com - LDAP_PORT_NUMBER: 3389 - LDAP_USERS: a - LDAP_PASSWORDS: a - redis: - image: redis:6.0.0 - ports: - - 6379:6379 - redis-cluster: - image: grokzen/redis-cluster:5.0.4 - ports: - - 7000:7000 - - 7001:7001 - - 7002:7002 - - 7003:7003 - - 7004:7004 - - 7005:7005 - - 7006:7006 - env: - STANDALONE: 1 - redis-sentinel: - image: bitnami/redis-sentinel:6.0 - ports: - - 26379:26379 - env: - REDIS_MASTER_HOST: redis - REDIS_MASTER_SET: redis_sentinel - REDIS_SENTINEL_QUORUM: 1 - memcached: - image: memcached:1.6.5 - ports: - - 11211:11211 - rabbitmq: - image: rabbitmq:3.8.3 - ports: - - 5672:5672 - mongodb: - image: mongo - ports: - - 27017:27017 - couchbase: - image: couchbase:6.5.1 - ports: - - 8091:8091 - - 8092:8092 - - 8093:8093 - - 8094:8094 - - 11210:11210 - sqs: - image: asyncaws/testing-sqs - ports: - - 9494:9494 - zookeeper: - image: wurstmeister/zookeeper:3.4.6 - kafka: - image: wurstmeister/kafka:2.12-2.4.1 - ports: - - 9092:9092 - env: - KAFKA_AUTO_CREATE_TOPICS_ENABLE: false - KAFKA_CREATE_TOPICS: 'test-topic:1:1:compact' - KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1 - KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' - KAFKA_ADVERTISED_PORT: 9092 + steps: + - name: Checkout + uses: actions/checkout@v2 - steps: - - name: Checkout - uses: actions/checkout@v2 + - name: Install system dependencies + run: | + echo "::group::apt-get update" + sudo apt-get update + echo "::endgroup::" - - name: Install system dependencies - run: | - echo "::group::apt-get update" - sudo apt-get update - echo "::endgroup::" + echo "::group::install tools & libraries" + sudo apt-get install librdkafka-dev + echo "::endgroup::" - echo "::group::install tools & libraries" - sudo apt-get install librdkafka-dev - echo "::endgroup::" + - name: Configure Couchbase + run: | + curl -s -u 'username=Administrator&password=111111' -X POST http://localhost:8091/node/controller/setupServices -d 'services=kv%2Cn1ql%2Cindex%2Cfts' + curl -s -X POST http://localhost:8091/settings/web -d 'username=Administrator&password=111111&port=SAME' + curl -s -u Administrator:111111 -X POST http://localhost:8091/pools/default/buckets -d 'ramQuotaMB=100&bucketType=ephemeral&name=cache' + curl -s -u Administrator:111111 -X POST http://localhost:8091/pools/default -d 'memoryQuota=256' - - name: Configure Couchbase - run: | - curl -s -u 'username=Administrator&password=111111' -X POST http://localhost:8091/node/controller/setupServices -d 'services=kv%2Cn1ql%2Cindex%2Cfts' - curl -s -X POST http://localhost:8091/settings/web -d 'username=Administrator&password=111111&port=SAME' - curl -s -u Administrator:111111 -X POST http://localhost:8091/pools/default/buckets -d 'ramQuotaMB=100&bucketType=ephemeral&name=cache' - curl -s -u Administrator:111111 -X POST http://localhost:8091/pools/default -d 'memoryQuota=256' + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + coverage: "none" + extensions: "json,couchbase,memcached,mongodb,redis,rdkafka,xsl,ldap" + ini-values: "memory_limit=-1" + php-version: "${{ matrix.php }}" + tools: pecl - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - coverage: "none" - extensions: "json,couchbase,memcached,mongodb,redis,rdkafka,xsl,ldap" - ini-values: "memory_limit=-1" - php-version: "${{ matrix.php }}" - tools: pecl + - name: Display versions + run: | + php -r 'foreach (get_loaded_extensions() as $extension) echo $extension . " " . phpversion($extension) . PHP_EOL;' + php -i - - name: Display versions - run: | - php -r 'foreach (get_loaded_extensions() as $extension) echo $extension . " " . phpversion($extension) . PHP_EOL;' - php -i + - name: Load fixtures + uses: docker://bitnami/openldap + with: + entrypoint: /bin/bash + args: -c "(/opt/bitnami/openldap/bin/ldapwhoami -h localhost:3389 -D cn=admin,dc=symfony,dc=com -w symfony||sleep 5) && /opt/bitnami/openldap/bin/ldapadd -h ldap:3389 -D cn=admin,dc=symfony,dc=com -w symfony -f src/Symfony/Component/Ldap/Tests/Fixtures/data/fixtures.ldif && /opt/bitnami/openldap/bin/ldapdelete -h ldap:3389 -D cn=admin,dc=symfony,dc=com -w symfony cn=a,ou=users,dc=symfony,dc=com" - - name: Load fixtures - uses: docker://bitnami/openldap - with: - entrypoint: /bin/bash - args: -c "(/opt/bitnami/openldap/bin/ldapwhoami -h localhost:3389 -D cn=admin,dc=symfony,dc=com -w symfony||sleep 5) && /opt/bitnami/openldap/bin/ldapadd -h ldap:3389 -D cn=admin,dc=symfony,dc=com -w symfony -f src/Symfony/Component/Ldap/Tests/Fixtures/data/fixtures.ldif && /opt/bitnami/openldap/bin/ldapdelete -h ldap:3389 -D cn=admin,dc=symfony,dc=com -w symfony cn=a,ou=users,dc=symfony,dc=com" + - name: Configure composer + run: | + COMPOSER_HOME="$(composer config home)" + composer self-update + ([ -d "$COMPOSER_HOME" ] || mkdir "$COMPOSER_HOME") && cp .github/composer-config.json "$COMPOSER_HOME/config.json" + echo "COMPOSER_ROOT_VERSION=$(grep -m1 SYMFONY_VERSION .travis.yml | grep -o '[0-9.x]*').x-dev" >> $GITHUB_ENV - - name: Configure composer - run: | - COMPOSER_HOME="$(composer config home)" - composer self-update - ([ -d "$COMPOSER_HOME" ] || mkdir "$COMPOSER_HOME") && cp .github/composer-config.json "$COMPOSER_HOME/config.json" - echo "COMPOSER_ROOT_VERSION=$(grep -m1 SYMFONY_VERSION .travis.yml | grep -o '[0-9.x]*').x-dev" >> $GITHUB_ENV + - name: Determine composer cache directory + id: composer-cache + run: echo "::set-output name=directory::$(composer config cache-dir)" - - name: Determine composer cache directory - id: composer-cache - run: echo "::set-output name=directory::$(composer config cache-dir)" + - name: Cache composer dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.directory }} + key: ${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ matrix.php }}-composer- - - name: Cache composer dependencies - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.directory }} - key: ${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ matrix.php }}-composer- + - name: Install dependencies + run: | + echo "::group::composer update" + composer require --dev --no-update mongodb/mongodb:@stable + composer update --no-progress --ansi + echo "::endgroup::" + echo "::group::install phpunit" + ./phpunit install + echo "::endgroup::" - - name: Install dependencies - run: | - echo "::group::composer update" - composer require --dev --no-update mongodb/mongodb:@stable - composer update --no-progress --ansi - echo "::endgroup::" - echo "::group::install phpunit" - ./phpunit install - echo "::endgroup::" + - name: Run tests + run: ./phpunit --group integration -v + env: + REDIS_HOST: localhost + REDIS_CLUSTER_HOSTS: 'localhost:7000 localhost:7001 localhost:7002 localhost:7003 localhost:7004 localhost:7005' + REDIS_SENTINEL_HOSTS: 'localhost:26379' + REDIS_SENTINEL_SERVICE: redis_sentinel + MESSENGER_REDIS_DSN: redis://127.0.0.1:7006/messages + MESSENGER_AMQP_DSN: amqp://localhost/%2f/messages + MESSENGER_SQS_DSN: "sqs://localhost:9494/messages?sslmode=disable&poll_timeout=0.01" + MESSENGER_SQS_FIFO_QUEUE_DSN: "sqs://localhost:9494/messages.fifo?sslmode=disable&poll_timeout=0.01" + MEMCACHED_HOST: localhost + LDAP_HOST: localhost + LDAP_PORT: 3389 + MONGODB_HOST: localhost + KAFKA_BROKER: 127.0.0.1:9092 + POSTGRES_HOST: localhost - - name: Run tests - run: ./phpunit --group integration -v - env: - REDIS_HOST: localhost - REDIS_CLUSTER_HOSTS: 'localhost:7000 localhost:7001 localhost:7002 localhost:7003 localhost:7004 localhost:7005' - REDIS_SENTINEL_HOSTS: 'localhost:26379' - REDIS_SENTINEL_SERVICE: redis_sentinel - MESSENGER_REDIS_DSN: redis://127.0.0.1:7006/messages - MESSENGER_AMQP_DSN: amqp://localhost/%2f/messages - MESSENGER_SQS_DSN: "sqs://localhost:9494/messages?sslmode=disable&poll_timeout=0.01" - MESSENGER_SQS_FIFO_QUEUE_DSN: "sqs://localhost:9494/messages.fifo?sslmode=disable&poll_timeout=0.01" - MEMCACHED_HOST: localhost - LDAP_HOST: localhost - LDAP_PORT: 3389 - MONGODB_HOST: localhost - KAFKA_BROKER: 127.0.0.1:9092 - POSTGRES_HOST: localhost - - - name: Run HTTP push tests - if: matrix.php == '7.4' - run: | - [ -d .phpunit ] && mv .phpunit .phpunit.bak - wget -q https://github.com/symfony/binary-utils/releases/download/v0.1/vulcain_0.1.3_Linux_x86_64.tar.gz -O - | tar xz && mv vulcain /usr/local/bin - docker run --rm -e COMPOSER_ROOT_VERSION -v $(pwd):/app -v $(which composer):/usr/local/bin/composer -v /usr/local/bin/vulcain:/usr/local/bin/vulcain -w /app php:7.4-alpine ./phpunit src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php --filter testHttp2Push - sudo rm -rf .phpunit - [ -d .phpunit.bak ] && mv .phpunit.bak .phpunit + - name: Run HTTP push tests + if: matrix.php == '7.4' + run: | + [ -d .phpunit ] && mv .phpunit .phpunit.bak + wget -q https://github.com/symfony/binary-utils/releases/download/v0.1/vulcain_0.1.3_Linux_x86_64.tar.gz -O - | tar xz && mv vulcain /usr/local/bin + docker run --rm -e COMPOSER_ROOT_VERSION -v $(pwd):/app -v $(which composer):/usr/local/bin/composer -v /usr/local/bin/vulcain:/usr/local/bin/vulcain -w /app php:7.4-alpine ./phpunit src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php --filter testHttp2Push + sudo rm -rf .phpunit + [ -d .phpunit.bak ] && mv .phpunit.bak .phpunit diff --git a/src/Symfony/Component/Cache/Adapter/RedisTagAwareAdapter.php b/src/Symfony/Component/Cache/Adapter/RedisTagAwareAdapter.php index 611b318598..d245644e98 100644 --- a/src/Symfony/Component/Cache/Adapter/RedisTagAwareAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/RedisTagAwareAdapter.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Cache\Adapter; use Predis\Connection\Aggregate\ClusterInterface; use Predis\Connection\Aggregate\PredisCluster; +use Predis\Connection\Aggregate\ReplicationInterface; use Predis\Response\Status; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Exception\LogicException; @@ -282,7 +283,14 @@ EOLUA; return $this->redisEvictionPolicy; } - foreach ($this->getHosts() as $host) { + $hosts = $this->getHosts(); + $host = reset($hosts); + if ($host instanceof \Predis\Client && $host->getConnection() instanceof ReplicationInterface) { + // Predis supports info command only on the master in replication environments + $hosts = [$host->getClientFor('master')]; + } + + foreach ($hosts as $host) { $info = $host->info('Memory'); $info = $info['Memory'] ?? $info; diff --git a/src/Symfony/Component/Cache/Traits/RedisTrait.php b/src/Symfony/Component/Cache/Traits/RedisTrait.php index 69eee03c04..67f1042d05 100644 --- a/src/Symfony/Component/Cache/Traits/RedisTrait.php +++ b/src/Symfony/Component/Cache/Traits/RedisTrait.php @@ -14,6 +14,7 @@ namespace Symfony\Component\Cache\Traits; use Predis\Command\Redis\UNLINK; use Predis\Connection\Aggregate\ClusterInterface; use Predis\Connection\Aggregate\RedisCluster; +use Predis\Connection\Aggregate\ReplicationInterface; use Predis\Response\Status; use Symfony\Component\Cache\Exception\CacheException; use Symfony\Component\Cache\Exception\InvalidArgumentException; @@ -368,7 +369,14 @@ trait RedisTrait $evalArgs = [[$namespace], 0]; } - foreach ($this->getHosts() as $host) { + $hosts = $this->getHosts(); + $host = reset($hosts); + if ($host instanceof \Predis\Client && $host->getConnection() instanceof ReplicationInterface) { + // Predis supports info command only on the master in replication environments + $hosts = [$host->getClientFor('master')]; + } + + foreach ($hosts as $host) { if (!isset($namespace[0])) { $cleared = $host->flushDb() && $cleared; continue;