这是我在php中首次尝试使用imap。
我正在为我的公司制作一个面板,在那里我上传客户,带有姓名和电子邮件,并为用户提供asignit,
因此,当用户进入面板并在那里有客户端时,面板会检查用户电子邮件帐户并从客户端电子邮件中搜索电子邮件,
我的问题是,第一次加载面板时它变得很慢,需要5秒到15秒才能加载(或者有时更多)但是在第一次加载后,速度很快,但是如果我为了让我们离开说10分钟并重新加载面板,它第一次再次变慢。
这是我的代码;对于面板中的每个用户,我调用此函数:
function mostrarCorreosRelacionados($remitente){
$hostname = '{localhost:143}INBOX';
$correo = explode("|||",$_SESSION['correo']);
$username = $correo[0];
$password = $correo[1];
/* Intento de conexión */
$inbox = imap_open($hostname,$username,$password) or die('No se pudo conectar con: usuario: '.$username.' y clave: '.$password.' ' . imap_last_error());
/* Recuperamos los emails */
$emails = imap_search($inbox,'FROM "'.$remitente.'"');
/* Si obtenemos los emails, accedemos uno a uno... */
if($emails) {
/* variable de salida */
$output = '';
/* Colocamos los nuevos emails arriba */
rsort($emails);
/* por cada email... */
$ii=0;
foreach($emails as $email_number) {
/* Obtenemos la información específica para este email */
$overview = imap_fetch_overview($inbox,$email_number,0);
//$body = imap_fetchbody($inbox,$email_number,4);
$uid = imap_uid($inbox, $email_number);
$header = imap_header($inbox,$email_number);
$fromInfo = $header->from[0];
$replyInfo = $header->reply_to[0];
$details = array(
"fromAddr" => (isset($fromInfo->mailbox) && isset($fromInfo->host))
? $fromInfo->mailbox . "@" . $fromInfo->host : "",
"fromName" => (isset($fromInfo->personal))
? $fromInfo->personal : "",
"replyAddr" => (isset($replyInfo->mailbox) && isset($replyInfo->host))
? $replyInfo->mailbox . "@" . $replyInfo->host : "",
"replyName" => (isset($replyTo->personal))
? $replyto->personal : "",
"subject" => (isset($header->subject))
? $header->subject : "",
"udate" => (isset($header->udate))
? $header->udate : ""
);
//$message = mail_mime_to_array($inbox,$email_number);
/* Mostramos la información de la cabecera del email */
$output.= '<li>';
$output.= '<div class="encabezadoMail '.($overview[0]->seen ? 'read' : 'unread').'">';
$output.= '<span class="subject">Asunto: '.decodificarTexto($details["subject"]).'</span><br />';
$output.= '<a href="mailto:'.$fromInfo->mailbox.'@'.$fromInfo->host.'" class="from" title="'.$fromInfo->mailbox.'@'.$fromInfo->host.'">'.decodificarTexto($fromInfo->personal).'</a><br />';
$output.= '<span class="textoChico">'.$overview[0]->date.'</span>';
$output.= '</div>';
/* Mostramos el mensaje del email */
$output.= '<div class="cuerpoMail" id="msg_'.$i.'" style="display:none;">'.utf8_encode(getBody($uid,$inbox)).'</div>';
$output.= '</li>';
$ii++;
}
print '<ul class="emails"><li class="encabezadoMail"><strong>E-mails</strong></li>'.$output.'</ul>';
}
/* Cerramos la connexión */
imap_close($inbox);
}
在imap_open我尝试过localhost,domain和ip,但似乎所有工作都一样。
任何想法???
更新到MONKEYZEUS
我做了你告诉我的事,这就是我得到的:
FIST CLIENT
conexión:0.0309870243073秒 Recuperamos:26.7151398659秒
第二位客户
conexión:0.102792978287秒 Recuperamos:0.0511429309845秒
第三位客户
conexión:0.00676202774048秒 Recuperamos:0.0503911972046秒
它刚刚发生在第一次,如果我按F5很长一段时间我第一个客户端没有发生,它会像其他人一样快速加载,如果我等待10分钟它会在第一个客户端再次变慢< / p>
答案 0 :(得分:2)
你必须弄清楚花费的时间最长。
我猜这是这部分:
/* Intento de conexión */
$inbox = imap_open($hostname,$username,$password) or die('No se pudo conectar con: usuario: '.$username.' y clave: '.$password.' ' . imap_last_error());
/* Recuperamos los emails */
$emails = imap_search($inbox,'FROM "'.$remitente.'"');
所以尝试对它进行基准测试:
$start = microtime(true); // start timer
/* Intento de conexión */
$inbox = imap_open($hostname,$username,$password) or die('No se pudo conectar con: usuario: '.$username.' y clave: '.$password.' ' . imap_last_error());
echo 'conexión: '.(microtime(true)-$start).' seconds<br>'; // show results
// ---------------------------------------------------------------------
$start = microtime(true); // start timer again
/* Recuperamos los emails */
$emails = imap_search($inbox,'FROM "'.$remitente.'"');
echo 'Recuperamos: '.(microtime(true)-$start).' seconds<br>'; // show new results
conexión可能是最慢的部分。这可能是因为你的邮件服务器。
根据您的基准测试,很明显imap_search()
是最慢的部分。
这是因为它正在执行数据库搜索,您可能遇到以下问题:
第二次快速运行的原因是数据库执行称为缓存的操作,因此查询结果被加载到内存(RAM)中,但在10分钟后,数据库清除了缓存或数据发生了更改所以需要重新缓存查询。