开发者

Implement long-polling API with Symfony

开发者 https://www.devze.com 2023-03-13 14:16 出处:网络
I am trying to implement an API which uses the long-polling concept in Symfony framework. Let\'s say that I have a table \'feeds\' which can only grow (assume that users can insert thier feed from ot

I am trying to implement an API which uses the long-polling concept in Symfony framework.

Let's say that I have a table 'feeds' which can only grow (assume that users can insert thier feed from other interface). I want to create a client-side real-time updated page. The idea is the following:

  1. Client send an ajax request with timestamp of last modification (first time sends 0)
  2. Server compares timestamp of client to timestamp, to retrieve all messages with bigger timestamp than the one sent by user
  3. If there are newer messages, return them immediately to the client, with the timestamp of the latest one On other hand, if there are no new messages, enter into a 2 minutes busy-wait loop, checking every 1-3 seconds (randomly) whether there are new messages.
  4. When client receive servers answer, browser开发者_StackOverflow中文版 updates view and immediately sends a new ajax request.

In other words, instead of send an AJAX call every x seconds, the server holds the request till it has new information for us.

Having good experience with Symfony I tried to implement a simple demo of this api, and it works great. I had a problem of session blocking (the ajax call is held so access to the server is not possible), so I simply added the following to the action:

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

(see also this link)

Then I testes massive access to the API. 100 users works fine, 1000 everything crashes. I realized that I have two problems:

  1. For each access a new DB connection is opened
  2. For each access the server executes a new process

For the first problem I tried to put persistent: true In my database.yml Doctrine connetor. When I monitored the server connections I saw that still each access to the API opens a new connection. So basically I am still blocked with the same two problems.

Does anyone have any idea or experience with this issue?? Or maybe I should give-up the idea of implementing my api with Symfony??


I think using symfony for this, is the wrong approach. Using Sockets would be much easier.

For example have a look at nodejs or ape-project (comet)

they both are able to handle much more current users than apache, lighttpd or nginx...


Apache creating different threads for each user and each thread have a separate database connection. that's why the db connection are high

0

精彩评论

暂无评论...
验证码 换一张
取 消