Я отлаживал некоторые запросы Soap, которые мы делаем между двумя серверами в одной VLAN. Приложение на одном сервере написано на PHP, приложение на другом написано на Java. Я могу контролировать и вносить изменения в код PHP, но не могу влиять на сервер Java. Приложение PHP формирует XML с использованием объектов DOMDocument, а затем отправляет запрос с использованием расширения cURL.
Когда запрос на мыло длится более 5 минут, он всегда будет ждать, пока не истечет максимальное время ожидания, и завершится с сообщением, подобным этому:
Тайм-аут операции после 900000 миллисекунд с получением 0 байтов
После перехвата отправляемых пакетов выясняется, что проблема была вызвана 5-минутным таймаутом в сети, которая закрывала то, что считалось устаревшим соединением. Было два способа исправить это: увеличить время ожидания в iptables или начать отправку пакетов KeepAlive по запросу.
Если быть точным, я хотел бы реализовать оба решения. Сократить время ожидания было легко для ops, но отправка пакетов KeepAlive оказывается сложной. Сама библиотека cURL поддерживает это (см. Флаг - keepalive-time для приложения CLI), но не похоже, что это было реализовано в PHP cURL library . Я даже проверил источник, чтобы убедиться, что это не недокументированная функция.
Итак, мой вопрос таков: Как, черт возьми, я могу отправлять эти пакеты? Я вижу несколько четких вариантов, но мне не нравится ни один из них:
- Напишите оболочку, которая будет запускать запрос с помощью shell_exec в приложении CLI. Это хак, который мне просто не нравится
- Обновите расширение cURL для поддержки этого. Это не вариант согласно Ops.
- Открой розетку сам. Я знаю достаточно, чтобы быть опасным. Я также не видел способа сделать это с помощью fsockopen, но я мог что-то упустить.
- Переключиться на другую библиотеку. Что существует, что поддерживает это?
Спасибо за любую помощь, которую вы можете предложить.