Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Osobny wątek mailowy
Forum PHP.pl > Forum > PHP
armon
Witam,

Czy da się zrobić tak, aby osoba wizytująca stronę nie musiała oczekiwać na zakończenie wysyłanie maila przez skrypt php?

Chodzi oto, aby wysłać maila w osobnym wątku np. powiadamiającego o błędzie na stronie albo też gdy klient złoży zamówienie to żeby nie musiał oczekiwać aż się maile powiadamiające powysyłają.

Na jakie metody w php manual powinienem zwrócić uwagę, aby to uzyskać? Znacie jakiś tutek odnośnie tego tematu?

Pozdrawiam
MGraphics
Zawsze, można zapisywać maila do jakiejś tablicy i pózniej cornem niezależnie sobie to przesyłać.
armon
Można dać rozkaz do Crona z poziomu PHP?
MGraphics
Corn to usługa serwera on porusza jakis skrypt.

Czyli np co 10 min wysyła maile jeżeli 3 uzytkowników akurat chciało wysłać w tym czasie sobie maila to kazdy otrzyma go za ileś tam minut.
armon
W sytuacji wysyłania błędów jest to dobre rozwiązanie, ale w sytuacji zamówienia jest bardzo złe. Mail ma zostać wysłany praktycznie natychmiast. Więc ma ktoś inny pomysł?
Crozin
Masz jakieś rzeczywiste opóźnienia związane z wysłaniem pojedynczego maila do użytkownika w momencie złożenia zamówienia? To dosyć dziwna sytuacja. Wysłanie takiego maila powinno być praktycznie nieodczuwalne dla samego PHP. Sam serwer SMTP mógłby z jakiś tam powodów wstrzymać wysłanie wiadomości, ale to nie powinno blokować dalszego wykonywania skryptu. Mógłbyś opisać konfigurację serwera HTTP / SMTP?

Jeżeli jednak problem rzeczywiście istnieje to można go dosyć prosto rozwiązać. Daemon w PHP, który odczytuje z jakiejś bazy danych maile do wysłania i wysyła je. Mógłby to robić w właściwie dowolnych cyklach czasowych, np. co 5-20 sekund. Cron mógłby tu zostać użyty co najwyżej do wznawiania działania daemona, gdyby z jakiegoś powodu przestał działać (np. jakiś błąd albo restart serwera).
armon
No jeden mail to nie problem.

Ale wysyłane są 3-4. Jeden informujący klienta, jeden informujący właściciela i tak dalej...

No i wtedy czas oczekiwania to ok. 3-4 s przez co czasem niecierpliwi klikają co popadnie, bo myślą, że im się przeglądarka zawiesiła ^^

Zapytanie jest AJAXowe, i potrzebuje informacji z pliku PHP, więc nie może być asynchroniczne ;/

Crozin
Wysłanie trzech czy czterech maili również nie powinno mieć specjalnego odbicia w czasie wykonywania skryptu, mógłbyś przedstawić pełną konfigurację swojego skryptu?
armon
Wysyłam z pomocą PHPMailera łącząc się z kontem google. SMTPKeepAlive jest ustawiony na true.

Nie da się zrobić tak, że jeden skrypt .php uruchamia inny skrypt .php, nie czekając na wykonanie tego drugiego? Takie rozwiązanie byłoby najlepsze.
mls
Na unixowym systemie bez problemu:
  1. exec('/sciezka/do/php skrypt.php &');
Crozin
1. Mógłbyś przy pomocy profilera sprawdzić co tak na prawdę zajmuje tak dużo czasu - wtedy byłoby znacznie łatwiej znaleźć rozwiązanie.
2. Oczywiście, że można. Podałem już rozwiązanie z drugim skryptem działającym jako daemon w systemie.

@mls: Tak długo jak to możliwe nie powinno się korzystać ze specyficznych dla systemu elementów. wink.gif
MOCNY
Witam,
To mój pierwszy post, więc witam wszystkich serdecznie! smile.gif
Mam podobny problem, mianowicie nie wysyłają mi się maile, jeśli puszczę coś w 'tle'.

Cytat(mls @ 6.03.2012, 15:17:00 ) *
Na unixowym systemie bez problemu:
  1. exec('/sciezka/do/php skrypt.php &');


Właśnie tej funkcji używam, cały skrypt poza wysłaniem maila się wykonuje (odpisywanie danych do bazy itd...).
Problemu nie ma, jeśli skrypt odpalę w przeglądarce, w tedy maile dochodzą. Ale takie odpalenie skryptu jest dość nie wygodne, ponieważ liczy on się w zależności od 'kodu raportu', czyli może się liczyć nawet godzinę...

Ktoś miał podobny problem z wysyłaniem maila poprzez odpalenie skryptu poprzez 'exec'?
!*!
To wpisz w konsoli:
Cytat
php plikZkodemExec.php &
MOCNY
Cytat(!*! @ 8.05.2013, 19:03:05 ) *
To wpisz w konsoli:


Nie mam niestety dostępu do konsoli ;/
Ogólnie sporo mam skryptów które się odpalają w innym wątku i się przeliczają w tle, ten też działa, dochodzi do końca, ale maila nie wysyła, no chyba że się odpali go w przeglądarce.

A zapomniałem dodać, że jak odpalam skrypt normalnie w przeglądarce, to rzyga mi takkim komunikatem:

Kod
Deprecated: Function set_magic_quotes_runtime() is deprecated in /var/www/html/shd/class.phpmailer.php on line 1218 Warning: fread(): Length parameter must be greater than 0 in /var/www/html/shd/class.phpmailer.php on line 1219 Deprecated: Function set_magic_quotes_runtime() is deprecated in /var/www/html/shd/class.phpmailer.php on line 1222 Deprecated: Function eregi() is deprecated in /var/www/html/shd/class.phpmailer.php on line 592 Message has been sent


No ale mail jest wysyłany...

Oj chyba będzie z tym ciężko, popytam na jakichś zagranicznych forach, może pomogą smile.gif
Jak się uda, to dam znać.

Zauważyłem, że odpalając procedurę w tle, zwraca następujący błąd:

Kod
Error: The following SMTP Error: Data not accepted.adres@mail.com


Odświeżę temat, do tej pory nie znalazłem rozwiązania.
Mam następujący log, może ktoś będzie wiedział w czym problem.

Kod
> SMTP -> get_lines(): $data was ""
> SMTP -> get_lines(): $str is "220 mx1.cyfrowypolsat.pl ESMTP Cyfrowy Polsat S.A.
> "
> SMTP -> get_lines(): $data is "220 mx1.cyfrowypolsat.pl ESMTP Cyfrowy Polsat S.A.
> "
> SMTP -> FROM SERVER:
> 220 mx1.cyfrowypolsat.pl ESMTP Cyfrowy Polsat S.A.
> SMTP -> get_lines(): $data was ""
> SMTP -> get_lines(): $str is "250-mx1.cyfrowypolsat.pl
> "
> SMTP -> get_lines(): $data is "250-mx1.cyfrowypolsat.pl
> "
> SMTP -> get_lines(): $data was "250-mx1.cyfrowypolsat.pl
> "
> SMTP -> get_lines(): $str is "250-PIPELINING
> "
> SMTP -> get_lines(): $data is "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> "
> SMTP -> get_lines(): $data was "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> "
> SMTP -> get_lines(): $str is "250-SIZE 104857600
> "
> SMTP -> get_lines(): $data is "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> "
> SMTP -> get_lines(): $data was "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> "
> SMTP -> get_lines(): $str is "250-ETRN
> "
> SMTP -> get_lines(): $data is "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> "
> SMTP -> get_lines(): $data was "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> "
> SMTP -> get_lines(): $str is "250-STARTTLS
> "
> SMTP -> get_lines(): $data is "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> "
> SMTP -> get_lines(): $data was "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> "
> SMTP -> get_lines(): $str is "250-AUTH PLAIN CRAM-MD5 LOGIN
> "
> SMTP -> get_lines(): $data is "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> 250-AUTH PLAIN CRAM-MD5 LOGIN
> "
> SMTP -> get_lines(): $data was "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> 250-AUTH PLAIN CRAM-MD5 LOGIN
> "
> SMTP -> get_lines(): $str is "250-AUTH=PLAIN CRAM-MD5 LOGIN
> "
> SMTP -> get_lines(): $data is "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> 250-AUTH PLAIN CRAM-MD5 LOGIN
> 250-AUTH=PLAIN CRAM-MD5 LOGIN
> "
> SMTP -> get_lines(): $data was "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> 250-AUTH PLAIN CRAM-MD5 LOGIN
> 250-AUTH=PLAIN CRAM-MD5 LOGIN
> "
> SMTP -> get_lines(): $str is "250-ENHANCEDSTATUSCODES
> "
> SMTP -> get_lines(): $data is "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> 250-AUTH PLAIN CRAM-MD5 LOGIN
> 250-AUTH=PLAIN CRAM-MD5 LOGIN
> 250-ENHANCEDSTATUSCODES
> "
> SMTP -> get_lines(): $data was "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> 250-AUTH PLAIN CRAM-MD5 LOGIN
> 250-AUTH=PLAIN CRAM-MD5 LOGIN
> 250-ENHANCEDSTATUSCODES
> "
> SMTP -> get_lines(): $str is "250-8BITMIME
> "
> SMTP -> get_lines(): $data is "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> 250-AUTH PLAIN CRAM-MD5 LOGIN
> 250-AUTH=PLAIN CRAM-MD5 LOGIN
> 250-ENHANCEDSTATUSCODES
> 250-8BITMIME
> "
> SMTP -> get_lines(): $data was "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> 250-AUTH PLAIN CRAM-MD5 LOGIN
> 250-AUTH=PLAIN CRAM-MD5 LOGIN
> 250-ENHANCEDSTATUSCODES
> 250-8BITMIME
> "
> SMTP -> get_lines(): $str is "250 DSN
> "
> SMTP -> get_lines(): $data is "250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> 250-AUTH PLAIN CRAM-MD5 LOGIN
> 250-AUTH=PLAIN CRAM-MD5 LOGIN
> 250-ENHANCEDSTATUSCODES
> 250-8BITMIME
> 250 DSN
> "
> SMTP -> FROM SERVER:
> 250-mx1.cyfrowypolsat.pl
> 250-PIPELINING
> 250-SIZE 104857600
> 250-ETRN
> 250-STARTTLS
> 250-AUTH PLAIN CRAM-MD5 LOGIN
> 250-AUTH=PLAIN CRAM-MD5 LOGIN
> 250-ENHANCEDSTATUSCODES
> 250-8BITMIME
> 250 DSN
> SMTP -> get_lines(): $data was ""
> SMTP -> get_lines(): $str is "334 VXNlcm5hbWU6
> "
> SMTP -> get_lines(): $data is "334 VXNlcm5hbWU6
> "
> SMTP -> get_lines(): $data was ""
> SMTP -> get_lines(): $str is "334 UGFzc3dvcmQ6
> "
> SMTP -> get_lines(): $data is "334 UGFzc3dvcmQ6
> "
> SMTP -> get_lines(): $data was ""
> SMTP -> get_lines(): $str is "235 2.7.0 Authentication successful
> "
> SMTP -> get_lines(): $data is "235 2.7.0 Authentication successful
> "
> SMTP -> get_lines(): $data was ""
> SMTP -> get_lines(): $str is "250 2.1.0 Ok
> "
> SMTP -> get_lines(): $data is "250 2.1.0 Ok
> "
> SMTP -> FROM SERVER:
> 250 2.1.0 Ok
> SMTP -> get_lines(): $data was ""
> SMTP -> get_lines(): $str is "554 5.7.1 : Helo command rejected: HELO lies, you are not localhost.localdomain
> "
> SMTP -> get_lines(): $data is "554 5.7.1 : Helo command rejected: HELO lies, you are not localhost.localdomain
> "
> SMTP -> FROM SERVER:
> 554 5.7.1 : Helo command rejected: HELO lies, you are not localhost.localdomain
> SMTP -> ERROR: RCPT not accepted from server: 554 5.7.1 : Helo command rejected: HELO lies, you are not localhost.localdomain
>
> SMTP -> get_lines(): $data was ""
> SMTP -> get_lines(): $str is "554 5.7.1 : Helo command rejected: HELO lies, you are not localhost.localdomain
> "
> SMTP -> get_lines(): $data is "554 5.7.1 : Helo command rejected: HELO lies, you are not localhost.localdomain
> "
> SMTP -> FROM SERVER:
> 554 5.7.1 : Helo command rejected: HELO lies, you are not localhost.localdomain
> SMTP -> ERROR: RCPT not accepted from server: 554 5.7.1 : Helo command rejected: HELO lies, you are not localhost.localdomain
>
> SMTP -> get_lines(): $data was ""
> SMTP -> get_lines(): $str is "250 2.0.0 Ok
> "
> SMTP -> get_lines(): $data is "250 2.0.0 Ok
> "
> SMTP -> FROM SERVER:
> 250 2.0.0 Ok
> Message could not be sent.
Mailer Error: SMTP Error: The following recipients failed
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.