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
相关产品推荐
相关产品推荐

