GitHub Pages前端无法与Heroku PHP后端交互且报H10崩溃错误如何解决
1. Procfile配置错误(核心触发H10的原因)
你当前的Procfile定义的是worker类型进程,这类进程仅用于跑后台常驻任务,不会处理Heroku路由转发的HTTP请求。Heroku要求接收外部HTTP请求的服务必须定义为web类型进程,同时PHP生产环境Web应用不能直接用PHP CLI单文件运行监听端口,CLI模式没有完整的HTTP服务处理能力,也不会被Heroku路由层识别。
你需要把Procfile内容替换为官方推荐的Web服务启动配置:
# 使用Apache托管 web: heroku-php-apache2
如果偏好Nginx,可替换为:
# 使用Nginx托管 web: heroku-php-nginx
仅做测试临时使用的话,也可以改成PHP内置服务器的启动命令(生产环境不推荐,性能和稳定性不足):
web: php -S 0.0.0.0:$PORT index.php
修改后重新部署,Heroku就会启动可接收HTTP请求的Web进程。
2. 代码潜在异常导致进程崩溃
你的代码没有做参数校验,当POST请求缺少action、paymentId、client_URL等必要参数时,会触发PHP的Undefined array key警告,如果开启了PHP错误抛出规则,会直接导致进程异常退出触发H10错误,建议补充参数校验逻辑:
<?php // 最顶部新增参数校验 if (!isset($_POST['action'], $_POST['paymentId'], $_POST['client_URL'])) { http_response_code(400); echo json_encode(['error' => '缺少必要请求参数']); exit; } $apps = [ 'auth_app1' => 'Key <api_key>', 'auth_app2' => 'Key <api_key>', 'auth_app3' => 'Key <api_key>', 'auth_app4' => 'Key <api_key>' ]; if (!isset($apps[$_POST['client_URL']])) { http_response_code(403); echo json_encode(['error' => '无访问权限']); exit; } // 后面接你原有业务逻辑
3. 补充扩展依赖声明
你的代码用到了curl扩展,需要在composer.json里显式声明依赖,避免Heroku的PHP运行环境默认未开启对应扩展:
在composer.json的require节点新增一行:
"ext-curl": "*"
更新后重新生成composer.lock文件再部署即可。
4. 部署后验证
部署完成后可通过Heroku CLI运行heroku logs --tail查看实时运行日志,确认Web进程启动无报错后,先使用接口测试工具模拟POST请求验证接口返回是否符合预期,再对接前端测试。
内容的提问来源于stack exchange,提问作者Oliver Crockett

