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

使用laravel-smpp发送短信时出现socket_close参数类型错误如何解决

laravel-smpp socket_close 报错排查解决方案

错误详情:socket_close(): Argument #1 ($socket) must be of type Socket, null given
报错文件:/vendor/php-smpp/php-smpp/sockettransport.class.php

1 排查SMPP连接有效性

  • 首先校验配置项中的SMPP服务端IP、端口、system_id、密码是否填写正确,该报错90%以上是连接未成功建立就触发了关闭逻辑导致。
  • 本地执行telnet [SMPP服务端IP] [端口]测试连通性,若无法连通,先确认服务器出口IP是否在SMPP服务商白名单、服务商SMPP服务是否正常运行。

2 检查代码执行逻辑

  • 确认调用逻辑严格遵循「连接→绑定→发信→关闭」的顺序,且前置操作失败时不会直接执行关闭方法,标准调用示例如下:
// 必须先执行连接、绑定,且校验绑定结果
Smpp::connect();
if (Smpp::bind()) {
    Smpp::sendSms($recevierNumber, $smsContent);
}
Smpp::close();
  • 禁止跳过connect、bind的成功判断直接调用close方法。

3 修复底层库边界判断缺陷

如果上述两步排查无问题,属于php-smpp底层库未做空判断的已知缺陷,直接修改sockettransport.class.php中的close方法逻辑即可:

// 原代码
socket_close($this->socket);

// 替换为
if ($this->socket instanceof \Socket) {
    socket_close($this->socket);
    $this->socket = null;
}

该修改仅补充空判断逻辑,不会影响原有功能正常运行。

4 偶发报错排查方案

如果是偶发该错误,说明连接被服务端主动断开:

  • 检查SMPP服务商的连接超时规则,在laravel-smpp配置中开启keepalive心跳配置,定期发送存活包维持连接。
  • 发送短信前增加连接状态判断,连接断开时先重连再执行发送逻辑。

内容的提问来源于stack exchange,提问作者Mr.KING

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:36:08