Я пытаюсь реализовать API, который использует концепцию длинного опроса в среде Symfony.
Допустим, у меня есть таблица 'фидов', которая может только расти (предположим, что пользователи могут вставлять свои фиды из другого интерфейса).
Я хочу создать обновленную страницу в режиме реального времени на стороне клиента. Идея заключается в следующем:
- Клиент отправляет запрос ajax с отметкой времени последней модификации (отправляет в первый раз 0)
- Сервер сравнивает временную метку клиента с временной меткой, чтобы извлечь все сообщения с большей временной меткой, чем та, которую отправил пользователь
- Если есть новые сообщения, немедленно верните их клиенту с отметкой времени последнего
С другой стороны, если нет новых сообщений, введите 2 минуты цикл ожидания-ожидания , проверяя каждые 1-3 секунды (произвольно), есть ли новые сообщения.
- Когда клиент получает ответ от сервера, браузер обновляется и немедленно отправляет новый запрос ajax.
Другими словами, вместо того, чтобы отправлять вызов AJAX каждые x секунд, сервер удерживает запрос, пока не получит новую информацию для нас.
Имея хороший опыт работы с Symfony, я попытался реализовать простую демонстрацию этого API, и она прекрасно работает. У меня была проблема с блокировкой сеанса (вызов ajax удерживается, поэтому доступ к серверу невозможен), поэтому я просто добавил к действию следующее:
public function executeIndex(sfWebRequest $request)
{
session_write_close();
:
:
(см. Также эту ссылку )
Затем я тестирую массивный доступ к API. 100 пользователей работает нормально, 1000 все вылетает.
Я понял, что у меня есть две проблемы:
- Для каждого доступа открывается новое соединение с БД
- Для каждого доступа сервер выполняет новый процесс
Для первой проблемы, которую я попытался поместить persistent: true
в моем коннекторе Doctrine для database.yml. Когда я наблюдал за соединениями с сервером, я видел, что каждый раз при доступе к API открывается новое соединение. Так что в основном я все еще заблокирован теми же двумя проблемами.
У кого-нибудь есть идеи или опыт с этим вопросом? Или, может быть, я должен отказаться от идеи реализации моего API с Symfony ??