You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用Signal接口时&被转义为&导致请求异常的解决咨询

解决Signal消息发送的URL参数与连接超时问题

问题根源分析

  1. URL参数识别错误:警告里显示的&是PHP输出警告时做的HTML实体转义,但如果实际请求的URL确实包含&,服务器会把&apikey当成一个完整参数名,而非apikey,这就是浏览器提示"Apikey parameter is missing"的核心原因。
  2. 连接超时:file_get_contents默认超时时间较短,若目标服务器响应延迟,就会触发连接超时错误。

解决方案

1. 用http_build_query规范构建URL参数

手动拼接URL容易出现分隔符或编码错误,推荐使用PHP内置的http_build_query函数生成标准查询字符串,它会自动处理参数分隔符(&)和内容编码:

// 整理参数为数组
$params = [
    'phone' => $smsnumber,
    'apikey' => $smsapikey,
    'text' => $message
];

// 生成标准查询字符串,自动用&分隔参数
$queryString = http_build_query($params);
$url = 'https://signal.callmebot.com/signal/send.php?' . $queryString;

// 执行请求
$return = file_get_contents($url);

2. 延长超时时间解决连接超时

给file_get_contents添加上下文配置,延长请求超时时间:

// 创建上下文,设置10秒超时(可根据实际调整)
$context = stream_context_create([
    'http' => [
        'timeout' => 10 // 单位:秒
    ]
]);

// 带上下文执行请求
$return = file_get_contents($url, false, $context);

3. 完整优化代码

$params = [
    'phone' => $smsnumber,
    'apikey' => $smsapikey,
    'text' => $message
];

$queryString = http_build_query($params);
$url = 'https://signal.callmebot.com/signal/send.php?' . $queryString;

$context = stream_context_create([
    'http' => [
        'timeout' => 10
    ]
]);

// 抑制错误输出,后续自行处理
$return = @file_get_contents($url, false, $context);

// 错误判断与日志记录
if ($return === false) {
    error_log('Signal消息发送失败:' . error_get_last()['message']);
}

额外提示

  • 不要直接采信警告信息里的URL格式,PHP会对警告内容做HTML转义,实际请求的URL可通过var_dump($url)查看原始结构。
  • 如果file_get_contents仍不稳定,可改用cURL实现请求,它的配置更灵活,对复杂网络环境兼容性更好。

内容的提问来源于stack exchange,提问作者HeyDJ62

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:03:28