我做错了什么?
很多很多事情,并非所有都与性能相关。让我们从关键部分开始,然后总结您的性能问题以及可以采取哪些措施来缓解和帮助
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为一批发送电子邮件根本不发送电子邮件,而是计算需要做的工作,然后将其作为需要做的任务保存在数据库中。然后定期运行cron作业,在后台发送电子邮件将备注添加到要发送的电子邮件队列中,然后逐个发送,从队列中删除该项目。您的新闻稿可能不会一次全部发送,但它会被发送,并且在发送过程中不会使服务器停机。它还允许您创建一个状态页面,实时显示邮寄进度
数据注释
您需要这样的SQL语句,这让我想知道您的categories表和查询是否不能替换为自定义分类法和调用WP_Query
. 通过这种方式,您可以利用内置的对象和查询缓存