如何在Docker容器内部署Zend Framework 1应用并解决Zend/Application.php找不到的问题
这个错误的核心原因是你的PHP-FPM容器无法访问Zend库文件——当前挂载配置仅把quickstart/public目录挂载到容器中,而Zend库所在的vendor和library目录都未被挂载,同时index.php里的include_path设置在容器环境下无法正确指向库文件。
下面是具体的修复步骤:
1. 修正docker-compose.yml的挂载配置
PHP-FPM需要访问整个quickstart目录(包含application、library)和根目录下的vendor目录,因为Zend库安装在这里。修改docker-compose.yml的php-fpm服务部分:
version: "3.9" services: web: image: nginx:latest ports: - "8080:80" volumes: - ./quickstart/public:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf links: - php-fpm php-fpm: image: php:8-fpm volumes: - ./quickstart:/var/www/quickstart # 挂载整个quickstart目录 - ./vendor:/var/www/vendor # 挂载vendor目录 working_dir: /var/www/quickstart/public # 设置工作目录为public
注意:Nginx只需要
public目录,所以它的挂载保持不变;PHP-FPM需要访问更多目录,因此挂载整个quickstart和vendor。
2. 调整index.php的路径和自动加载逻辑
容器里的路径结构已变化,需要修正quickstart/public/index.php里的路径定义,同时改用Composer的自动加载(更稳定可靠):
<?php // 修正APPLICATION_PATH的路径(工作目录是/var/www/quickstart/public,上级目录为quickstart) defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); // 引入Composer的自动加载文件(容器里vendor目录在/var/www/vendor) require_once realpath(dirname(__FILE__) . '/../../vendor/autoload.php'); // 无需手动设置include_path,Composer的autoload会自动处理依赖路径 /** Zend_Application */ require_once 'Zend/Application.php'; $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $application->bootstrap()->run();
如果不想用Composer的autoload,也可以直接修正include_path指向容器内的Zend库位置:
set_include_path(implode(PATH_SEPARATOR, array( realpath(dirname(__FILE__) . '/../../vendor/shardj/zf1-future'), realpath(APPLICATION_PATH . '/../library'), get_include_path(), )));
3. 修复容器内的软链接问题
你的quickstart/library里的软链接是指向宿主机的../../vendor/shardj/zf1-future,但容器内的路径结构不同,这个软链接会失效。可以直接删除library里的软链接,因为我们已经通过Composer autoload或修正后的include_path指向了正确的Zend库位置。
4. 重启容器应用
执行以下命令重启容器,让所有配置生效:
docker-compose down docker-compose up -d
完成以上步骤后,PHP-FPM就能正确找到Zend/Application.php文件,错误应该会消失。
内容的提问来源于stack exchange,提问作者A.Dumas

