Docker部署Zend Framework 1项目Redis连接适配问题及解决
Docker部署Zend Framework 1项目的Redis连接问题解决
问题背景
有一个基于Zend Framework 1的老旧PHP项目,尝试用Docker部署时遇到Redis连接问题:项目原本默认连接127.0.0.1:6379,但Docker环境中必须使用Redis容器名redis:6379才能正常连接。由于生产环境仍需沿用原有连接方式,不想修改项目核心代码,尝试挂载redis.conf配置文件未解决问题。
现有配置
docker-compose.yml
version: '3' services: nginx: image: nginx ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ../:/var/www/master/eshopy depends_on: - php - mysql networks: - expando_network php: build: ./ image: php-8.1-expando container_name: php-8.1-expando ports: - "9000:9000" volumes: - ../:/var/www/master/eshopy - ./php.ini:/usr/local/etc/php/php.ini - ../../library:/var/www/master/library - ../library/vendor:/var/www/master/eshopy/vendor - ../frontend/library:/var/www/master/eshopy/frontend/library - ../admin/library:/var/www/master/eshopy/admin/library depends_on: - mysql - redis networks: - expando_network mysql: image: mariadb:10.11.5 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: eshopy MYSQL_USER: expando MYSQL_PASSWORD: expando2023 volumes: - ./my-custom.cnf:/etc/mysql/conf.d/my-custom.cnf ports: - "3306:3306" networks: - expando_network elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.1 container_name: elasticsearch environment: - discovery.type=single-node ports: - "9200:9200" depends_on: - php - mysql networks: - expando_network redis: image: 'redis:latest' ports: - "6379:6379" volumes: - ./redis.conf:/usr/local/etc/redis/redis.conf healthcheck: test: redis-cli ping interval: 3s timeout: 5s retries: 5 networks: - expando_network redisinsight: image: 'redislabs/redisinsight:latest' ports: - '8001:8001' depends_on: - redis networks: - expando_network grafana: image: grafana/grafana container_name: grafana ports: - "3000:3000" depends_on: - php - mysql - nginx - elasticsearch - redis networks: - expando_network adminer: image: adminer ports: - "8080:8080" depends_on: - mysql networks: - expando_network phpmyadmin: image: phpmyadmin/phpmyadmin environment: PMA_HOST: mysql PMA_PORT: 3306 UPLOAD_LIMIT: 300M ports: - "8181:80" depends_on: - mysql volumes: - ./php.ini:/usr/local/etc/php/conf.d/php.ini networks: - expando_network networks: elastic: driver: bridge expando_network: driver: bridge
redis.conf
bind 127.0.0.1 port 6379
PHP Redis调用代码
public function __construct($extLoaded) { $this->extLoaded = $extLoaded; if ($extLoaded) { $this->redis = new Redis(); $this->redis->connect('127.0.0.1', 6379); //not work $this->redis->connect('redis', 6379); //work } }
可行解决方案
步骤1:修改Nginx配置
在Nginx的fastcgi配置中添加环境变量参数:
fastcgi_param PLATFORM docker;
步骤2:调整PHP代码的连接逻辑
在Redis初始化的代码中添加环境判断分支,实现环境自适应连接:
if (getenv('PLATFORM') == 'docker') { $this->redis->connect('redis', 6379); } else { $this->redis->connect('127.0.0.1', 6379); }
内容的提问来源于stack exchange,提问作者Dan Rais
相关产品推荐
相关产品推荐

