2013-03-04 63 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