PHP IMAP连接速度

时间:2014-04-11 17:49:33

标签: php imap

这是我在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>

1 个答案:

答案 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()是最慢的部分。

这是因为它正在执行数据库搜索,您可能遇到以下问题:

  • 您的邮件服务器硬件非常薄弱
  • 您的邮件服务器有100千兆字节的数据/电子邮件,因此查询自然会变慢
  • 邮件服务器上的硬盘空间不足

第二次快速运行的原因是数据库执行称为缓存的操作,因此查询结果被加载到内存(RAM)中,但在10分钟后,数据库清除了缓存或数据发生了更改所以需要重新缓存查询。