Реализовать API-интерфейс для длинных опросов с Symfony - PullRequest
3 голосов
/ 16 июня 2011

Я пытаюсь реализовать API, который использует концепцию длинного опроса в среде Symfony.

Допустим, у меня есть таблица 'фидов', которая может только расти (предположим, что пользователи могут вставлять свои фиды из другого интерфейса). Я хочу создать обновленную страницу в режиме реального времени на стороне клиента. Идея заключается в следующем:

  1. Клиент отправляет запрос ajax с отметкой времени последней модификации (отправляет в первый раз 0)
  2. Сервер сравнивает временную метку клиента с временной меткой, чтобы извлечь все сообщения с большей временной меткой, чем та, которую отправил пользователь
  3. Если есть новые сообщения, немедленно верните их клиенту с отметкой времени последнего С другой стороны, если нет новых сообщений, введите 2 минуты цикл ожидания-ожидания , проверяя каждые 1-3 секунды (произвольно), есть ли новые сообщения.
  4. Когда клиент получает ответ от сервера, браузер обновляется и немедленно отправляет новый запрос ajax.

Другими словами, вместо того, чтобы отправлять вызов AJAX каждые x секунд, сервер удерживает запрос, пока не получит новую информацию для нас.

Имея хороший опыт работы с Symfony, я попытался реализовать простую демонстрацию этого API, и она прекрасно работает. У меня была проблема с блокировкой сеанса (вызов ajax удерживается, поэтому доступ к серверу невозможен), поэтому я просто добавил к действию следующее:

public function executeIndex(sfWebRequest $request)
{
  session_write_close();
       :
       :

(см. Также эту ссылку )

Затем я тестирую массивный доступ к API. 100 пользователей работает нормально, 1000 все вылетает. Я понял, что у меня есть две проблемы:

  1. Для каждого доступа открывается новое соединение с БД
  2. Для каждого доступа сервер выполняет новый процесс

Для первой проблемы, которую я попытался поместить persistent: true в моем коннекторе Doctrine для database.yml. Когда я наблюдал за соединениями с сервером, я видел, что каждый раз при доступе к API открывается новое соединение. Так что в основном я все еще заблокирован теми же двумя проблемами.

У кого-нибудь есть идеи или опыт с этим вопросом? Или, может быть, я должен отказаться от идеи реализации моего API с Symfony ??

Ответы [ 2 ]

0 голосов
/ 23 марта 2015

Apache создает разные потоки для каждого пользователя, и каждый поток имеет отдельное соединение с базой данных. Вот почему соединение дБ высокие

0 голосов
/ 16 июня 2011

Я думаю, что использование Symfony для этого - неправильный подход.Использование сокетов было бы намного проще.

Например, посмотрите на nodejs или ape-project (комета)

, они оба способны обрабатывать гораздо больше текущих пользователей, чем apache, lighttpd или nginx ...

...