【问题标题】:slow php process缓慢的php进程
【发布时间】:2011-12-16 10:03:21
【问题描述】:

我有一个关于调用需要很长时间的函数的问题,我希望有人能看看我是否做了一些犯罪行为。

当我从 sendletter.php 运行下面函数中的函数 GetEmailCue 时,大约需要一分钟左右才能完成,我不知道为什么。

emailcue db 表仅包含 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 本地主机上运行它

【问题讨论】:

    标签: php mysql performance function process


    【解决方案1】:

    发送电子邮件需要一些时间,但您说只发送了两封邮件。这并不多。

    此代码在任何电子邮件行上进行更新?

    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 函数测量单个代码部分的运行时间?

    【讨论】:

    • 发送电子邮件时,该电子邮件将获得时间戳,以避免他/她多次收到时事通讯。 foreach 更新刚刚发送的电子邮件...我可以尝试测量运行时间。
    • SendTheLetter 中的 $cue->GetEmailCue($letter_id) 的运行时间为 0.00030803680419922,而 foreach 的运行时间为 60.888072013855 - 这看起来很疯狂!
    • 感谢运行时的提示。看来我已将问题隔离为邮件功能...这可以在 Ubuntu localhost 中进行设置吗?
    • 对不起,我迟到的答案(我是@工作)我想,这可能是邮件服务器本身。也许尝试测量邮件->提交的时间。我的 ErrorHandler-Function 也确实会发送电子邮件,并且总是需要一定的时间来执行此操作。我不知道您使用的是哪种 Mail-Class,但也许您可以选择将电子邮件排队并一次发送。 foreach($cue-&gt;email_row as $key =&gt; $value) $value 有什么价值?是身份证吗?
    • 问题 AFAIK 是 Ubuntu 内部的 sendmail 本身有大约 60 秒的延迟,根据邮件的运行时间,这似乎是正确的......或者带有域名和 DNS 等的东西。我安装了 sendemail apt-get install 然后再次运行脚本,它马上就通过了! :) 我已经接受了你的回答,因为你向我提示了运行时这导致我使用邮件功能!所以谢谢你:)
    猜你喜欢
    • 2012-01-23
    • 2011-11-28
    • 2013-06-02
    • 1970-01-01
    • 2012-03-07
    • 2020-02-27
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多