2

文字列の特定のインスタンスを探して電子メールを並べ替えていますが、時間がかかりすぎます。メールあたりの時間を 0.5 秒に短縮したいと考えています。現在、メールあたり約 2 ~ 2.5 秒かかっています。

これを遅くしている本当にばかげたことをしているのではないかと心配しています-おそらくmysqlまたはzend_emailを使用しています。このコードは、ユーザーの受信トレイで特定のフレーズ「chocolate」をチェックし、値を jquery ajax 関数に返します。10 回ループします (このバージョンでは、10 通のメールをチェックします)。ロード時間を短縮するのに役立つ何かを見つけたら、それを歓迎します。最初は、ライブラリを含めないほうがいいと思っていましたが、メールを開く機能のないライブラリは非常に高速でした。

私はばかげた、アマチュア的なことをしていると確信しています (おそらくいくつかのこと)。可能であれば、それらを指摘してください。

これがコードです...

<?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++;
    }

    ?>
4

1 に答える 1

0

これをプロファイリングしても意味がありません。アプローチが間違っているだけです。メッセージごとに個別の IMAP リクエストとデータ転送を行っているため、決して高速ではありません。最も効率的な方法は、ここではまったく行わないことです。IMAP サーバーに検索を依頼してください。あなたがやっているほど柔軟ではないかもしれませんが、毎秒数万件のメッセージを問題なく検索でき、メッセージ本文で単純な文字列の一致を確実に実行できます。PHP は、IMAP 拡張機能で受信ボックスの検索をサポートしています。その関数が Zend コンポーネントのいずれかを介して公開されているかどうかはわかりませんが、公開されていなくても問題ありません。

これは、まさに iPhone の受信トレイ検索が使用するメカニズムです。すでに持っているメッセージに対してローカル検索を行いますが、サーバー上で検索を続行するオプションを提供します。これは、既にデータを取得しており、より多くの馬力を持っているものに引き渡します。

于 2011-06-15T10:47:52.877 に答える