【问题标题】:Persistent socket/connection PHP for SMPP/SMS用于 SMPP/SMS 的持久套接字/连接 PHP
【发布时间】:2013-03-04 10:25:10
【问题描述】:

我需要在 PHP 中建立一个持久的套接字连接,但不知道如何实现。目前,当我发送 SMS 消息时,我 a)打开套接字连接 b)发送消息(通过 SMS/SMPP)和 c)关闭套接字连接

但是我不需要一直打开和关闭连接。相反,我需要

- 2 persistent connections that maintains connectivity to an SMSC (SMS centre) and reconnects when a timeout occurs. 
- One persistent connection for reading SMS and one for sending SMS.
- Automatic restart/recovery (i.e. when memory issues arise)
- Automatic looping to act as listener for incoming events such as receiving incoming delivery receipts and sms messages, as well as 'ping' (enquire link) to keep SMPP connection alive.

更新:想知道是否有人使用以下方法实现了上述目标:https://github.com/shaneharter/PHP-Daemon

【问题讨论】:

  • php.net/manual/en/function.shm-put-var.php 在 cmets 中有很好的读物。
  • 我在这个项目中完成了这个要求:github.com/nimf/phpesme我们有一种看门狗脚本,可以确保 rx、tx 和处理程序进程始终运行并在退出时重新启动。
  • 谢谢尤里。几周前,我会认真考虑解决方案,例如您提供链接的解决方案。但是最近几周我已经将所有 PHP/SMPP 升级到 Java/SMPP 并且没有回头 :-)
  • @user1746582 我认为 PHP-Daemon 库非常适合您。我在一些项目中使用过它,从从队列中读取作业并在线处理它们的简单守护程序,到最近使用后台工作者的更复杂的应用程序。 (获取传入的套接字连接,侦听作业请求,然后将其发送给后台工作人员以保持主进程畅通。在没有线程的 PHP 等语言中,这确实是您所希望的最好的)

标签: php sockets daemon smpp persistent-connection


【解决方案1】:

函数pfsockopen 似乎具有您正在寻找的功能。看看这个问题 - PHP pfsockopen in a session

===

对您的实施的个人观察。我假设 PHP 代码将由传入请求触发,而在所有其他时间,SMPP 客户端将处于非活动状态。这可能不太适合 SMPP,原因如下:

  • SMPP 客户端必须针对从 SMSC 收到的所有入站 PDU 发回响应 PDU。
  • 这些 PDU 之一是 enquire_link,用于保持连接处于活动状态。如果 SMPP 客户端未能返回 enquire_link_resp PDU,则连接将被丢弃。你可能会体验到更多这些。使用pfsockopen 不会解决这个问题。
  • 如果您想提供送达确认,SMPP 客户端必须响应 SMSC。
  • 如果 SMPP 客户端未能为它收到的 SMSC PDU 发送响应 PDU(如果它从管道中读取字节),SMSC 可能会重新发送其中一些 PDU。这可能会带来在 SMPP 客户端计算机上产生不必要命中的风险。

【讨论】:

  • 感谢您的反馈。我知道 pfsockopen 和 SMPP 的要求。我注意到这个支持在 PHP 中创建长时间运行的服务器进程的链接:github.com/shaneharter/PHP-Daemon 对你的想法感兴趣。
  • 我已经用 Java 解决了这个问题,但没有用 PHP。在工作中,我们为每个绑定使用一个线程。每个线程都忙于等待传入的字节流并响应所有传入的 PDU。使用 PHP-Daemon(免责声明:我没有使用过),你可以循环并达到相同的结果;您可以检测断开的连接并重新建立它们。在需要 SMPP 客户端发送 enquire_link(或需要做一些主动的事情)的情况下,这可能不起作用。您可能需要单独的线程来执行此操作。或许,tinyurl.com/cyxclfx 可以提供更多信息。
  • 你提到 Java 很有趣。我开始意识到 PHP 试图处理这个会很混乱。您是否有机会看到或使用过 Twitter 的 CloudHopper?正如我们了解 Java 一样,我们现在正在考虑使用它来满足我的上述要求。尽管除了提供的示例之外,找不到任何有关这些方法的文档。如果您发表评论建议您如何在 Java 中解决我的问题,我可能会接受它作为答案:)
  • 在工作中,我们使用自己的实现。我以前用过[Logica](opensmpp.logica.com/introhtml/menu.htm);如果您知道限制,它可以为您工作。我听说过CloudHopper。它由 Twitter 提供支持,并且正在积极维护中。对我来说,这似乎是合乎逻辑的选择。
  • CloudHopper 的例子不多。您可以从Logica Java Test Application 开始。它具有发送/接收/enquire_link/和其他所有内容的完整示例。您可以稍后修改代码以挂钩 CloudHopper 并替换 Logica。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多