Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja kodu
Forum PHP.pl > Forum > PHP
kr3t
Przy wykorzystaniu klasy phpmailer probuje wyslac min 100 maili ....

teraz przy wysyłce osobnej do 10 adresatow osiagam czas wykonania skryptu 6-7 sekund...

a na serwerze jest limit 30 sekund i po tym czasie wywala error 500 :/

Czy ktos moze podpowiedziec co zrobic by skrypt wykonywal sie szybciej?

Z gory dziekuje!


  1.  
  2. <?
  3.  
  4. include "mysql_db.php";
  5. $baza = new MyDb;
  6.  
  7. require_once('class.phpmailer.php');
  8.  
  9. //pobieranie adresow maili z poprzedniego formularza
  10.  
  11. $size = sizeof($_POST["adres"])-1;
  12. for($i=0;$i<=$size;$i++) {
  13. echo $_POST["adres"][$i];
  14. }
  15.  
  16.  
  17. require_once('class.phpmailer.php');
  18.  
  19. $mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch
  20.  
  21. $mail->Host = ".."; // SMTP server
  22. $mail->SMTPDebug = 2; // enables SMTP debug information (for testing)
  23. $mail->SMTPAuth = true; // enable SMTP authentication
  24.  
  25. $mail->Host = ".."; // sets SMTP server
  26. $mail->Port = 587;
  27.  
  28. $mail->Username = "..."; // username
  29. $mail->Password = ">."; // password
  30.  
  31. for($i=0;$i<=$size;$i++)
  32. {
  33.  
  34. try {
  35.  
  36. $mail->AddReplyTo('...', 'test');
  37. $mail->SetFrom('mailing@...', 'test');
  38. $mail->Subject = $_POST["temat"];
  39. $mail->AddAttachment('ll.jpg'); // attachment
  40. $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  41.  
  42. $tresc2=nl2br($_POST["tresc"]);
  43. $tresc="<body style=\"margin: 10px;\"><div style=\"width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 11px;\">".$tresc2."
  44. <Br /><Br />";
  45.  
  46.  
  47. $mail->MsgHTML($tresc);
  48. $adres = $_POST["adres"][$i];
  49. $mail->AddAddress($adres);
  50.  
  51. if(!$mail->Send())
  52. {
  53.  
  54. //echo "Mailer Error (" . str_replace("@", "@", . $_POST["adres"][$i] . ') ' . $mail->ErrorInfo . '<br />';
  55. }
  56. else
  57. {
  58. echo "Message sent to :" . $_POST["adres"][$i] . ' (' . str_replace("@", "@", $row["email"]) . ')<br />';
  59. }
  60. echo "Message Sent OK</p>\n";
  61.  
  62. } catch (phpmailerException $e) {
  63. echo $e->errorMessage(); //Pretty error messages from PHPMailer
  64. } catch (Exception $e) {
  65. echo $e->getMessage(); //Boring error messages from anything else!
  66. }
  67. $mail->ClearAddresses();
  68.  
  69. }
  70. $mail->SmtpClose();
  71. ?>
wry
wywa polaczenie z baza jesli go nie uzywasz
wypisanie do przegladarki moze dlugo trwac
wiec moze usun blok miedzy linia 1 a 16
wyciagnij z petli ustawianie tych atrybutow ktore sa niezmienne (subject, replayto itd)
kr3t
zeszlo tylko do 6 sekund.... :/
Blame
Wiem, że to rozwiązanie to nie rozwiązanie ale może po prostu zwiększ limit i po sprawie.
korro
Witam.
Ja takie rzeczy robię w tle.
Mała funkcja:
  1. function launchBackgroundProcess($call) {
  2. if(is_windows()){
  3. pclose(popen('start /low /b '.$call, 'r'));
  4. }
  5. else {
  6. pclose(popen($call.' /dev/null &', 'r'));
  7. }
  8. return true;
  9. }
  10. function is_windows(){
  11. if(PHP_OS == 'WINNT' || PHP_OS == 'WIN32') {
  12. return true;
  13. }
  14. return false;
  15. }

i wywołanie:
  1. launchBackgroundProcess('php -f plik.php');

Użytkownik nie czeka na długie zadanie.
kr3t
to konto www jest na nazwa . pl

i tam jest limit 30 sek na wykonanie skryptu php :/

a w tle.. hmm to nadal skrypt bedzie wykonywany przez dluzej - to wtedy sie omija limity?
Sky_walker
możesz też tak:
1) skorzystać z wewnętrznej funkcji php do maili i nie łączyć się z SMTP - nawiązanie połączenia jest czasochłonne
2) kolejnych odbiorców dodawaj w pole BCC zamiast w pole TO - wtedy wyśle do wszystkich za jednym połączeniem z usługą poczty (przydatne i dla php'owego mail i dla połączenia SMTP).
korro
Limit czasu nie obowiązuje w tym przypadku, ponieważ jest to zwykłe polecenie systemu operacyjnego.
piotr94
tylko że nie wszystkie serwery zezwalają na polecenia systemowe ;-)
ja bym to zrobił tak:
po wysłaniu każdego mejla sprawdzasz czas. jeśli zbliża się on do 30 s, to przerywasz działanie skryptu i dajesz
  1. header('Location:http://www.aaa/plik.php?wznow_od_id='.$id_ostatnio wysłanego mejla);

i powinno być git ;-)
Thorang Hoog
Nigdy nie używałem tej klasy ale temat mnie interesuje także poszukałem i znalazłem winksmiley.jpg funkcja
  1. $mail->AddAddress($adres);
dodaje adres do tablicy. Podczas wysyłania wiadomości wysyła pod wszystkie adresy jednocześnie.
Dlatego wystarczy w pętli umieścić:
  1. $adres = $_POST["adres"][$i];
  2. $mail->AddAddress($adres);

Ciekawe do ilu czas teraz zejdzie.
wry
to nie jest dobre rozwiazanie bo wszyscy dostana maila z adresami innych do ktorych zostal on wyslany
korro
Zostaje jeszcze kolejkowanie.
Tabela w bazie, do której dodajesz rekordy - jeden rekord to jeden adres mail, treść etc.
Do crona dodajesz zadanie które co jakiś czas pobiera dane, wysyła maila i zmienia status w kolejce na wysłano.
Thorang Hoog
Znalazłem w klasie phpmailer taką zmienną:
  1. /**
  2. * Provides the ability to have the TO field process individual
  3. * emails, instead of sending to entire TO addresses
  4. * @var bool
  5. */
  6.  
  7. public $SingleTo = false;


Po zmianie wartości na true wyśle pojedyncze maile do użytkowników.
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.