我有一个数据库,里面有邮件列表的订阅者。
我正在使用 php 脚本从数据库中获取电子邮件地址,然后向每个地址发送电子邮件。这一直工作正常,直到订阅者数量增长到很大。
现在,脚本超时,一些订阅者报告他们收到不止一封电子邮件,一些订阅者根本没有收到电子邮件。
我认为问题可能是脚本需要很长时间才能执行,因为从数据库返回了许多行(163 个订阅者(,但我注意到肯定。我无法访问 php.ini 文件(服务器是共享平台(
有人对如何改进我的脚本有任何建议吗?如何确保每个订阅者都能收到一封电子邮件,有没有办法避免重复?
<?php
//Database connection script
include_once 'inc/dbconnect.php';
$message='Test message';
$query="SELECT * FROM subscribers WHERE type=1";
$res1=mysqli_query($dbh, $query) or die(mysqli_error());
while($user=mysqli_fetch_array($res1)){
$from='myname@mydomain.se';
$fromname='My name';
$to=$user['email'];
$subject='Message subject';
$header='From: myname@mydomain.se
Reply-To: myname@mydomain.se
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
X-mailer: PHP '.phpversion();
if(mail($to, $subject, $message, $header)){
print 'Mail sent to '.$to.'<br>';
}
else{
print 'Could not send mail to '.$to.'<br>';
}
}
要优化查询,请始终使用逗号分隔的字段名称,而不是使用 *。
为了避免重复,请使用以下查询。
$query="从订阅者中选择不同(电子邮件(,其中类型= 1"; 这将仅获取不同的电子邮件。
页面也有可能超时。您始终可以增加最大执行时间。
有 3 种方法可以做到这一点。
使用htaccess访问php_value max_execution_time 300
使用 PHP 动态更改ini_set("max_execution_time",300(;
php.ini//的更改 为此,如果您无法直接访问它,您需要联系服务器人员来帮助您。max_execution_time = 120
向所有人逐个发送电子邮件是一种不好的做法。它会减慢您的系统速度。你为什么不使用任何库?市场上有一个很棒的库,叫做 Swift Mailer。只需使用它。它真的会帮助你。
Swift Mailer 集成到任何用 PHP 5 编写的 Web 应用程序中,提供 灵活而优雅的面向对象发送电子邮件的方法 众多功能。
主页网址 : http://swiftmailer.org/
Github : https://github.com/swiftmailer/swiftmailer
它允许您通过提供多个收件人的数组一次发送多封电子邮件。
PHP 通常在请求/响应环境中运行。来自服务器的每个响应都有一个运行时限制,以避免单个响应使服务器过载。正如你所说,这可能是你的问题。如果不是现在,随着用户数量的增加,它很可能会成为一个问题。
如果您无法更改执行时间限制(可能在共享服务器上(,那么为了处理这个问题,我会-
- 测量各种大小批次的用户的脚本执行时间。
- 选择一个在时间限制内轻松完成的"批量大小"。
- 将您的邮件作业分解为该大小的块/批次。
棘手的部分是将您必须进入的状态移交给批处理的下一个周期。您可以考虑将"批处理光标位置"写入数据库,或者只是将您的电子邮件批处理页面重定向到自身,然后在 URL 中使用"从此处开始"参数退出。
从长远来看,您可能需要考虑使用通用批处理队列工具来处理长时间运行的作业。不过,这可能需要访问服务器上的cron,假设您运行在Linux/Unix机器上。