PHP: отправить письмо по причине тайм-аута - PullRequest
1 голос
/ 02 февраля 2010

я разработал приложение eblast

Программа используется для отправки электронного письма некоторым получателям

электронная почта получателя будет извлечена из файла xls

и программа настроила его отправлять 10 писем каждый раз и спать 30 секунд

и используйте ob_flush (); и флеш (); вывести на экран процесс и отобразить его во внешнем интерфейсе

вчера мой клиент протестировал его с 9000 получателями (это должно занять около 10 часов)

и он сказал мне, что программа остановилась, и я обнаружил, что в файле журнала есть отметка, что программа остановилась на 65XX электронных письмах,

означает, что программа уже отправила 6XXX электронное письмо (около 7 часов)

и эта проблема никогда не возникнет в работе cron, а только при exec через веб-браузер

мой брат сказал мне, потому что это все о долгом сне?

и он предлагает использовать cron job, однако в моем приложении уже есть настройка cron,

клиент просто хочет иметь возможность отправлять электронную почту немедленно

любое другое решение для решения? использовать php, вызвать команду linux и excu сценарий отправки электронной почты php?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2010

Мое решение состоит в том, чтобы попытаться запускать ваш cronjob каждую минуту. Тем не менее, вы должны сохранить состояние вашего cronjob, чтобы он не запускался дважды.

Обычно я делаю это так (обратите внимание, что этот cron предназначен для запуска каждую минуту):

if(stat_check_file('cron.stat'))
{
     die("Found CRON.STAT, Exit!");
}
else
{
    stat_create_stat_file('cron.stat');
    //do your long process here...
}
stat_delete_stat_file('cron.stat');

function stat_check_file($filename)
{
    global $rootdir;

    return file_exists($rootdir.'/'.$filename);
}

function stat_create_stat_file($filename){
    global $rootdir;

    touch($rootdir.'/'.$filename);
}

function stat_delete_stat_file($filename)
{
    global $rootdir;

    if(stat_check_file($filename))
    {
        @unlink($rootdir.'/'.$filename);
    }
}

Теперь, в вашем cronjob, просто загрузите xls, запустите его и запишите журнал в любую базу данных / файл. затем на своей панели прочитайте этот журнал и отобразите его так, чтобы ваш клиент мог видеть прямо сейчас, отправлено письмо xxx и отправлено письмо xxx.

0 голосов
/ 02 февраля 2010

Длительные процессы в Apache или IIS сложны. Проблема в том, что если что-то случится, например, перезапуск веб-сервера или тайм-аут, вы потеряете свою работу. Вам лучше не усложнять это и переходить на постоянную работу, но если вы готовы принять вызов, можно обойтись.

Я получал возможность периодически перезагружать веб-сервер, сохраняя состояние моего процесса в базе данных и скрипте, который постоянно просматривал страницу, чтобы проверить, работает ли он. Поэтому, когда длительный процесс загружается первым, он проверяет, должен ли он работать и должен ли он продолжать работу или нет. В вашем случае это может быть номер строки в файле Excel.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...