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

PHP中CURL单次请求却重复发送短信的问题及正确实现方法

解决CURL短信重复发送问题的方案

嘿,咱们一步步排查并解决这个重复发送的问题,同时保证输出正常:

1. 先确认代码是否被重复执行

很多时候重复发送不是CURL的问题,而是这段代码所在的脚本被调用了两次——比如用户不小心刷新了页面、表单重复提交、前端AJAX发了两次请求,或者脚本被定时任务重复触发了。

你可以加个简单的日志来验证:

// 在CURL请求前添加日志
file_put_contents('sms_exec_log.txt', date('Y-m-d H:i:s') . " 准备发送短信给 {$mobile}\n", FILE_APPEND);

运行后查看sms_exec_log.txt,如果里面有两条相同时间的记录,那就是代码被执行了两次,这时候要去排查触发脚本的源头(比如给前端加防抖、给表单加防重复提交逻辑)。

2. 检查CURL配置是否会导致重复请求

你的代码结构本身是单次请求,但有些默认配置可能会意外触发多次请求:

  • 比如CURLOPT_FOLLOWLOCATION如果开启,当短信接口返回重定向时,CURL会自动跟随,可能导致两次请求。可以明确关闭它:
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    
  • 另外设置请求超时,避免请求挂起后被系统重复触发:
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 10秒超时
    

3. 修正后的完整代码(带错误处理)

下面是优化后的代码,加上了错误处理和日志,确保单次请求且输出正常:

$message = urlencode($message);
// 用大括号包裹变量,避免字符串拼接问题
$smsurl = "http://{$url}/sendmessage.php?user=matkaon&password={$password}&mobile={$mobile}&message={$message}&sender={$sender}&type=3";

// 记录请求日志
file_put_contents('sms_request_log.txt', date('Y-m-d H:i:s') . " 请求URL: {$smsurl}\n", FILE_APPEND);

$ch = curl_init($smsurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // 禁止重定向
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置超时

$sentsms = curl_exec($ch);

// 检查CURL错误
if (curl_errno($ch)) {
    $error = curl_error($ch);
    file_put_contents('sms_error_log.txt', date('Y-m-d H:i:s') . " CURL错误: {$error}\n", FILE_APPEND);
    $sentsms = "请求失败: {$error}"; // 给前端返回明确的错误信息
}

curl_close($ch);

// 正常输出结果
echo $sentsms;

4. 排查短信服务商接口的问题

如果日志里只有一条请求记录,但短信还是发了两次,那可能是服务商的接口存在重复处理的情况。这时候可以:

  • 在请求里添加一个唯一标识参数,比如$request_id = uniqid();,然后把&request_id={$request_id}拼到URL里,让服务商那边根据这个ID做去重处理。
  • 直接联系服务商技术支持,反馈这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:38:42