dnagirl
dnagirl

Reputation: 20446

ajax: don't wait for response, but check for it periodically

I have a PHP process that takes a long time to run. I don't want the AJAX process that calls it to wait for it to finish. When the PHP process finishes it will set a field in a database. There should be some kind of AJAX polling call to check on the database field periodically and set a message.

How do I set up a jQuery AJAX call to poll rather than wait? Does the PHP script have to do anything special?

Upvotes: 2

Views: 2472

Answers (4)

stackoverflow
stackoverflow

Reputation: 455

Step 1: The first call to the long running process - Set ignore_user_abort(true); in the PHP script which takes a long time and close the connection.

Step 2: Check if the DB field is updated using the methods suggested.

Upvotes: 2

Chris Lercher
Chris Lercher

Reputation: 37778

Do you mean usual polling (as opposed to long polling)? If yes, maybe this helps: http://jquery-howto.blogspot.com/2009/04/ajax-update-content-every-x-seconds.html

The PHP script would just check the database field, and return true/false immediately.

Upvotes: 0

jpabluz
jpabluz

Reputation: 1312

One quick workaround would be to create another PHP script which you can call that will check for that, since accessing DBs directly thru AJAX's comm method is not a good practice.

  1. Create a PHP file, with the DB check required.
  2. Make it so it will post 'T' or 'F' or something like that
  3. Create a SetInterval('yourfunctionname',100) so you can call the polling script.
  4. If the answer fo that polling is 'T', call your other long-time script.

Upvotes: 0

tvanfosson
tvanfosson

Reputation: 532595

It's easier to have your server-side action, simply respond with a negative response until the value is ready and set up the client-side to repeatedly poll (with setTimeout()) until a positive response is received or a fixed number of failures is observed.

 var timer;
 var count = 0;
 function poll(url) {
      timer = setTimeout(function() {
          $.ajax({
              url: url,
              success: function(data) {
                  if (data.Status) {
                      ...do something...
                  }
                  else {
                     if (++count > 10) {
                       ...failure action...
                     }
                     else {
                         poll(url);
                     }
                  }
              ...other options...
           })
      },5000)
 }

Then on the server side use something that does (pseudocode) ...

 if operation is not complete
     return serialize( { Status : false } )
 else
     data = ....
     data.Status = true
     return serialize(data)
 end

Upvotes: 2

Related Questions