wp_mail very slow

时间:2013-05-29 作者:user2237168

我对wp\\u mail()函数有一个问题。现在,我可以使用以下按钮发送电子邮件:

echo \'<input type="submit" name="send_button" value="verzenden" id="\'.$post_id.\'" class="send_post">\';
触发jQuery请求:

jQuery(document).ready(function() {

jQuery(".send_post").click(function() {

    var post_id = $(this).attr(\'id\');

    jQuery.ajax({
        async: false,
        type: \'get\',
        url: nieuwsbrief.sendmail_url,
        data: \'postid=\' + post_id,
            success: function(data) {
                alert(data);
                return false;
            }
    });
});

});
jQuery将请求发送到sendmail.php. 其中包括以下内容:

<?php
 include_once $_SERVER[\'DOCUMENT_ROOT\'] . \'/www/wordpress/wp-config.php\';
 include_once $_SERVER[\'DOCUMENT_ROOT\'] . \'/www/wordpress/wp-load.php\';
 include_once $_SERVER[\'DOCUMENT_ROOT\'] . \'/www/wordpress/wp-includes/wp-db.php\';

 global $wpdb;

$subscribers = $wpdb->get_results( 
$wpdb->prepare(

"SELECT * FROM 
            wp_nwsbrf_subscribers 
                INNER JOIN 
                    wp_nwsbrf_couple
                        INNER JOIN 
                            wp_nwsbrf_categories
                                INNER JOIN
                                    wp_posts
                                    WHERE 
                                        wp_nwsbrf_subscribers.category_id = wp_nwsbrf_categories.category_id
                                        AND 
                                        wp_nwsbrf_couple.category_id = wp_nwsbrf_categories.category_id
                                        AND 
                                        wp_nwsbrf_subscribers.category_id = wp_nwsbrf_couple.category_id
                                        AND
                                        wp_posts.ID = wp_nwsbrf_couple.ID
                                        AND
                                        wp_nwsbrf_couple.ID = %d", $_GET[\'postid\']) );


foreach ($subscribers as $subscriber) {

    $to = $subscriber->subscriber_mail.",";
    $title = $subscriber->post_title;
    $message = $subscriber->post_content;

    wp_mail($to, $title, $message);
}

?>
正如你所看到的,邮件必须发送进来sendmail.php (url:nieuwsbrief.sendmail_url). 但是,当我点击send_按钮时,发送电子邮件需要几分钟(3或4分钟)!?我做错了什么?

谢谢你帮助我!

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

我做错了什么?

很多很多事情,并非所有都与性能相关。让我们从关键部分开始,然后总结您的性能问题以及可以采取哪些措施来缓解和帮助

AJAX-API首先,您没有使用AJAX-API,而是重新发明轮子。很简单:

JS公司:

$.post( do_mail_sending.ajaxurl, {
    action: \'do_mail_sending\',
    post_id: post_id

}, function(response) {
    alert( response );
});
PHP:

wp_localize_script( \'do_mail_sending\', \'do_mail_sending\', array( \'ajaxurl\' => admin_url( \'admin-ajax.php\' ) ) );
add_action( \'wp_ajax_do_mail_sending\',  \'do_mail_sending\' );
add_action( \'wp_ajax_nopriv_do_mail_sending\',  \'do_mail_sending\' ); // and for logged out users
function do_mail_sending() {
    $post_id = $_POST[\'post_id\'];
    die( \'response data\' );
}
PHP可以用作脚本语言,但您已经转向了应用程序开发,因此我建议不要在文档末尾使用PHP结尾标记。上面的代码段就是这样做的,之后会有一个新的换行符,这可能会导致问题。

安全性

看起来,尽管您正在运行一个prepare语句,但没有一次检查用户是否真的被允许这样做。

E、 g.我可以用以下javascript片段淹没您的所有订阅者,并关闭您的服务器:

while ( true ) {
    jQuery.ajax({
        async: false,
        type: \'get\',
        url: nieuwsbrief.sendmail_url,
        data: \'postid=\' + post_id,
            success: function(data) {
                return false;
            }
    });
}
您没有检查:

用户已登录该用户具有必要的角色和能力,该用户的请求来自您的站点,该请求来自带有电子邮件发送表单的页面,请使用nonces检查帖子本身是否存在性能问题您的性能问题是由于您所做的事造成的。即:

一个昂贵的SQL查询,包括多个连接,发送一封电子邮件,这两个查询本身都很昂贵,最后一个也是你经常做的。电子邮件本身发送服务器端的成本很高,因为它必须联系SMTP服务器并进行协商,任何远程请求都需要时间。

你几乎无法避免这项开支,因为构成这项开支的核心部件本身就很昂贵。

但没关系。你不是第一个不得不做昂贵事情的人,所以你的目标应该是缓解和重新设计。您不能降低流程的成本,但可以修改流程,使其在UI中快速显示,并且仍然可以完成。银行在早期通过在分行分批关闭的情况下隔夜进行艰难的数字运算来解决这一问题。

以下是一些减轻风险的方法:

将过程分为多个步骤,而不是一个AJAX请求,执行几个步骤,1计算需要发送的电子邮件数量,然后再执行几个步骤,根据服务器的响应时间,使用分页方式技术以10或20为一批发送电子邮件

    数据注释

    您需要这样的SQL语句,这让我想知道您的categories表和查询是否不能替换为自定义分类法和调用WP_Query. 通过这种方式,您可以利用内置的对象和查询缓存

SO网友:Billy Fisher

在我的例子中,wp\\u mail()在表单提交时每封电子邮件都要花费90秒以上的时间,这让我的网站陷入了爬行状态。完全忘了根据下面的说明更正我的站点的/etc/hosts配置,现在sendmail是<;3秒。

https://www.digitalocean.com/community/questions/sendmail-is-slow-to-send-mail

如果您检查/var/log/mail。您可能会发现这样的日志:我的非限定主机名(localhost)未知;正在休眠等待重试。这是因为sendmail要求“主机名”是完全限定的域名。更新“/etc/hosts”文件:nano/etc/hosts,如下所示:127.0.0.1 localhost。localdomain localhost yourhostname boom,fast sendmail。

结束

相关推荐

JQuery Accordion插件一旦在WP中使用就不能工作

我正在尝试在我的WP中使用手风琴脚本:http://www.armagost.com/zaccordion/问题是,在一个独立的html/php文件上,它工作得很好,但一旦粘贴到我的标题中。php文件无法使其工作。我也试着用<?php require_once(\"example.php\") ?> 但没有成功。你可以看到我的标题。php文件位于此处:http://pastebin.com/SrkmWxp1谢谢你的帮助。