PHP使用Curl调用FCM发送通知长时间无响应问题求助
PHP FCM推送无响应卡住问题排查方案
- 新增cURL超时配置:你当前代码未设置超时阈值,共享服务器网络波动或出站限制时会导致进程无限挂起。在curl初始化后新增2行配置:
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 连接超时10秒 curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 总请求超时30秒
- 补充cURL错误日志:原有代码未捕获cURL层面的执行错误,无法定位是网络问题还是配置问题。在
curl_exec后新增错误判断逻辑:
$result = curl_exec($ch); if(curl_errno($ch)) { echo 'cURL错误:' . curl_error($ch); } curl_close($ch);
- 排查共享服务器出站限制:国内大部分共享服务器默认屏蔽谷歌服务的出站请求,也有部分主机会禁用443端口的非网页出站请求。如果打印的cURL错误为连接超时、无法解析主机等,说明服务器网络无法访问FCM接口,需更换海外服务器或配置可用代理。
- 校验FCM配置有效性:确认
MY SERVER KEY为Firebase控制台「云消息传递」板块下的服务器密钥,而非Web API密钥或其他配置项;USER_TOKEN为客户端主动上报的有效注册令牌,无效令牌只会导致FCM返回错误码,不会引发请求卡住。
修复后完整代码
$msg = array( "title" => 'TEST', "body" => 'test', "icon" => '/setup/favicn.png' ); $fields = array( 'to' => 'USER_TOKEN', 'data' => $msg // 若需系统通知栏展示,可新增notification字段 // 'notification' => $msg ); $headers = array( 'Authorization: key=' . 'MY SERVER KEY', 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' ); curl_setopt( $ch,CURLOPT_POST, true ); curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers ); curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false ); curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) ); // 新增超时配置 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $result = curl_exec($ch ); // 打印cURL错误 if(curl_errno($ch)) { echo 'cURL执行错误:' . curl_error($ch); } curl_close( $ch ); print_r($result);
内容的提问来源于stack exchange,提问作者Moon Monoar
相关产品推荐
相关产品推荐

