Принудительный чат-бот, созданный с помощью JAXL/XMPPHP, переподключается при отключении
Я использую библиотеку JAXL для реализации бота чата jabber, написанного на php, который затем запускается как фоновый процесс с использованием PHP CLI.
Все работает довольно хорошо, но мне было трудно понять, как заставить чат-бот переподключиться после отключения!
Я замечаю, что когда я оставляю его на ночь, иногда он падает и не возвращается. Я экспериментировал с $jaxl->connect() и $jaxl->startStream() и $jaxl->startCore() после перехвата jaxl_post_disconnect, но я думаю, что что-то упустил.
3 ответа
Одним из решений было бы проверить ваше соединение:
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.
Хоп это поможет вам немного.:)
Если вы используете Jaxl v3.x, все, что вам нужно, это добавить обратный вызов для on_disconnect
событие
Также вы должны использовать XEP-0199 XMPP Ping. Этот XEP будет периодически отправлять эхо-запросы XMPP на подключенный jabber-сервер. Он также будет получать запросы сервера и отправлять обратно требуемый пакет понга (например, если ваш клиент не отвечает на запросы сервера, через некоторое время jabber.org прервет ваше соединение).
Наконец, вы ДОЛЖНЫ также использовать пробелы. Пропуск пробелов - это один пробел, отправляемый на сервер. Этого часто достаточно, чтобы устройства NAT считали соединение "живым", а также для определенных серверов Jabber, например, Openfire. Это может также заставить ОС быстрее обнаруживать потерянное соединение - TCP-соединение, по которому не отправляются и не принимаются данные, неотличимо от потерянного соединения.
В итоге я создал crontab, который просто снова выполнил скрипт PHP.
В скрипте PHP я читаю определенный файл для pid последнего форка. Если он существует, скрипт пытается его убить. Затем скрипт использует pcntl_fork() для разветвления процесса (что в любом случае полезно для демонизации PHP-скрипта) и записи нового PID в файл. Затем вилка входит в Jabber с JAXL в обычном режиме.
После разговора с автором JAXL стало ясно, что это будет самый простой способ сделать это, несмотря на то, что он хакерский. Автор, возможно, работал над этим конкретным недостатком в более поздних итерациях, однако.
Одним из недостатков этого конкретного метода является то, что он требует pcntl_fork(), который не компилируется с PHP по умолчанию.