2013-03-04 117 views
2

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

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

- 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

+0

http://php.net/manual/en/function.shm-put-var.php这里有一个很好的阅读关于评论。 – sinni800 2013-03-06 09:51:59

+0

我有这个需求在这个项目中完成:https://github.com/nimf/phpesme/我们有一种看门狗脚本,它确保rx,tx和处理程序进程始终运行,并将在退出时重新启动。 – 2013-03-27 07:35:25

+0

谢谢尤里。几周前,我会认真考虑诸如您提供链接的解决方案。然而,最近几周我已将所有PHP/SMPP升级到Java/SMPP,并没有回头看看:-) – user1746582 2013-03-27 15:49:11

回答

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客户端未能发送响应PDU给它收到的SMSC的PDU(如果它从管道读取字节),则SMSC可能会重新发送这些PDU中的一些。这可能会在SMPP客户端机器上创建不必要的命中。
+0

感谢您的反馈。我知道pfsockopen和SMPP的要求。我注意到这个链接支持在PHP中创建长时间运行的服务器进程:https://github.com/shaneharter/PHP-Daemon对此有兴趣。 – user1746582 2013-03-06 09:39:09

+0

我已经用Java解决了这个问题,但没有用PHP解决。在工作中,我们为每个绑定使用一个线程。每个线程都忙于等待传入的字节流并响应所有传入的PDU。使用PHP-Daemon(免责声明:我没有使用它),您可以循环并获得相同的结果;您可以检测丢弃的连接并重新建立连接。这可能不适用于SMPP客户端需要发送enquire_link(或需要执行一些主动内容)的情况。你可能需要单独的线程来做到这一点。也许,http://tinyurl.com/cyxclfx可以提供更多信息。 – 2013-03-06 20:05:13

+0

你提到Java很有趣。我意识到PHP试图解决这个问题会很麻烦。你有没有看过或使用Twitter的CloudHopper?就我们所知道的Java而言,我们现在正在考虑使用它来满足我上面的要求。尽管除了提供的示例之外,找不到任何有关这些方法的文档。如果你把你的评论建议你如何用Java解决我的问题,我可以接受它作为答案:) – user1746582 2013-03-07 08:32:26