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

