2010-10-07 5 views
2

Je suis en train de trier les emails à la recherche d'instances spécifiques de chaînes de caractères et cela prend trop de temps. Je voudrais que le temps passe à une demi-seconde par courriel, et cela prend environ 2 à 2,5 secondes par courriel.Quel est le moyen le plus efficace de trier les emails avec zend_mail?

Je suis inquiet que je fasse quelque chose de vraiment stupide qui ralentit cela - probablement avec mysql ou zend_email. Ce que fait ce code, c'est qu'il vérifie la phrase "chocolat" dans la boîte de réception d'un utilisateur, puis renvoie les valeurs à la fonction jquery ajax. Il boucle dix fois (dans cette version, il vérifie 10 emails). Si vous voyez quelque chose qui va aider à réduire le temps de chargement, ce serait apprécié. Au départ, je pensais que ne pas inclure les bibliothèques serait utile, mais les bibliothèques sans les fonctions d'ouverture de courrier électronique étaient rapides comme l'éclair.

Je suis sûr que je fais quelque chose de stupide et d'amateur (peut-être quelques petites choses). Veuillez les signaler si possible.

est ici le code ...

<?php 
     $storage = new Zend_Mail_Storage_Imap($imap); 


    $x=0; 
    while($x<10) 
    { 
      $flags = $storage->getMessage($i)->getFlags();  

      if(!empty($flags['\Seen'])) 
      { 
       $read=1; 
      } 

      else 
      { 
       $read=0; 
      } 


     if (strpos($storage->getMessage($i),'chocolate') !== FALSE) 
     { 
      $fromaddress = str_replace("'","",$storage->getMessage($i)->from); 
      $fromaddress = str_replace('"','',$fromaddress); 

      $sql = "SELECT `senderemail`,`subscribed` FROM email_spam WHERE `useremail` = '$_SESSION[email_address]' AND `senderemail` = '$fromaddress'"; $result = mysql_query($sql) or die (mysql_error()); 

      $num = mysql_num_rows($result); 

      if($num == 0) 
      { 
       $emailmessage = mysql_escape_string($storage->getMessage($i)->getContent()); 



       $sql_insert = "INSERT into `email_spam` (`message`,`useremail`,`senderemail`,`datetime`,`subscribed`) VALUES ('$emailmessage','$_SESSION[email_address]','$fromaddress',now(),1)";//  echo $sql_insert; 

       mysql_query($sql_insert,$link) or die("Insertion Failed:" . mysql_error()); 

       $sql = "SELECT `emailid`,`datetime` FROM email_spam WHERE `useremail` = '$_SESSION[email_address]' ORDER BY `datetime` desc";  $getid = mysql_query($sql) or die (mysql_error()); 

       $num = mysql_num_rows($getid); 

       echo '<tr><td>'. $fromaddress . '</td>'; 

       echo '<td class="unsubscribe_td" align="center"><input type="submit" value="Unsubscribe Me" class="unsubscribe_button" id="'. mysql_result($getid,0,'emailid') .'"/></td></tr>'; 

      } 
     } 



     if ($read==0) 
     { 

      $storage->setFlags($i, array(Zend_Mail_Storage::FLAG_RECENT)); //marks as new 
     } 


     $i--; 
     $x++; 
    } 

    ?> 
+0

pouvez-vous redurcir votre code à la partie pertinente s'il vous plaît –

+0

Édité pour afficher uniquement les parties les plus pertinentes du code –

+2

Quelle (s) partie (s) de votre code est lente? Le profil, puis travailler sur l'accélération de ces parties. –

Répondre

0

Il n'y a aucun point dans ce profil - il est juste une mauvaise approche. Vous effectuez une requête IMAP et un transfert de données séparés pour chaque message, ce qui ne sera jamais rapide. Le moyen le plus efficace est de ne pas le faire ici - Obtenez le serveur IMAP pour faire la recherche pour vous. Ce n'est probablement pas aussi flexible que ce que vous faites, mais il n'aura aucun problème à chercher des dizaines de milliers de messages par seconde, et il peut certainement faire une simple correspondance de chaîne dans les corps de message. PHP has support for searching inboxes dans l'extension IMAP. Je ne sais pas si cette fonction est exposée via l'un des composants de Zend, mais cela n'a pas vraiment d'importance si ce n'est pas le cas.

C'est exactement le mécanisme utilisé par la recherche de boîte de réception iPhone; Il effectue une recherche locale sur les messages qu'il a déjà, mais offre ensuite l'option de continuer la recherche sur le serveur, ce qui permet de passer à quelque chose qui a déjà les données et qui a plus de puissance à utiliser.

Questions connexes