Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите с файлом
 
 автор: Valeri   (01.12.2005 в 03:30)   письмо автору
24 Кб
 
 

Проблема такая. Есть файл, прикрепил его, он обсчитывает стату и делает рассылку, запускается по крону, можно вручную запускать но суть не в этом.
Проблема в том, что при большой рассылки очень грузится сервак, эксперементирую уже давно, но что то нечего пока хорошего не выходит. Прикрепил родной файл, так как прикреплять все эксперементальные не вижу смысла.
Задача стоит простая, как вроде может показаться со стороны, зделать так что бы файл работал 30 секунд, а потом завершал работу ну скажем по таймауту. Перепробовал уже кучу вариантов и не хочет он выходить по таймауту. Если он начал производить рассылку то прет ее до победного.
Если у кого есть какие идеи буду очень признателен.

   
 
 автор: cheops   (01.12.2005 в 14:16)   письмо автору
 
   для: Valeri   (01.12.2005 в 03:30)
 

1) Каждому пользователю рассылается уникальный отчёт или один и тот же?
2) Хм... а нельзя организовать несколько cron-запусков? Запускаем cron каждые 5 минут в течении 2-х часов. За одни раз скрипт отсылает 10 писем и сохраняет текущую позицию и время отправки в файл, в следующий раз скрипт читает информацию из файла и отправляет следующие 10 писем сохраняя текущую позицию. Если текущая позиция превышает число пользователей, ничего не делаем. Число писем и время можно оптимизировать в зависимости от нагрузки.

   
 
 автор: Valeri   (01.12.2005 в 20:38)   письмо автору
 
   для: cheops   (01.12.2005 в 14:16)
 

вообще самое идеальное разбить его на 2 части.
1 часть на обсчет статы
2 часть на рассылку

всем пользователям шлется одно и то же сообщение.
насчет того что бы он сохранял сколько и кому разослал, так это он и так делает, к примеру если запустить этот файл в ручную и подождать 30 сек а потом его закрыть, то он к примеру успет отослать за это время 100 писем из 1000, если его запустить опять через 5 минут то он начнет отсылать следующим пользователям и опять к примеру его закрыть и он успет отослать опять только 100.
Все это хорошо, но хотелось бы что бы его не закрывать каждый раз вручсную, а что бы запустил его и он сам отработал 30 сек и завершил работу, через 5 минут запустился и опять 30 сек отработал и завершился.
А так же при запуске через крон, запустил его крон он отработал 30 сек и завершился, крон его запустил снова через 5 минут, если письма не разосланы все то он продолжает расылку и через 30 сек завершил работу и т.д.
А если нет раслки то конечно нечего не делает а сразу завершает работу.
Я так понимаю, что в принципе это и было примерно так задамано, только почему то н работает.

   
 
 автор: Loki   (01.12.2005 в 20:52)   письмо автору
 
   для: Valeri   (01.12.2005 в 20:38)
 

http://softtime.ru/forum/read.php?id_forum=3&id_theme=9801&page=1
Тут я приводил скрипт работающий подобным образом: посчитывает время и записывает промежуточную информацию по дотижению заданного времени.

   
 
 автор: Valeri   (01.12.2005 в 21:38)   письмо автору
 
   для: Loki   (01.12.2005 в 20:52)
 

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

   
 
 автор: cheops   (02.12.2005 в 00:26)   письмо автору
 
   для: Valeri   (01.12.2005 в 20:38)
 

Кстати, вот что можно оптимизировать и снизить нагрузку - у вас я как понял каждое письмо отправляется при помощи отдельной функции mail(). Можно воспользоваться почтовым заголовком Bcc, который осуществляет массовую рассылку с сокрытием адресатов друга (в отличие от заголовка Cc).

   
 
 автор: Valeri   (02.12.2005 в 01:29)   письмо автору
 
   для: cheops   (02.12.2005 в 00:26)
 

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

   
 
 автор: cheops   (02.12.2005 в 14:11)   письмо автору
 
   для: Valeri   (02.12.2005 в 01:29)
 

Подробнее можно посмотреть в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=7487. Всё сводится к тому, что требуется добавить заголовок
<?php
$headers
.="Bcc: sidor@mysite.ru\r\n";
$headers.="Bcc: sidor1@mysite.ru\r\n";
$headers.="Bcc: sidor2@mysite.ru\r\n";
?>

столько раз, сколько "слепых" копий вы хотите отправить.

   
 
 автор: Valeri   (02.12.2005 в 16:53)   письмо автору
 
   для: cheops   (02.12.2005 в 14:11)
 

с этим понятно, но как это реализовать в скрипте, ведь там идет обыкновенный цикл, вытащил емайл-отправил, опять вытащил-отправил, а при вашем варианте значит надо как то вытаскивать сразу несколько емайлов и подставлять их.

   
 
 автор: cheops   (03.12.2005 в 00:34)   письмо автору
 
   для: Valeri   (02.12.2005 в 16:53)
 

Хм... тут лучше оперировать конструкцие LIMIT в SQL-запросе, позволяющей ограничивать число извлекаемых записей. Но более конкретно сказать сложно, так как неизвестна структура таблиц и код достаточно жёстко оптимизирован, так что его сложно уже читать.

   
 
 автор: Valeri   (03.12.2005 в 01:09)   письмо автору
 
   для: cheops   (03.12.2005 в 00:34)
 

я понял как вы предлогаете зделать, но в этом случае придется перекраивать почти весь скрипт, а это все таки напряжно.
хорошо поставим вопрос немного подругому.
есть цикл выборки из базы и по рассылке писем, функция в самом низу скрипта, как можно прикрутить к этому циклу что бы он к примеру выполнялся только 100 раз а потом завершал работу. но при этом после какого то время когда крон подаст команду на зауск скрипта он снова начал крутить данный цикл и так же после отсылки 100 писем завершался ?
надеюсь я ясно выразил свою мысль ?

   
 
 автор: cheops   (03.12.2005 в 13:04)   письмо автору
 
   для: Valeri   (03.12.2005 в 01:09)
 

К сожалению, все отступы нарушены и найти цикл невозможно, какой из этих циклов несёт отвественность за рассылку?
<?php
while ($row=@mysql_fetch_row($keywords))
while(
$row=@mysql_fetch_array($userlist)){ 
while(
$row=@mysql_fetch_array($getclicks)){
while(
$row=@mysql_fetch_array($getads)){ 
while(
$fields=@mysql_fetch_row($getfields)){
while(
$row=@mysql_fetch_array($getrow)){ 
while(
$row=@mysql_fetch_array($getrow)){
while (
$user=@mysql_fetch_array($users))
?>

   
 
 автор: Valeri   (03.12.2005 в 13:19)   письмо автору
 
   для: cheops   (03.12.2005 в 13:04)
 

вообще то по идеи цикл рассылки идет тут

<?
if ($user['email_setting']>0){
sendmassmail($user[email],trim($subject),trim($message), "Return-Path: ".massmail_email."\nFrom: \"".system_value('site_name')."\" <".system_value("massmail_email").">\nReply-To: ".system_value("massmail_email")."\nX-Mailer: Cash Crusader\n".$high);  
list(
$junk,$emaildomain)=split("@",$user[email]);
$emaildomainct[$emaildomain]++;
}} 
@
mysql_query("update ".mysql_prefix."mass_mailer set current=current+1 where massmailid=$massmail[massmailid]"); 
}
?>

   
 
 автор: cheops   (03.12.2005 в 13:29)   письмо автору
 
   для: Valeri   (03.12.2005 в 13:19)
 

А я так понял у вас что-то похожее уже делается. Т.е. за цикл формирует запрос
<?php
$users
=@mysql_query("select signup_date,signup_ip_host,password,first_name,last_name,email,email_setting,".mysql_prefix."users.username from ".mysql_prefix."users where email_setting>=0 and account_type!='canceled' and vacation<'$curdate' order by signup_date limit $thisstart,$massmail[stop]");
?>

Конструкция limit начинает выборку с позиции $thisstart и выполняет $massmail[stop] позиций. Т.е. $massmail[stop] должно быть равно 100.

   
 
 автор: Bronepoz[)   (03.12.2005 в 13:46)   письмо автору
 
   для: Valeri   (01.12.2005 в 03:30)
 

А не проще убрать лимит времени функцией set_time_limit(0);

   
 
 автор: Valeri   (03.12.2005 в 21:06)   письмо автору
 
   для: Bronepoz[)   (03.12.2005 в 13:46)
 

$massmail[stop] берется из графы таблицы заданий на рассылку. то есть если к примеру на сайте зарегино 4000 пользователей, а мне надо отправить только 200, то $massmail[stop] будет равна 200. так что если ей конкретно указать 100, то и рассылка будет идти только 100 пользователям.
конечно если как то извернутся то можно попробовать использовать этот вариант.

насчет set_time_limit(0); пробовал, она почиму то игнорируется.

вообще основной нагруз идет по памяти, у меня такая мысля мелькнула, в php.ini выставлено использовать память для выполнения скрипта 8М, а если поставить 16 или 32М, то это как то может спасти ?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования