Принудительный чат-бот, созданный с помощью JAXL / XMPPHP, переподключается при отключении - PullRequest
1 голос
/ 28 января 2012

Я использую библиотеку JAXL для реализации бота чата jabber, написанного на php, который затем запускается как фоновый процесс с использованием PHP CLI.

Все работает довольно хорошо, но у меня былотрудно понять, как заставить чат-бота снова подключиться при отключении!

Я замечаю, что когда я оставляю его включенным на ночь, иногда он падает и не возвращается.Я экспериментировал с $ jaxl-> connect () и $ jaxl-> startStream () и $ jaxl-> startCore () после перехвата jaxl_post_disconnect, но я думаю, что что-то упустил.

Ответы [ 3 ]

1 голос
/ 05 августа 2012

Если вы используете Jaxl v3.x, все, что вам нужно, это добавить обратный вызов для on_disconnect события .

Также вы должны использовать XEP-0199 XMPP Ping . Этот XEP будет периодически отправлять эхо-запросы XMPP на подключенный jabber-сервер. Он также будет получать запросы сервера и отправлять обратно требуемый пакет pong (например, если ваш клиент не отвечает на запросы сервера, через некоторое время jabber.org прервет ваше соединение).

Наконец, вы ДОЛЖНЫ также использовать пробелы для пробелов. Пропуск пробелов - это один пробел, отправляемый на сервер. Этого часто достаточно, чтобы устройства NAT считали соединение «живым», а также для определенных серверов Jabber, например, Открытый огонь. Это также может заставить ОС быстрее обнаруживать потерянное соединение - TCP-соединение, по которому не отправляются и не принимаются данные, неотличимо от потерянного соединения.

1 голос
/ 28 января 2012

Одним из решений было бы проверить ваше соединение:

1) making a "ping" request to your page/controller or whatever
2) setTimeout(functionAjaxPing(), 10000);
3) then read the Ajax response and if == "anyStringKey" then your connection works find
4) else: reconnect() / errorMessage() / whatEver()

Это то, что я думаю, использует IRC-чат.

Но это будет генерировать больше трафика, так как запрос ping / ping будетНужно.

Хоп, это поможет вам немного.:)

0 голосов
/ 02 августа 2012

В итоге я создал crontab, который просто снова выполнил PHP-скрипт.

В скрипте PHP я читаю определенный файл для pid последнего форка. Если он существует, скрипт пытается его убить. Затем скрипт использует pcntl_fork () для разветвления процесса (что в любом случае полезно для демонизации PHP-скрипта) и записи нового PID в файл. Затем вилка входит в Jabber с JAXL в обычном режиме.

После разговора с автором JAXL стало очевидно, что это будет самый простой способ сделать это, несмотря на то, что он хакерский. Автор, возможно, работал над этим конкретным недостатком в более поздних итерациях, однако.

Один недостаток этого конкретного метода в том, что он требует pcntl_fork (), который по умолчанию не компилируется с PHP.

...