У меня есть список адресов электронной почты людей, которым я должен отправлять электронные письма каждое утро. На данный момент число составляет около 1000, и оно находится на моем собственном сервере VPS LINUX.
Проблема в том, что когда работа выполняется, веб-сайты, которые у меня есть на сервере, кажутся зависшими и время ожидания довольно много.
Я подумал, что добавление команды сна в пару секунд между каждой итерацией цикла поможет в этом, но разработчик PHP на моей работе только что сказал мне, что это не поможет Apache в отношении памяти, и было бы лучше просто запустите скрипт без какой-либо команды сна.
Я читал статьи здесь и на других сайтах, где люди рекомендуют добавлять команду сна между итерациями цикла, но если это просто означает, что процесс Apache потребляет больше памяти и вызывает зависание моего сайта, то я не хочу, чтобы это происходило.
Я вызываю эту работу из моего домена с работы CRON с безопасным хешем. Причина, по которой я звоню через сайт, например http://www.example.com/sendemails.php?secretcode=_—1033-449 в том, что часто мне нужно отлаживать его, чтобы посмотреть, что происходит, или, если задание не запустилось, я могу запустить его вручную и прочитать отладку на странице.
Есть ли проблема с тайм-аутами сна и Apache / веб-сайта, или я должен сделать это другим способом, например, иметь какую-то партию запуска скрипта каждые 10 минут и разослать 100 электронных писем, прежде чем обновлять флаг в БД против человека, чтобы я знал им было отправлено электронное письмо (True / False), начиная с этого момента в следующем пакете.
Затем ночью, через определенное время, например, в 18:00, когда я знаю, что не следует отправлять электронные письма, я мог бы легко переустановить все их флаги на «Ложь», готовые к завтрашнему дню. Гарантируя, что электронные письма не будут отправлены после 18:00, конечно.
Каков предпочтительный способ сделать что-то подобное, так как кажется, что веб-сайт зависает / время ожидания во время выполнения задания.
Спасибо
обкрадывать
Похоже, что в моем случае в любом случае отсутствие ИСПЫТАНИЯ между итерациями цикла работает намного лучше, чем 1-секундный сон
У меня на VPS настроены предупреждающие электронные письма, и вчера во время отправки пакета я получил одно сообщение о том, что произошли тайм-ауты из определенных мест (Rackspace выполняет 3 теста из Лондона, Чикаго и Далласа), 2 местоположения вернули время соединения более 25 секунд для подключения на мой сервер — не HTTP PING, а просто для подключения с обычным PING.
В конце пакетной работы я отправляю электронные письма об успехах, чтобы сообщить мне, что произошло, когда работа началась и закончилась, и сколько писем было отправлено.
Это было вчерашнее электронное письмо с 1-секундным сном между каждой итерацией в цикле.
Дата начала работы: 2015-май-19 11:15:02 Мы успешно отправили
945 писем подписчикам Дата окончания работы: 2015-май-19 11:50:54
Таким образом, с задержкой в 1 секунду и вызовом скрипта PHP процессом APACHE было показано, что отправка электронных писем заняла 35 минут.
Плюс у меня проблемы с сайтом / сервером во время работы.
Проверка моего сценария отладки показала, что между отправкой большого количества писем больше, чем 1 секунда, поэтому работа явно вызывала проблемы с сервером.
Однако сегодня у меня не было задержки между каждой итерацией цикла и заданием, выполненным в течение минуты.
Я успешно отправил все электронные письма без предупреждений от моего VPS. Мой VPS выполняет и PING-соединения, и HTTP-пинги (HEAD-запросы) на мой сервер.
Дата начала работы: 2015-май-20 11:16:01 Мы успешно отправлены
945 писем подписчикам Дата окончания работы: 2015-май-20 11:16:54
Я думаю, это показывает, что вы можете отправить 1000 писем менее чем за минуту. #
Это со стандартным циклом MySQL, чтобы получить адрес электронной почты / имя человека, которому нужно отправить письмо, из базы данных и с использованием процесса Apache, например, вызов CRON на веб-странице, которая содержит сценарий, а не внутренний вызов файла PHP.
Сценарий настраивается, так что я могу установить режим ожидания выше 0, чтобы выполнить ожидание, и все отладочные сообщения сохраняются в массиве во время работы, а затем передаются по одному файлу file_put_contents в мой файл отладки в конце. Это скорее не постоянное открытие и закрытие файла отладки, поскольку я обнаружил, что это всегда снижает производительность.
Поэтому я думаю, что ответ FOR ME по крайней мере — удалить SLEEP и просто выполнить работу как можно быстрее, чтобы не было подключений Apache, ожидающих использования сервера во время выполнения сценария.
Если я доберусь до стадии, когда у меня возникнут проблемы, я переместлю задание CRON во внутренний вызов CRON к заданию PHP, чтобы все процессы APACHE были свободны для использования. Однако скорость является ключевым вопросом.
Спасибо за ваши идеи, хотя.
Других решений пока нет …