медленный процесс php - PullRequest
       0

медленный процесс php

1 голос
/ 16 декабря 2011

У меня есть вопрос относительно вызова функции, который занимает довольно много времени, и я надеюсь, что некоторые могут увидеть, сделал ли я что-то преступное.

Когда я запускаю функцию GetEmailCue в функции ниже из sendletter.phpЭто займет около минуты или около того, и я не могу понять, почему.

Таблица db emailcue содержит только 2 электронных письма.

         /******************************************
         * Sends a letter from the email cue
         * 
         * @param int       | The letter id
         *******************************************/
        function SendTheLetter($letter_id) {

            /*** Find the email cue based on the newsletter uid ***/
            $cue = new NewsletterHandler;
            $cue->GetLetterContent($letter_id);
            $cue->GetEmailCue($letter_id);

            $headers  = 'MIME-Version: 1.0' . "\r\n";
            $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

            foreach($cue->email_row as $key => $value) { 
                mail($value, "Newsletter - ". date("d-m-Y"), $this->htmlTemplate, $headers);
                $sql_update = "UPDATE newsletter_emailcue SET time_recieved = NOW() WHERE email = '". $value ."'";
                SQLHandling::SQLquery($sql_update);                
            }
        }   

Эта функция извлекает данные из двух другихфункции

GetLetterContent:

         /******************************************
         * Find all fields that belongs to a    
         * newsletter.
         * 
         * @param int       | The letter id
         *******************************************/
        function GetLetterContent($letter_id) { 

            $sql = "SELECT A.template, A.status, B.field_name, B.field_content FROM newsletter_items A, newsletter_fields B WHERE B.field_letter_uid = '". $letter_id ."'";           

            $result = SQLHandling::SQLquery($sql);

                while($row = mysql_fetch_array($result)) { 

                    $this->content_markers["". $row["field_name"] .""] = $row["field_content"];
                    $template = $row["template"];
                }

                /*** Compile the letter with all the markers ***/
                $this->CompileLetter($letter_id, $template, $this->content_markers);
                return;                
        }

и

GetEmailCue:

         /******************************************
         * Get an entire email cue based on a 
         * newsletter id.
         * This functions is called from the send 
         * function.
         * 
         * @param int       | The letter id
         *******************************************/
        function GetEmailCue($letter_id) {
            $sql = "SELECT * FROM newsletter_emailcue WHERE mail_to_recieve = '". $letter_id ."' AND time_recieved = '0000-00-00 00:00:00' LIMIT 1";
            $result = SQLHandling::SQLquery($sql);

            if(mysql_num_rows($result) < 1) {
                $sql_update = "UPDATE newsletter_items SET status = 2 WHERE letter_id = '". $letter_id ."'";
                SQLHandling::SQLquery($sql_update);
            } else {              
                while($row = mysql_fetch_array($result)) {
                    $this->email_row[] = $row["email"];
                }
            }

            return $this->email_row;
        }

Возможно, проблема в GetEmailCue, потому что, если я это прокомментируюВ SendTheLetter функция выполняется сразу же, и если я запускаю GetEmailCue непосредственно из файла, эта функция также выполняется сразу же, но когда я запускаю ее в SendTheLetter, это происходит навсегда.

Функция SendTheLetter снова вызывается изFindLetterToSend

         /******************************************
         * Finds all letters that have send status 1
         * which is pending to send.
         *******************************************/
        function FindLetterToSend() { 
            $sql = "SELECT * FROM newsletter_items WHERE status = '1'";           
            $result = SQLHandling::SQLquery($sql);

            if(mysql_num_rows($result) == 0) { 
               Main::txtOutput("Der er ingen nyhedsbreve i udsendelseskøen!", "TXT_ERR");               

               /*** Let's clear the emailcue table - no need for the cue any more ***/
               SQLHandling::SQLquery("TRUNCATE TABLE newsletter_emailcue");               
            } else {
                while($row = mysql_fetch_array($result)) { 
                    $this->SendTheLetter($row["letter_id"]);
                }
            }
            return;
        }

Я запускаю его на своем локальном хосте Ubuntu

1 Ответ

1 голос
/ 16 декабря 2011

Отправка электронной почты занимает некоторое время, но вы сказали, что отправлено только две почты.Это немного.

Этот код обновляет любую строку электронной почты?

foreach($cue->email_row as $key => $value) { 
    mail($value, "Newsletter - ". date("d-m-Y"), $this->htmlTemplate, $headers);
    $sql_update = "UPDATE newsletter_emailcue SET time_recieved = NOW() WHERE email = '". $value ."'";
    SQLHandling::SQLquery($sql_update);                
}

Вы пытались измерить время выполнения отдельных частей кода с помощью функции microtime?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...