fido20
6.04.2005, 04:17:10
Witam,
Na swojej stronie mam system subskrypcji, dla ludzi którzy podadzą swojego maila rozsyłana jest wiadomość w momencie gdy ktoś z użytkowników doda na stronę nową informację. Niestety obecne rozwiązanie jest dosyć uciążliwe dla tych osób które informację dodają , a mianowicie problem tkwi w tym że niektórzy mają po 200 - 300 subsryptorów (nie wiem jak to napisac ) . Czas potrzebny na pobranie danych o mailach i wysłanie na każdy adres odpowiedniego maila , przekracza maksymalny czas oczekiwania przeglądarki na odpowiedź z serwera. Co za tym idzie użytkownik zamiast zobaczyć potwierdzenie dodania informacji widzi "Nie można wyświetlić strony ...". Wpadłem na pomysł żeby sam proces rozsyłania maili był realizowany w ten sposób , że kawałek kodu odpowiedzialny za rozsyłanie umiesciłbym w oddzielnym pliku który byłby wykonywalny z powłoki i nie zwracał żadnych informacji zwrotnych do użytkownika, (tak jakby wykonywany byłby w tle) . Nie wiem czy dobrze wytłumaczyłem o co mi chodzi , może dam tu prosty przykład . Użytkownik dodaje info, info wpisywane jest do bazy danych , jeżeli wpisało się ok , wysyłane jest polecenie do systemu "uruchom skrypt wyslij.php z parametrem user = nazwa uzytkownika" a kolejna linijka kodu to potwierdzenie dodania wpisu do bazy wyświetlana w przeglądarce użytkownika. W tym miejscu chciałbym się spytać , czy to wogle jest do zrealizowania i czy rozwiąże to problem przekraczania czasu na odpowiedz z serwera . No i ew czy jest jakieś inne , lepsze, bardziej eleganckie , ogólnie lepsze rozwiązanie takiego problemu . Problem ten pojawia się gdy użytkownik ma "zapisanych na siebie" z 100 - 200 maili .
Pozdrawiam
scanner
6.04.2005, 06:24:59
Wybranie adresów z bazy i wysłanie meila zajmuje więcej niż 30 sekund?
Masz niezły bajzel w kodzie moim zdaniem.
albo serwer smiga na jakims starym procku:)
DavidPL
6.04.2005, 09:09:56
Mam inną propozycje.
Maile wysyłasz w pętelce, więc w pętelce możesz także sprawdzać czas działania skryptu. Jeśli przekroczy powiedźmy 25 sekund robisz zrzut tego co pozostało do sesji, a użytkownikowi pokazujesz informację (może być w %) ile już się wysłało i robisz odświeżenie strony i wysyłasz kolejne dane.
Może nie jest to jakiś super wyrafinowany sposób ale pozwili użytkownikowi kontrolować proces wysyłania i zapewni mu podgląd stanu wysyłki.
fido20
6.04.2005, 10:54:37
Cytat(scanner @ 2005-04-06 07:24:59)
Wybranie adresów z bazy i wysłanie meila zajmuje więcej niż 30 sekund?
Masz niezły bajzel w kodzie moim zdaniem.
Kod odpowiedzialny za wysyłke wygląda tak
<?php
$sql = \"SELECT mail FROM tabela WHERE user='$uzytkownik'\";
{
$mail = $wiersz['mail'];
$wiadomosc = \"tresc\";
$header = \"From: rnReply-To: rn\";
mail (\"$mail\", \"temat\", $wiadomosc, $header); }
?>
Nic innego nie przyszło mi do głowy , nie wiem czy jest tu jakiś bałagan , aż tak zaawanosowany nie jestem by to ocenić
Nie wysyłaj tych maili w pętli.
Zainteresuj się jakąś klasą, która robi to na poziomie bezpośredniej komunikacji z serwerem SMTP.
Np.:
PHPMailer
fido20
10.04.2005, 12:23:16
Cytat(mike_mech @ 2005-04-06 12:26:30)
Nie wysyłaj tych maili w pętli.
Zainteresuj się jakąś klasą, która robi to na poziomie bezpośredniej komunikacji z serwerem SMTP.
Np.:
PHPMailer Za Twoją radą zainteresowałem się to klasą , jednak nie wiem jak ją wykorzystać aby nie używając pętli wysłać jednego maila do wielu osób
mike
10.04.2005, 12:49:23
<?php
require(\"class.phpmailer.php\");
$objMail = new PHPMailer();
$objMail->From = \"list@mydomain.com\";
$objMail->FromName = \"List manager\";
$objMail->Host = \"smtp1.site.com\";
$objMail->Mailer = \"smtp\";
$arrEmail = array( 'jeden@serwer.pl', 'dwa@serwer.pl', 'trzy@serwer.pl', 'cztery@serwer.pl' );
$objMail->Body = 'Body';
for( $i = 0
, $intLast = count( $arrEmail ); $i < $intLast; $i++ ) {
$objMail->AddAddress( $arrEmail[ $i ] );
}
$objMail->Send();
?>
fido20
10.04.2005, 13:00:15
A może wiesz czy jest jakiś sposób żeby "przysłonić" te wszystkie adresy email np zeby zamiast serwer@jede.pl; serer@dwa.pl ... bylo tylko np Subskrypcja (w polu do jak się list np w outlooku otworzy)
Jakby to dało sie jeszcze zrobić byłoby po prostu super
mike
10.04.2005, 13:29:16
Przyznam że nie za bardzo wiem o co ci chodzi ( nie używam Outlook'a ), ale podejrzewam że o to :
<?php
require(\"class.phpmailer.php\");
$objMail = new PHPMailer();
$objMail->From = \"list@mydomain.com\";
$objMail->FromName = \"List manager\";
$objMail->Host = \"smtp1.site.com\";
$objMail->Mailer = \"smtp\";
array( 'jeden@serwer.pl', 'Mike' ), array( 'dwa@serwer.pl', 'Ziutek' ), array( 'trzy@serwer.pl', 'Koleś' ), array( 'cztery@serwer.pl', 'Ktoś' ) );
$objMail->Body = 'Body';
for( $i = 0
, $intLast = count( $arrEmail ); $i < $intLast; $i++ ) {
$objMail->AddAddress( $arrEmail[ $i ][ 0 ], $arrEmail[ $i ][ 1 ] );
}
$objMail->Send();
?>