EC2 Linux实例STP迁移PHP项目后Composer无法正常工作
PHP项目迁移EC2内网实例后Composer依赖报错解决方法
问题现象
- 原XAMPP环境的PHP项目迁移至内网Linux EC2实例(通过Putty私连访问),STP迁移后多数功能正常,但部分PHP文件调用Composer时触发致命错误,Apache日志信息如下:
PHP Fatal error: Uncaught Error: Failed opening required '/var/www/html/host/public_html/vendor/composer/../ezyang/htmlpurifier/library/HTMLPurifier.composer.php' (include_path='.:/usr/share/php') in /var/www/html/host/public_html/vendor/composer/autoload_real.php:41 Stack trace: #0 /var/www/html/host/public_html/vendor/composer/autoload_real.php(45): {closure}() #1 /var/www/html/host/public_html/vendor/autoload.php(25): ComposerAutoloaderInitc3b80a39a0d2307602d3e5706c8f19a8::getLoader() #2 /var/www/html/host/public_html/accessdata.php(18): require('...') #3 {main} thrown in /var/www/html/host/public_html/vendor/composer/autoload_real.php on line 41, referer: http://host/page1.php - 项目依赖Composer引入PHPOffice实现Excel上传入库功能,执行
composer install时出现超时错误:Failed to download myclabs/php-enum from dist: curl error 28 while downloading https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483: Connection timeout after 10001 ms
核心原因
内网EC2实例无法访问外网的GitHub、Packagist等Composer依赖源,导致composer install无法完整下载依赖包;迁移的vendor目录可能存在文件缺失、权限配置不当的问题,引发PHP自动加载失败。
解决步骤
1. 迁移外网完整的vendor目录
- 在可联网的机器(如原XAMPP环境)中,进入项目根目录执行
composer install,确保所有依赖包下载完成 - 将项目根目录下的
vendor目录打包,通过SCP等内网传输工具上传至EC2实例的/var/www/html/host/public_html/路径下 - 修复目录权限,确保Apache进程可读取:
sudo chown -R apache:apache /var/www/html/host/public_html/vendor sudo chmod -R 755 /var/www/html/host/public_html/vendor
2. 配置内网Composer镜像(可选)
如果内网搭建了私有Composer镜像源,执行以下命令配置:
composer config repo.packagist composer https://内网镜像地址
或直接修改项目根目录的composer.json,添加镜像配置:
"repositories": [ {"type": "composer", "url": "https://内网镜像地址"} ]
3. 手动补全缺失依赖
若仅个别包缺失(如myclabs/php-enum):
- 在可联网机器下载对应版本的包文件(可从GitHub Releases页面获取zip包)
- 解压后将目录放置到
/var/www/html/host/public_html/vendor/myclabs/php-enum下,确保目录结构与Composer自动生成的一致 - 执行以下命令更新自动加载映射:
composer dump-autoload
4. 检查PHP include_path配置
- 编辑PHP配置文件(
php.ini,路径通常为/etc/php/[版本]/apache2/php.ini),确保include_path包含项目vendor目录:include_path = ".:/usr/share/php:/var/www/html/host/public_html/vendor" - 重启Apache服务使配置生效:
sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者Mega
相关产品推荐
相关产品推荐

