MacOS浏览器运行SendGrid PHP脚本报ERR_EMPTY_RESPONSE错误
问题现象
本地浏览器访问localhost上部署的SendGrid发信PHP脚本时失败,返回空响应;相同代码部署到远程Web服务器可正常通过浏览器访问。
测试代码
测试用index.php代码如下:
require 'vendor/autoload.php'; $email = new \SendGrid\Mail\Mail(); $email->setFrom("test@example.com", "Example User"); $email->setSubject("Sending with Twilio SendGrid is Fun"); $email->addTo("test@example.com", "Example User"); $email->addContent("text/plain", "and easy to do anywhere, even with PHP"); $email->addContent( "text/html", "<strong>and easy to do anywhere, even with PHP</strong>" ); $sendgrid = new \SendGrid('SENDGRID_API_KEY'); try { $response = $sendgrid->send($email); print $response->statusCode() . "\n"; print_r($response->headers()); print $response->body() . "\n"; } catch (Exception $e) { echo 'Caught exception: '. $e->getMessage() ."\n"; }
已确认测试结果
- 终端执行
php index.php命令,脚本可正常运行,发信功能无异常 - 本地任意浏览器访问脚本对应localhost地址时页面加载失败,报错信息如下:
This page isn’t working localhost didn’t send any data. ERR_EMPTY_RESPONSE
本地环境信息
- 操作系统:MacOS Big Sur
- 服务组件:httpd、mariadb、PHP 8.1均通过Homebrew安装,localhost上部署的其他普通PHP应用可正常访问
已尝试排查操作
- 先后两次重装Apache与PHP
- 切换至PHP 7版本测试脚本,问题仍复现
排查思路与解决方案
按以下顺序逐步排查,不需要优先重装服务:
- 先查Apache错误日志,不要盲测
Homebrew安装的httpd错误日志默认路径:- Intel芯片Mac:
/usr/local/var/log/httpd/error_log - M系列芯片Mac:
/opt/homebrew/var/log/httpd/error_log
直接翻访问对应脚本时间点的最新日志,空响应类问题90%会在这里直接打出PHP fatal error、模块加载失败、权限拒绝的明确报错,排查效率远高于反复重装组件。
- Intel芯片Mac:
- 校验CLI与Apache模式下的PHP环境差异
终端跑PHP用的是当前登录用户权限、加载CLI专属php.ini配置;Apache跑PHP用的是服务运行用户(通常是daemon或_www)权限、加载Apache专属php.ini配置,两边环境不一致是这类问题的核心诱因:- 新建测试脚本写入
<?php phpinfo();,放到web根目录用浏览器访问,确认Apache模式下已正常加载curl、openssl扩展——SendGrid SDK发请求强依赖这两个扩展,CLI下加载不代表Apache模式下加载。 - 对照终端执行
php --ini输出的加载配置,检查Apache模式下php.ini的curl.cainfo、openssl.cafile配置项:Homebrew安装的PHP经常出现CLI模式能自动识别系统CA证书、Apache模式下找不到证书导致HTTPS请求直接挂死、无返回内容的问题,直接给这两个配置项指定有效证书路径即可,证书文件一般在Homebrew安装的ca-certificates目录下,对应路径为/usr/local/etc/ca-certificates/cert.pem(Intel芯片)或/opt/homebrew/etc/ca-certificates/cert.pem(M系列芯片)。 - 检查Apache运行用户对项目目录、vendor目录的读权限,权限不足时脚本加载SendGrid SDK会直接崩溃,无任何输出返回。
- 新建测试脚本写入
- 核对Apache的PHP解析配置
其他普通PHP脚本能运行不代表当前站点的PHP处理配置正确:- 确认httpd.conf中已加载对应PHP版本的模块,以PHP8.1为例,配置项应为
LoadModule php_module /usr/local/opt/php@8.1/lib/httpd/modules/libphp.so,路径需和本地实际安装路径一致。 - 确认web根目录配置中包含
SetHandler application/x-httpd-php规则,否则.php文件不会被PHP引擎解析。 - 检查是否配置了
open_basedir限制,如果限制的访问路径未包含vendor目录、系统临时目录、CA证书路径,脚本运行到发请求环节会直接中断,返回空响应。
- 确认httpd.conf中已加载对应PHP版本的模块,以PHP8.1为例,配置项应为
- 快速隔离问题范围
停掉本地httpd服务,在index.php所在目录执行php -S localhost:8000启动PHP内置开发服务器,浏览器访问http://localhost:8000,如果脚本能正常执行,说明代码、SendGrid SDK本身没有问题,故障点完全在Apache与PHP的对接配置上,不需要再排查代码逻辑。
内容的提问来源于stack exchange,提问作者Ezequiel Villarreal
相关产品推荐
相关产品推荐

