Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mailing na ovh-10000 maili dziennie
Forum PHP.pl > Forum > PHP
kaznodzieja
Witam!

Posiadam serwer wirtualny na ovh. Mam na nim dostęp do crona z najczęstszym wywołanie co godz. Chcę wysłać około 10 000 maili dziennie. Problem w tym że ovh udostępnia tylko funkcje mail() i blokuje SMTP(PhpMailer nie działa). Czy ktoś ma pomysł jak zorganizować taka wysyłkę maili z wykorzystaniem crona i bez robienia paczek. Czy skrypt który będzie miał 500 razy wywołana funkcje mail nie spowoduje zablokowanie konta lub przeciążenia serwera?
Dumdas
Wątpię, żeby to przeciążyło serwer...
A jak:
mail($do, $temat, $tresc); wywołane x razy i tyle.
cakper
Jednym z rozwiązań jest kolejkowanie maili np w bazie danych, następnie odpalanie z crona skryptu do wysyłania np co 5 min i z każdym wywołaniem pobierać z bazy i wysyłać np 50 maili. Powinno przejść a dodatkowo będziesz miał dość skalowalny system (np możesz wysyłać maile z kilku serwerów i będą korzystały tylko z jednej bazy).
Taka jest moja sugestia winksmiley.jpg
thek
Myślę, że przy takim odświeżaniu najlepiej zrobić sobie skrypt odpalający sam siebie. Za jednym uruchomieniem cron i standardowym czasem trwania skryptu 30 sekund poślesz może 200-500 maili, zależnie od tego co w mailingu robisz i jak obrabiasz treść. Przy 24 odpaleniach na dobę moższ nie uzyskać 10k maili. By to osiągnąć musisz obejść 30 sekundowy limit trwania skryptu. Nawet na forum tu kiedyś pisałem prawie gotowca jak to zrobić. Chodzi o to, by skrypt po wysłaniu iluś maili uruchamiał sam siebie jako "nowy wątek" a stary zamykał. Robiłby to tak długo, aż nie zakończyłby wysyłki. A to czy wysłałby 1.000 czy 100.000 to już nieważne dla niego. Istotną wadą tego rozwiązania jest niemożliwość zatrzymania tego skryptu w zasadzie inaczej niż użycie kill w powłoce lub restart usługi, więc to ryzykowne zagrane bez dokładnego sprawdzenia i przemyślany warunek STOP jest tu niezbędny bo inaczej zajedziesz serwer.

@Capker... Przeczytaj posta kolegi dokładnie... Ma Crona do wywołania co godzinę jedynie a nie co 5 minut. Takie kolejkowanie więc nie ma sensu, bo 50 maili co godzinę nie zda egzaminu. Skrypt musi być uruchomiony raz, ale nie może zostać zatrzymany po 30 sekundach przez serwer jako "nie odpowiadający" czy "zawieszony". Może zajść sytuacja, że będzie musiał pracować kilka minut, na co niemal żaden usługodawca nie pozwala. Tak więc rozwiązanie z wywoływaniem rekurencyjnym skryptu jest moim zdaniem jednym z nielicznych, o ile nie jedynym jakie dało by radę to zrobić.
kaznodzieja
thek pomysł całkiem ciekawy tylko jak pisałeś dość ryzykowny! Jak dla mnie wadą jest to że nie umiem pisać w obiektach. Pamiętasz może gdzie pisałeś o tym prawie gotowcu, a może masz sprawdzone i działające takie rozwiązanie?

Dumdas no właśnie wydaje mi się że mogło by to przeciążyć bo przecież to by było wywołanie kilku jest funkcji w prawie jednoczesnej chwili. A po za tym możliwe że jest ograniczenie ilość wysyłanych wiadomości jednocześnie.
cakper
thek, sorry - mój błąd winksmiley.jpg biję się w pierś
kaznodzieja
A czy takie rozwiązanie jest dobrym pomysłem. O północy tworze liste maili do wysłanie. Co godzine wywołuje crona i wysyłam po 100 maili a po nich wywołuje funkcje
usleep(10000000); // czeka 10 sek

Szukając po sieci nalazłem http://www.webcron.pl/. Zewnętrzny cron tylko że serwis wstrzymał działaność, a czy znacie darmowego takiego crona?
cakper
Apropo pomysłu podanego przez Ciebie to możesz skorzystać z dowolnego serwera posiadającego crona (np od znajomego winksmiley.jpg ) i tam wymuszać wywołanie twojego skryptu np przez ściągnięcie go (coś ala "wget www.domena.pl/adres_skryptu.php").

Z usleepem też można spróbować, głupie to nie jest.
Dumdas
google nie gryzie....
pierwszy wynik przy "cron free":
online cron jobs
thek
Pomysł jest ryzykowny, ale dobrze zaprogramowany skrypt sam się zatrzyma. Podstawa to dobry warunek zatrzymujący "wątki". Ja miałem to zrobione tak, że po uruchomieniu pobierałem paczkę danych do mailingu, usypiałem skrypt na ileś sekund (by nie zajeżdżać serwera), a po obudzeniu robiłem co trzeba i wywoływałem nowy, stary jednocześnie killując. Sztuczka polegała na tym, że każdy w mailingu miał flagę w postaci daty. Jeśli skrypt kogoś przerobił, temu flaga się ustawiała na datę aktualną, niezależne czy maila wysyłał czy nie. A paczki nowe pobierał tylko spośród tych, którzy ową datę mieli inną niż aktualna. W ten sposób liczba stale się zmniejszała, aż nie było nikogo z inną datą niż aktualna. W tym momencie skrypt sam się zatrzymywał. I tak też w owym poście opisałem to rozwiązanie, ale gdzie on jest to niestety musiałbym w "Szukajce" pogrzebać smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.