2016-02-15 3 views
1

У меня есть база данных с подписчиками в списке рассылки.Усовершенствования почтового списка php

Я использую 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='[email protected]'; 
     $fromname='My name'; 
     $to=$user['email']; 
     $subject='Message subject'; 
     $header='From: [email protected] 
Reply-To: [email protected] 
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

Посмотрите на _set \ _time \ _limit (seconds) _. Работает только в том случае, если сервер не работает в безопасном режиме. Альтернативой может быть разделение выбора (INDEX, OFFSET) по частям. – hherger

+0

Добавить каждый адрес электронной почты в ОЦЦ, чтобы они не могли видеть друг друга, но таким образом вы можете отправить 1 письмо на 10 человек –

ответ

0

Чтобы оптимизировать запрос, всегда используйте имя поля, разделенное запятой, а не используя *.

В вашем случае, чтобы избежать дублирования, используйте ниже запрос.

$ query = "SELECT DISTINCT (email) ОТ подписчиков WHERE type = 1"; // это приведет к отображению только отдельной электронной почты.

Есть вероятность, что страница будет времяпрепровождать. Вы всегда можете увеличить максимальное время выполнения.

Существует 3 способа сделать это.

С Htaccess php_value max_execution_time 300

Изменение динамически с PHP ini_set ('max_execution_time', 300);

Изменение в php.ini // для этого вам необходимо связаться с человеком сервера, чтобы помочь вам, если у вас нет прямого доступа к нему. max_execution_time = 120

0

Отправка электронной почты всем по одному - это плохая практика. Это замедлит вашу систему. Почему вы не используете какую-либо библиотеку? На рынке есть одна удивительная библиотека под названием Swift Mailer. Просто используйте его. Это действительно поможет вам.

Swift Mailer интегрируется в любые веб-приложения написанного на PHP 5, предлагая гибкий и элегантный объектно-ориентированный подход к отправке писем с множеством функций а.

Домашний URL: http://swiftmailer.org/

Github: https://github.com/swiftmailer/swiftmailer

Это будет позволяет отправить несколько писем в одном кадре, обеспечивая массив нескольких получателей.

0

PHP обычно работает в среде запроса/ответа. Каждый ответ от сервера имеет ограничение времени выполнения, чтобы избежать перегрузки сервера одним ответом. Как вы сказали, это, вероятно, ваша проблема. Если это не сейчас, это, скорее всего, станет проблемой по мере увеличения количества пользователей.

Если вы не можете изменить лимит времени выполнения (скорее всего на общем сервере), то, чтобы иметь дело с этим одним вопросом я would-

  1. Измерить время выполнения вашего скрипта для различных размеров пакетов пользователей ,
  2. Выберите «размер партии», который заканчивается комфортно ниже установленного срока.
  3. Перерыв вашей работы почты в куски/партии такого размера.

Сложная часть - передача состояния, в котором вы находитесь, к следующему циклу пакетного процесса. Вы могли бы задуматься о написании «позиции курсора в пакетном режиме» в базе данных или просто перенаправить свою страницу пакетной электронной почты до выхода с параметром «начать с здесь» в URL-адресе.

В более долгосрочной перспективе вам, возможно, понадобится рассмотреть возможность создания очереди с общим назначением для обработки длинных рабочих заданий. Для этого может потребоваться доступ к cron на сервере, хотя предполагается, что вы работаете в Linux/Unix.

Смежные вопросы