За последние 24 часа нас посетили 16427 программистов и 1555 роботов. Сейчас ищут 877 программистов ...

обработка большого массива (50-100к значений) в цикле

Тема в разделе "Прочие вопросы по PHP", создана пользователем Lex243, 14 май 2011.

  1. Lex243

    Lex243 Активный пользователь

    С нами с:
    15 дек 2010
    Сообщения:
    16
    Симпатии:
    0
    Имеется массив,не важно чего,допустим,пользователей,выбранный из MySQL,с каждым пользователем нужно произвести какую либо операцию,например,отправить ему сообщение в личку,или письмо с уведомлением.(UPDATE для всех в таблицу не прокатит,если допустим письмо нужно выслать на почту,поздравить с праздником.)
    Логично предположить,что мы банально не успеем обойти весь массив,до истечения времени работы скрипта,а если увеличим его то вызовем огромную нагрузку на сервер.

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

    Может есть более элегантные решения?
     
  2. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    cron :)
     
  3. Lex243

    Lex243 Активный пользователь

    С нами с:
    15 дек 2010
    Сообщения:
    16
    Симпатии:
    0
    А зачем тут крон если все запускается по желанию пользования?

    Или я не совсем понимаю всю глубину его глубин?
     
  4. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    чего о_О
     
  5. Lex243

    Lex243 Активный пользователь

    С нами с:
    15 дек 2010
    Сообщения:
    16
    Симпатии:
    0
    ну крон используется чтобы запускать скрипт,в определенное время,тут же все запускат пользователь
     
  6. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    пока пользователь лазит по станичке. Ajax в роли секректного агента начинает прослушивать сервер на предмет заданий для выполнения и выполняет их :D

    бредовое решение конечно.
     
  7. lexinfo

    lexinfo Активный пользователь

    С нами с:
    16 янв 2007
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Тебе надо оптимизировать запрос и перезавать нагрузку на SQL, потому что пихапе долго всю эту конитель будет елозить.

    Ты делаешь так:

    PHP:
    1. foreach ($a as $b)
    2. {
    3.       insert into tabla set a=$b['name']...;
    4. }
    а попробуй так:

    PHP:
    1. $insert_arr=array();
    2.  
    3. foreach($query as $row)
    4. {
    5.     $insert_arr[]=array("name"=>$row,"text"=>$row["text"]);
    6. }
    7.  
    потом делаешь мульти вставку

    PHP:
    1. $str_insert="INSERT INTO tabla ('name','text') VALUES ";
    2. $foreach($insert_arr as $insert_row)
    3. {
    4.     $str_insert.=sprintf("('%s','%s'),",$insert_row['name'],$insert_row['text']);
    5. }
    6. #и выполняем всего 1 запрос вместо 1000
    7. mysql_query($str_insert);
    Для рассылки писем советую создать таблу для очереди писем, и кроном их рассылать и удалять из очереди. Можно поставить крон на выполнение на каждую минуту и отсылать письма пачками по 100-200 штук. Хотя если текст письма одинаковый, рассылку можно оптимизировать, указывая в 1 письме несколько получателей. В опсчем пили напильником, оптимизируй, иначе с хоста выгонят=)
     
  8. lexinfo

    lexinfo Активный пользователь

    С нами с:
    16 янв 2007
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    А вообще унаследуй новый класс от класса БД и в нем реализуй такую систему мульти-вставки. Чтоб ты ему давал массив, а он сам его делил на пачки и вставлял. Для рассылки юзай phpmailer.
     
  9. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Lex243
    не слушай что тут холиварят. Ъ пацаны делают так:

    при необходимости рассылки писем, пользователь помечает/генерирует в базе те письма, которые необходимо отослать.
    есть скрипт, который при запуске проверят, есть ли в базе письма, помеченные для отправки, и, если есть, берёт первые 100 писем и отсылает их. данный скрипт запускается каждые 3-5 минут с помощью крона.
    как только все письма будут отосланы, при запуске скрипт будет видеть, что писем для отсылки больше нет, и больше делать ничего не нужно.
     
  10. lexinfo

    lexinfo Активный пользователь

    С нами с:
    16 янв 2007
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Уважаемый ТРУ Ъ пацан gromo, не копируй мои мессаги.
     
  11. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    lexinfo
    извиняюсь, не заметил. со мной такое бывает =))))