我有一个包含邮件列表订阅者的数据库。
我正在使用php脚本从数据库中获取电子邮件地址,然后向每个地址发送电子邮件。 这种情况很好,直到订阅者数量增长为止。
现在,脚本超时,一些订阅者报告他们收到了多封电子邮件,有些订阅者根本没有收到电子邮件。
我认为问题可能是脚本需要很长时间才能执行,因为从数据库返回的行数很多(163个订阅者),但我要注意。我无法访问php.ini文件(服务器是ashared平台)
有没有人对如何改进我的脚本有任何建议?如何确保每个订阅者都收到一封电子邮件,是否有办法避免重复?
<?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>';
}
}
答案 0 :(得分:0)
要优化查询,请始终使用逗号分隔的字段名,而不要使用*。
在您的情况下,为了避免重复,请使用以下查询。
$ query =“SELECT DISTINCT(email)FROM subscriber WHERE type = 1”; //这将只获取不同的电子邮件。
页面也有可能超时。 您总是可以增加最长执行时间。
有三种方法可以做到。
用htaccess php_value max_execution_time 300
使用PHP动态更改 ini_set('max_execution_time',300);
更改php.ini //为此您需要联系服务器人员以帮助您,如果您没有直接访问它。 max_execution_time = 120
答案 1 :(得分:0)
逐个向每个人发送电子邮件是不好的做法。它会降低你的系统速度。你为什么不使用任何库?市场上有一个很棒的图书馆叫做Swift Mailer。只是使用它。它真的会帮助你。
Swift Mailer集成到用PHP 5编写的任何Web应用程序中,提供了一个 灵活而优雅的面向对象的方式来发送电子邮件 众多功能。
Github:https://github.com/swiftmailer/swiftmailer
它允许您通过提供多个收件人阵列一次发送多封电子邮件。
答案 2 :(得分:0)
PHP通常在请求/响应环境中运行。来自服务器的每个响应都有一个运行时限制,以避免单个响应使服务器过载。正如你所说,这可能是你的问题。如果不是现在,随着用户数量的增加,它可能会成为一个问题。
如果您无法更改执行时间限制(可能在共享服务器上),那么我会处理这个问题 -
棘手的部分是将您所处的状态切换到批处理的下一个循环。您可以选择编写&#34;批处理光标位置&#34;进入数据库,或者只是将您的电子邮件批处理页面重定向到自己,然后退出&#34;从这里开始&#34; URL中的参数。
从长远来看,您可能需要考虑使用通用批处理队列工具来处理长时间运行的作业。这可能需要访问服务器上的cron,假设你在Linux / Unix机器上运行。