Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: rozsylanie maili
Forum PHP.pl > Forum > Gotowe rozwiązania
arti1
A teraz cos takiego:

w MySQL'u trzymam adresy email (kolo 1000). Chce zrobic wysylanie - wybieram najpierw do kogo (np. dla osob w wieku 10 -20lat). Wpisuje tresc (html).

Dobra, teraz chce wyslac (w skrocie):
[php:1:4c51decccd]<?php


#do kogo
$query = "SELECT DISTINCT email FROM tabela";
$mysql_result = mysql_query($query, $mysql_link);
while($row = mysql_fetch_row($mysql_result))
{
$do = $row[0];

$from = "ARTI<adres@wp.pl>";

$mailheaders="From: $fromn";
$mailheaders.="Reply-To: $fromn";
$mailheaders.="X-Mailer: PHPn";
$mailheaders.="MIME-version: 1.0n";
$mailheaders.="Content-type: text/html; charset=iso-8859-2";

$wyslij=mail($do, $temat, $tresc, $mailheaders);

}
?>[/php:1:4c51decccd]


Z tym, ze przy wysylce do duzej ilosci osob (ok.500-1000) wykonywanie skryptu bedzie trwało długo.
Mysle nad takim rozwiazaniem - wysyla 50 maili i przeładowuje strone, pokazuje sie napis: wysłano do pierwszej 50-tki osob, prosze czekac wysylanie trwa nadal. Co kolejne 50 wyslanych maili, niech sie przeładowuje strona i pojawia kolejny napis. Jak to zrobić?

Samo przeładowywanie to wiem że można użyć js (location.replace).

co ważne:
wszystko sie odgrywa w pliku do ktorego kieruja dwa submity i sa warunki:
[php:1:4c51decccd]<?php


if( isset($_POST['podglad']) )
{
//pokazuje podglad
}
else if( isset($_POST['krok2']) )
{
//tu jest caly proces wysylania
}
?>[/php:1:4c51decccd]
jest to o tyle wazne ze przy przeładowywaniu strony może chyba być problem ze spełnieniem tego drugiego warunku.. czy nie?questionmark.gif

Wsumie to sądze, że całość będzie oparta o pobieranie rekordów z parametrami
Kod
LIMIT $start,$po_ile
i przekazywanie zmiennych, które zmienią te parametry. Ale nie jestem w tym zbyt obcykany wiec prosze o wskazówki, czy dobrze kombinuje.
BzikOS
Proszę kod php umieszczać w znacznikach [php].
talee
Cytat
A teraz cos takiego:
Mysle nad takim rozwiazaniem - wysyla 50 maili i przeładowuje strone, pokazuje sie napis: wysłano do pierwszej 50-tki osob, prosze czekac wysylanie trwa nadal. Co kolejne 50 wyslanych maili, niech sie przeładowuje strona i pojawia kolejny napis. Jak to zrobić?


Kombinujesz dobrze, ale znowu pod górę. Do tego typu akcji używa się register_shutdown_function(). Jeszcze raz podkreślam, że nie próbuję ci dowalić.

Pomyśl sobie tak: jak będziesz komplikował sobie rzeczy proste to co dopiero zrobisz z trudnymi.
HaRy
hmm ... a nie lepiej poprostu zwiekszyc maksymalny czas dla wykonywania skryptu? ...

odpowiada za to zmienna max_execution_time zawarta w php.ini.

mozesz zmodyfikowac jej wartosc z poziomu sktyptu (domyslnie jest to 30s.) za pomoca funkcji [manual:5c14c1b51a]ini_set[/manual:5c14c1b51a] w sposob nastepujacy:

[php:1:5c14c1b51a]<?php
ini_set('max_execution_time',600); // 600 sekund
?>[/php:1:5c14c1b51a]
Szkoda czasu na komplikowanie sobie zycia ...

Pozdrawiam.
kicaj
a moze ignore_user_abort(); ale nie jestem pewnien czy zrozumialem
spenalzo
Problem z wysyłką załatwia takie coś:
[php:1:8c019c05a8]<?php
ignore_user_abort(true);
set_time_limit(0);

//
// wyciaganie z bazy
//

echo "<meta http-equiv="Refresh" content="0; URL=innastrona.php">";

//
// tutaj wysyłanie
//
?>[/php:1:8c019c05a8]
To zabezpieczy przed kliknieciem odśwież i powtórna wysyłką, a także przed przewaniem pracy poprzez naiciśniecie "Stop" czy przekroczenie czasu pracy.
arti1
niestety nie działa mi:
[php:1:d63ec81981]<?phpset_time_limit(0);

?>[/php:1:d63ec81981]

wyskkuje bład:
Kod
Cannot set time limit in safe mode


Co moge zrobić, jesli nie mam u mnie na serwerze pliku php.ini. Jak wyłączyć tryb bezpieczny? Warto?


Aha i mam jeszcze takie pytanko:
widzialem kiedys (na jakims forum) cos takiego, ze po klikniecie WYSLIJ przycisk robil sie nieaktywny (DISABLED jak mniemam). Moze to byłoby dobrym sposobem na zabezpieczenie przed kliknięciem drugi raz....?
Ale jak to zrobić (pewnie przy pomoicy onClick... ale jak?)
kicaj
no zapomniales jeszcze ignore_user_abort(true);
[php:1:870428a208]<?php
ignore_user_abort(true);
set_time_limit(0);
?>[/php:1:870428a208]
arti1
nie podałem tego w poscie ale nie zapomnialem ignore_user_abort(true);

mam dokladnie tak jak podales
[php:1:7a5c320751]<?php
ignore_user_abort(true);
set_time_limit(0);
?>[/php:1:7a5c320751]

i wciaz mi sie wyswietla
Kod
Cannot set time limit in safe mode


w manualu jest napisane:
Kod
Ostrzeżenie

set_time_limit() has no effect when php is running in tryb bezpieczny. There is no workaround other than turning off safe mode or changing the time limit in the php.ini.


co mam zrobić? - nie mam dostępu do ustawień php ani nie mam na serwerku pliku php.ini
tiraeth
Powiem jedno: Nie masz szans... serwer, na którym masz konto WWW ma ustawioną opcję safa_mode (więcej o nim znajdziesz na http://php.net ) aaevil.gif
mateuszkrzeszowiec
Małe pytanko: jak zareaguje serwer na żądanie wysłania 2000 maili (newsletter)? Nie zakrztusi się? Czy będzie wysyłał w miarę możliwości? No bo w pętelce bym chciał wysyłać...

Nie chciałbym odbierać wściekłych mailii/telefonów od admina winksmiley.jpg

Wiem oszywiście że zależy to od konfiguracji itp ale ja o taką zdroworozsądkową odpowiedź proszę winksmiley.jpg
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.