Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Newsletter, przechowywanie listy odbiorców, Szybkie przetworzenie 50-150tys rekordów
grzegory
post 7.06.2008, 22:17:07
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 7.06.2008

Ostrzeżenie: (0%)
-----


Witajcie,
Mam taki o to problem. Mianowicie jestem w trakcie pisania newslettera/mailingu. Ma on być dość rozbudowany, wiadomości będą rozsyłane do firm pobieranych z bazy według roznego typu kryteriow (czas obecnosci w bazie, slowo kluczowe, grupa itd), akurat to nie jest najważniejsze.

Do tej pory pisząc mniejsze mailingi robiłem to dość prosto, formularz zawierał checkboxy z adresami i sie zaznaczało do kogo mają być wysłane maile.

Korzystałem przy tym z dwóch tabel:
Tabela: mailing = id | tytul | tresc | (...dodatkowe kolumny typu załączniki)
Tabela: mailing_send = id | id_mailing | email
Nastepnie robiłem:
SELECT `mailing`.*, `mailing_send`.* FROM `mailing`.`id`=`mailing_send`.`id_mailing`
Po pomyślnym wysłaniu rekord był kasowany... Proste i bardzo skuteczne. Zbyt proste.

Sprawdzało się to przy małej ilości adresów do rozesłania. W przypadku newslettera o którym teraz piszę, będzie zachodzić potrzeba wysłania 50-150tys maili. Nie wyobrażam sobie zbytnio ładowania wszystkich wybranych według kryteriów adresów. Chyba, że jest na to jakiś szybki sposob. Zrobiłbym to w pętli while jak przy normalnym pobieraniu kolejnych rekordów z bazy.

Co mi chodzi po głowie.
Co zrobić aby optymalnie przygotować listę adresów email do których mają zostać wysłane wiadomości? Przeznaczenie pod 50-150tys rekordów. Należy zaznaczyć, że w tym samym czasie może być rozsyłanych kilka róznych newsletterów z różną listą odbiorców.
Go to the top of the page
+Quote Post
mike
post 7.06.2008, 22:24:52
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Co masz na myśli pisząc "ładowania"?

A odnośnie tematu, to jeśli maile są personalizowane to nie pozostaje Ci nic innego jak wysyłać pojedynczo. Jeśli natomiast każdy otrzymuje identycznego maila to możesz je wysyłać w paczkach, powiedzmy po 100 (100 adresów w polu bcc). I taka paczka co jakiś czas. pół minuty czy ileśtam sekund.

A odnośnie obciążenia bo chyba o to Ci chodzi to 150tys rekordów dla bazy to śmieszne pierdnięcie. Jakbyś ich miał klika(naście) milionów to można sie zastanawiać, ale przy tej ilości to pikuś.
Go to the top of the page
+Quote Post
grzegory
post 7.06.2008, 22:29:56
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 7.06.2008

Ostrzeżenie: (0%)
-----


Przez załadowanie mówię tu o skopiowaniu odpowiednich adresów do przykładowej tabeli mailing_send (takiej jak w temacie.

Czy 150tys rekordów to piardniecie? Niesądzę, żeby PHP poradziło sobie z czyms takim lekko:
  1. <?php
  2. $q = mysql_query("SELECT * FROM ....... WHERE [tu warunki]");
  3. while($row = mysql_fetch_assoc($q))
  4.  {
  5. mysql_query("INSERT ........");
  6.  }
  7. ?>
Go to the top of the page
+Quote Post
mike
post 7.06.2008, 22:33:44
Post #4





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Cytat(grzegory @ 7.06.2008, 23:29:56 ) *
Niesądzę, żeby PHP poradziło sobie z czyms takim (...)
No staaaary, ale takie rzeczy to sie robi jednym zapytaniem.
INSERT ... SELECT Syntax
Go to the top of the page
+Quote Post
grzegory
post 7.06.2008, 22:43:21
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 7.06.2008

Ostrzeżenie: (0%)
-----


Wiem o tym. Tak planowałem postąpić. Jednak...

Przykładowo, masz dwie tabele:
test1: id, grupa, mail
test2: id, mail

Wykonanie zapytania:
  1. <?php
  2. INSERT INTO `test2` SELECT `mail`, `grupa` FROM `test1` WHERE `grupa`='2'
  3. ?>

Spowoduje to wstawienie w `test2`.`mail` wartosci z `test1`.`grupa`... A nie o to chodzi... Chyba ze masz na to jakies rozwiazanie, bo moze cos w tym zapytaniu robię zle poprostu?
Go to the top of the page
+Quote Post
mike
post 7.06.2008, 22:49:42
Post #6





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Cytat(grzegory @ 7.06.2008, 23:43:21 ) *
Spowoduje to wstawienie w `test2`.`mail` wartosci z `test1`.`grupa`... A nie o to chodzi... Chyba ze masz na to jakies rozwiazanie, bo moze cos w tym zapytaniu robię zle poprostu?
Dam linka jeszcze raz: INSERT ... SELECT Syntax. Przeanalizuj dokładniej wszystkie możliwości składni INSERT ... SELECT tongue.gif
Go to the top of the page
+Quote Post
grzegory
post 7.06.2008, 23:01:43
Post #7





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 7.06.2008

Ostrzeżenie: (0%)
-----


Albo sie nie rozumiemy, albo zle kombinuje i rozumuje.
Wiem, że chodzi Ci o przykład z komentarzy w manualu:
  1. <?php
  2. INSERT newtable (user,age,os) SELECT table1.user,table1.age,table2.os FROM table1,table2 WHERE table1.user=table2.user;
  3. ?>



Jednak gdy robię takie zapytanie:
  1. <?php
  2. INSERT INTO `test2`(`mail`) SELECT `test1`.`mail`, `test1`.`grupa` FROM `test1` WHERE `grupa`='2'
  3. ?>


To zwraca błąd - kolumna nieistnieje...
Zas gdy dam tak:
  1. <?php
  2. INSERT INTO `test2`(`id`, `mail`) SELECT `test1`.`mail`, `test1`.`grupa` FROM `test1` WHERE `grupa`='2'
  3. ?>

To w `test2`.`mail` umieszcza mi `test1`.`grupa`...

Z tego wynika, że ilość kolumna które są wypełniane, musi być równa ilości kolumn z pobieranego zapytania. Nie o to chodzi. Zapytanie SELECT będzie miało wiele warunków, pewnie będą połączenia, dziwne rzeczy.. może być ich nawet kilkanaście. Zaś w tabeli `test2` zawsze bedzie mialo dwie kolumny id, mail. Czyli -według moich testów - niezadziała.
Go to the top of the page
+Quote Post
mike
post 7.06.2008, 23:06:38
Post #8





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Owszem zapytanie SELECT będzie miało wiele warunków ale koniec końców niezależnie od warunków zapytania powinieneś wyciągać dwie informacje - id i mail. Bo tylko to wstawiasz. Bo co Ci wyciągać grupę?

Jeśli wyciągniesz tylko id i mail to ilość pól w zbiorze wyników SELECT i w tabeli test2 będzie taka sama:
  1. INSERT INTO `test2`(`id`, `mail`) SELECT `test1`.`id`, `test1`.`mail` FROM `test1` WHERE `test1`.`grupa`='2'


Ten post edytował mike 7.06.2008, 23:07:06
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.06.2025 - 00:54