2013-03-04 1 views
2

Мне нужно настроить постоянное соединение сокетов в PHP и не знать, как этого добиться. В настоящее время, когда я отправляю SMS-сообщение, я: а) откройте соединение сокета; b) отправьте сообщение (через SMS/SMPP) и c) закройте соединение сокетаПостоянный сокет/соединение PHP для SMPP/SMS

Однако мне не нужно открывать и закрывать соединение все время. Скорее всего, я требую

- 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. 

UPDATE: Было интересно, если кто-то достиг выше, используя следующие: https://github.com/shaneharter/PHP-Daemon

+0

http://php.net/manual/en/function.shm-put-var.php В комментариях об этом хорошо читают. – sinni800

+0

У меня есть эти требования в этом проекте: https://github.com/nimf/phpesme/ У нас есть вид скрипта сторожевого таймера, который гарантирует, что процессы rx, tx и обработчика всегда работают и будут перезапущены при выходе. –

+0

спасибо Юрию. Несколько недель назад я бы серьезно рассмотрел такие решения, как тот, на который вы предоставили ссылку. Однако в последние недели я обновил все PHP/SMPP до Java/SMPP и не оглянулся назад :-) – user1746582

ответ

1

Функция pfsockopen, кажется, есть возможности, которые вы ищете. Проверьте этот вопрос - PHP pfsockopen in a session.

Личное наблюдение за вашей реализацией. Я предполагаю, что PHP-код будет вызван входящим запросом, и все остальные времена клиент SMPP будет неактивным. Это может быть неприемлемо для SMPP по нескольким причинам:

  • Клиенты SMPP должны отправлять ответные блоки PDU для всех входящих PDU, которые они получают из SMSC.
  • Один из этих PDU (-ов) - enquire_link, который используется для поддержания соединения в активном режиме. Если клиент SMPP не сможет вернуть PDU enquire_link_resp, соединение будет удалено. Вы можете столкнуться с этим. Использование pfsockopen не решит эту проблему.
  • Если вы хотите предоставить подтверждение о доставке, клиент SMPP должен ответить на SMSC.
  • Если клиент SMPP не отправляет ответный блок PDU для PDU, он получает для SMSC (если он считывает байты из канала), SMSC может повторно отправить некоторые из этих PDU (ов). Это открывает возможные риски для создания ненужного попадания на клиентскую машину SMPP.
+0

благодарит за ваши комментарии. Я знаю о pfsockopen, а также о требованиях SMPP. Я заметил эту ссылку, которая поддерживает создание длинных серверных процессов в PHP: https://github.com/shaneharter/PHP-Daemon. Заинтересовайтесь в своих мыслях по этому поводу. – user1746582

+0

Я решил эту проблему с Java, но не с PHP. На работе мы используем один поток для каждой привязки. Каждый поток занят ожиданием входящих байтовых потоков и отвечает на все входящие PDU. С PHP-Daemon (отказ от ответственности: я не использовал его), вы можете циклически и добиться того же результата; вы можете обнаружить сброшенные соединения и восстановить их. Это может не сработать, когда клиент SMPP должен отправить enquire_link (или нужно сделать некоторые проактивные вещи). Для этого вам может понадобиться отдельный поток. Возможно, http://tinyurl.com/cyxclfx может предоставить дополнительную информацию. –

+0

Интересно, что вы упоминаете Java. Я прихожу к пониманию, что PHP, пытающийся справиться с этим, будет беспорядочным.вы когда-нибудь видели или использовали CloudHopper Twitter? Поскольку мы знаем Java, мы сейчас рассматриваем возможность использования этого для удовлетворения моих требований выше. Хотя не может найти никакой документации по методам, кроме приведенных примеров. Если вы разместите свой комментарий, предлагая, как вы решили мою проблему в Java, я могу принять его как ответ :) – user1746582

 Смежные вопросы

  • Нет связанных вопросов^_^