views:

27

answers:

1

Current scenario:

I'm using the gmail oauth api to receive emails on a page. It's slow to load many, so I want to post each email on the page as it loads giving the user a chance to do other things on the site while the emails are still loading.

There are a few files required

require_once 'common.php';
require_once 'Zend/Oauth/Consumer.php';
require_once 'Zend/Crypt/Rsa/Key/Private.php'; 
require_once 'Zend/Mail/Protocol/Imap.php';
require_once 'Zend/Mail/Storage/Imap.php';
require_once 'Zend/Mail.php';

And a few functions on the main page that helps the php run. I am familiar with using the ajax call on jquery to call an external php file. I would like to be able instantiate php code on this page to function using ajax functionality so I don't need to worry about calling these required files and functions each time I check a new email. Is there a way to do this?

  for ($i = $storage->countMessages(); $i >= ($storage->countMessages()-30); $i-- ){ 
 { 
  echo '<li>' . $storage->getMessage($i)->subject . '</li>'; 
 }

  } 

Is the function I would like to function on the fly and return each subject one at a time to load on the screen. I assume I'll need to create a for loop using javascript, but the main issue is being able to use the php on the page so that I don't have to recall the includes each time. Maybe I'm curious about changing the scope of these variables, maybe the solution is being able to operate the ajax from this page without an external script - I'm not sure, but any help would be appreciated.

A: 

Firstly, don't worry about the performance of 6 includes. This something you start to worry about when your site is getting massive. Having said that, utilizing an opcode cache such as APC can reduce the performance cost of including large numbers of files.

To your question: every request to PHP is it's own entity and cannot reference code included in another request. Your original request and each subsequent AJAX request are all separate and distinct requests that know nothing of each other and will all require PHP to load all files to load emails.

I suggest you look at other ways to improve performance. Given loading emails from gmail is slow, perhaps you could investigate using a daemon (a service that runs continually in the background on your server) that synchronizes the emails into a database. Your page can then just get everything it needs from the database which will be much faster for the user. You can use AJAX to check the database periodically for new data. Meanwhile your daemon will be doing the hard-work in the background.

rojoca
Thanks - will this be difficult since I'm using oauth to receive access? Don't I lose access once a user logs out of my site? - also, I'm more concerned about user's first time logins - I really only want to sort through 3000 emails to look for certain text strings.
Bob Cavezza
You could still kick off a process from the initial request that runs in the background and stores results in the database. That process would basically do the `foreach(/*...*/)`. You could even check the messages for the strings you need and only save emails to the db that you care about.
rojoca