2010-01-14 5 views
0

J'ai une page sur laquelle j'effectue une requête AJAX. Le but de la page est de retourner les en-têtes d'un e-mail, que j'ai bien fonctionner. Le problème est que cela est appelé pour chaque e-mail dans une boîte aux lettres. Ce qui signifie qu'il sera appelé une fois par courrier dans la boîte. La raison pour laquelle ceci est un problème est que le temps d'exécution de la fonction imap_open est d'environ une seconde, donc à chaque fois qu'elle est appelée, elle est exécutée. Y at-il un moyen de faire un appel AJAX qui va retourner l'information comme il est disponible et continuer à exécuter pour empêcher plusieurs appels à une fonction avec un temps d'exécution lent?AJAX renvoie les données avant la fin de l'exécution

Cheers, Gazler.

Répondre

1

Diffusez vos résultats. Entre le chargement de tous les emails et le chargement d'un seul email à la fois, vous pouvez charger les en-têtes et les renvoyer. Tweak ce nombre jusqu'à ce que vous trouviez un bon ajustement entre la réactivité et le contenu.

Le script PHP recevra une demande de gamme dans ce cas comme

emailHeaders.php?start=25&end=50 

Javascript conservera les données d'état et demande en morceaux jusqu'à ce que toutes les données sont chargées. Ou vous pourriez faire quelques trucs sophistiqués tels que créer des politiques côté client sur quand demander des données et quelles données demander.

Le navigateur est un autre goulot d'étranglement car la plupart des navigateurs n'autorisent que 2 connexions sortantes à un moment donné.

1

Il semble que vous deviez traiter autant d'e-mails que ceux reçus à chaque appel. À ce stade, vous pouvez retourner les données pour tous ensemble et les analyser du côté client. Cependant, ce processus ne peut pas durer indéfiniment et le serveur ne peut pas initier le retour de données supplémentaires après la réponse à la demande http, vous devrez donc effectuer des appels ultérieurs pour traiter plus de courriels plus tard.

+0

Merci pour votre réponse, le problème avec ceci est que tous les e-mails devraient être récupérés avant qu'un seul puisse être lu. – Gazler

+0

Dans ce cas, vous avez un dilemme. Vous pouvez traiter un nombre fixe par appel, ou en demander un au départ, puis le reste, ou toute division que vous pouvez imaginer qui produira le résultat le plus souhaitable pour votre application. Vous pouvez même faire deux appels asynchrones simultanés, l'un demandant le premier et l'autre demandant tout. –

+0

Ou vous pouvez utiliser une demande pour chaque message. –

2

Il existe des technologies qui vous permettent de configurer votre serveur et Javascript pour permettre essentiellement "reverse AJAX" (regardez sur Google/Wikipedia pour "comet" ou "reverse AJAX"). Cependant, ce n'est pas incroyablement simple et pour ce que vous faites, cela ne vaut probablement pas tout le travail que cela implique.

Il semble que vous ayez un problème très courant qui consiste essentiellement à lancer un certain nombre de requêtes AJAX et à faire un peu de travail que seul l'un d'entre eux a réellement besoin de faire une seule fois. d sois bon.

Je ne travaille pas en PHP, mais s'il est possible de conserver la valeur de retour de imap_open ou de ses effets secondaires, alors vous devriez essayer de le faire et ensuite réutiliser cette ressource sauvegardée.

Certains pseudo-code:

if (!persisted_resource) { 
    persisted_resource = imap_open() 
} 

persisted_resource.use().... 

où persisted_resource doit être une variable stockée dans la portée de la session, champ d'application ou quoi que PHP dispose qui est vécu plus longtemps qu'une demande.

Ensuite, vous pouvez faire en sorte que chaque requête vérifie cette variable, donc une seule requête devra appeler imap_open ou vous pouvez l'initialiser pendant que vous chargez la page. J'espère que c'est utile.

+0

Merci pour la réponse, j'ai essayé de stocker le résultat de imap_open() dans une session, mais je ne suis pas sûr que vous pouvez stocker une ressource comme ça dans une session. – Gazler

+0

PHP a une solution aux connexions persistantes pour les bases de données, mais je ne suis pas sûr s'il y en a une pour les connexions imap. Chaque requête est gérée dans un environnement en bac à sable, de sorte que la connexion sera fermée une fois l'exécution du script terminée. – Anurag

1

Le script PHP côté serveur peut être configuré pour envoyer la sortie dès qu'elle est générée. Vous devez désactiver toutes les fonctionnalités qui peuvent provoquer la mise en mémoire tampon, telles que output_buffering, output_handler, la compression HTTP, les proxies intermédiaires ...

La partie difficile est que vous avez besoin que votre bibliothèque JavaScript soit capable de gérer une entrée partielle. C'est-à-dire: vous devez avoir accès aux données téléchargées dès qu'elles sont reçues. Je crois que c'est technically possible mais certaines librairies populaires comme jQuery permettent seulement de lire des données quand le transfert est terminé.

Questions connexes