Laravel 5.6+Codeception在Travis CI中遇cURL错误7连接拒绝求助
嘿,这个问题我之前在Travis上跑Laravel验收测试时也踩过坑!大概率是测试启动前Web服务没完全就绪或者端口配置/占用问题导致的,给你几个实用的排查和解决方向:
1. 确保Travis中Web服务完全启动后再跑测试
Travis的环境里,直接启动Web服务就跑测试很容易出现“服务还没起来就发起请求”的情况,这是最常见的原因。你可以在.travis.yml的before_script阶段做两件事:
- 把Web服务后台启动
- 等待服务完全就绪(不要只用
sleep,更靠谱的是用端口检测工具)
举个配置示例:
before_script: # 先杀掉可能占用8888端口的残留进程 - sudo lsof -ti:8888 | xargs kill -9 || true # 启动Laravel内置服务到后台 - php artisan serve --port=8888 > /dev/null 2>&1 & # 用wait-for-it工具等待端口就绪(需要先安装) - npm install -g wait-for-it - wait-for-it 127.0.0.1:8888 -t 10
如果不想装工具,也可以用sleep 10替代,但wait-for-it能更精准地等到服务真的可用,减少随机失败的概率。
2. 核对Codeception验收测试的端口配置
打开你的tests/acceptance.suite.yml,确认PhpBrowser(或WebDriver)模块的url和你启动的服务端口完全一致:
actor: AcceptanceTester modules: enabled: - PhpBrowser: url: http://127.0.0.1:8888 - \Helper\Acceptance
要是这里写的端口和实际启动的服务端口不一样,肯定会出现连接拒绝的错误。
3. 排查Travis环境的端口占用问题
偶尔能正常运行,说明有时候端口是干净的,有时候可能有残留进程占用了8888端口。除了上面配置里的杀进程命令,你还可以在before_script里加个调试命令,看看端口状态:
- netstat -tulpn | grep 8888
这样在Travis的构建日志里就能看到8888端口是否真的被监听,方便定位问题。
4. 尝试换用Codeception内置的Web服务器
如果用php artisan serve还是有问题,试试用Codeception自带的Web服务器配置,在acceptance.suite.yml里启用WebDriver并配置内置服务器:
modules: enabled: - WebDriver: url: http://127.0.0.1:8888 browser: phantomjs port: 4444 - Laravel5: environment_file: .env.testing - \Helper\Acceptance
同时在Travis里启动PhantomJS:
before_script: - phantomjs --webdriver=4444 > /dev/null 2>&1 & - sleep 5
如果以上方法都试过还是有随机失败的情况,建议在Travis构建日志里添加更多调试信息,比如跑测试前先手动curl http://127.0.0.1:8888,看看是否能正常返回页面内容,这样能更快定位到底是服务没起来,还是其他网络问题。
内容的提问来源于stack exchange,提问作者Loyroy

