Email kuldes user altal megadott idopontban
Egy rendszeren dolgozok ahol a servernek a user altal megadott idopontban email-t kellene kuldenie, ha nincs megadva idopont akkor pedig ejfelkor minden nap.
Ezt en szemely szerint ugy csinalnam, hogy a user az email kuldes idejet 5 perces intervallumokban adhatja meg (pl: 10:05, 10:10, 10:15-kor...stb) es 5 percenkent cron-al ellenoriznem,h kell -e emailt kuldeni. Viszont igy ugye 5 percenkent cron fut a serveren.
Van erre valami jobb megoldas?!
Olyasmire gondolok, hogy lehet olyat, hogy egyszer elinditok egy scriptet a serveren es az fut allandoan es ellenoriz 5 percenkent vagy ilyesmi.
Vagy a cron x-idokozonkent kikerulhetetlen?
re: Email kuldes user altal megadott idopontban
Nem kell ehhez cron. Elindítasz egy háttérben futó folyamatot. Egy php szkriptet mondjuk. A szkript 1 perces intervallumonként csekkolja, hogy a mostani idő >= kért idő. Utána már csak egy elágazás és oda a kiküldés kódja.
Valahogy így kell:
HTML kód:
php -f email.php &
PHP kód:
while(true){
// $legkozelebbi_email_idopontja-t sql lekérdezéssel beállítod, select MIN(időpont) bla bla
if(time() >= $legkozelebbi_email_idopontja ){
// levélküldés itt
}
sleep(60000); // 1 perc
}
re: Email kuldes user altal megadott idopontban
Idézet:
earnnet eredeti hozzászólása
Nem kell ehhez cron. Elindítasz egy háttérben futó folyamatot. Egy php szkriptet mondjuk. A szkript 1 perces intervallumonként csekkolja, hogy a mostani idő >= kért idő. Utána már csak egy elágazás és oda a kiküldés kódja.
Valahogy így kell:
HTML kód:
php -f email.php &
PHP kód:
while(true){
// $legkozelebbi_email_idopontja-t sql lekérdezéssel beállítod, select MIN(időpont) bla bla
if(time() >= $legkozelebbi_email_idopontja ){
// levélküldés itt
}
sleep(60000); // 1 perc
}
erre gondoltam en is, marmint, hogy beteszem vegtelen ciklusba, de nem fogja a server idotullepes miatt leallitani a scriptet egy ido utan? vagy ha beledobok egy set_time_limit(0)-et, az megoldja ?
re: Email kuldes user altal megadott idopontban
Sleep nem számít a futási időbe. Hátránya, hogy foglalja a memóriát.
re: Email kuldes user altal megadott idopontban
Amikor megtörténik a lekérdezés, lesznek ugyan új változók és foglalt memória, de ezek invalidálódnak (és ezzel felszabadítják a memóriát), amint a vezérlés a blokk végére ér. De ha nem bízol benne, ott van még az unset.
Tehát van egy ciklusmagod n-es tárigénnyel (ott már elágazásokkal mindent meg lehet oldani) és esetleg előtte egy sql kapcsolat létrehozás konstans tárigénnyel. De semmiképp sem négyzetes, így biztos nem fogja felemészteni a memóriát. Ha nincsenek benn globális változók, szivárogni se fog.
re: Email kuldes user altal megadott idopontban
Miért nem jó a cron?
Csak egy egyszerű időzített futtatás. Vagy tévedek?
re: Email kuldes user altal megadott idopontban
Idézet:
Miért nem jó a cron?
Nagyobb az erőforrásigénye és nem megbízható. Pl. cronnal minden futtatáskor létre kell hozni és bezárni a mysql kapcsolatot. Ha valamilyen egyéb túlterheltségi okból ez a vártnál több időt vesz igénybe, előfordulhat, hogy több folyamat egyszerre akarja magának az adatbázist, és dead lock alakul ki. Ez persze nem valószínű, de előbb-utóbb be fog következni, ha egy kampány miatt hirtelen több látogató lesz. Mi pedig azt szeretnénk, ha a szélsőséges esetekben se fagyna le a mysql.
re: Email kuldes user altal megadott idopontban
- Egyszerü osztott tárhelyennem futtathatsz daemont
- A mysql zárja a kapcsolatokat (interaktiv timeout)
- A daemon megirása, újra indítása, debugolása sokkal nehezebb mint egy egyszerü parancssori php file-nak
- A daemon futását ellenőrizni kell valamivel, hiszen bármilyen okból megálhat
- A több daemon párhuzamos futását szintén ki kell zárni
- A php daemon módban hajlamos memory leak-eket produkálni. Van olyan rendszer most a kezem alatt ahol 4 szerveren kb 1000 php-ban megirt damon fut, mindegyik folyamatosan nézi a használt memória méretét, és ha túl lép egy limiten, akkor leállítja magát.
Szóval szerintem az 5 percenként bekérdezel a db-be, hogy mit kell kiküldeni az bőven egyszerübb mint egy daemont megirni
re: Email kuldes user altal megadott idopontban
Idézet:
TLoF eredeti hozzászólása
- A daemon megirása, újra indítása, debugolása sokkal nehezebb mint egy egyszerü parancssori php file-nak
- A daemon futását ellenőrizni kell valamivel, hiszen bármilyen okból megálhat
- A php daemon módban hajlamos memory leak-eket produkálni. Van olyan rendszer most a kezem alatt ahol 4 szerveren kb 1000 php-ban megirt damon fut, mindegyik folyamatosan nézi a használt memória méretét, és ha túl lép egy limiten, akkor leállítja magát.
Ezeket god-al(God - A Process Monitoring Framework in Ruby) eleg egyszeru managelni, viszont en is ugy gondolom, hogy erre egy cron az idealis megoldas, vagy esetleg reactphp(React), amiben gondolom van valamilyen next tick event es azon le lehet kerdezni az azon a percen belul kuldendo emailek listajat.
re: Email kuldes user altal megadott idopontban
// a react egzotikus meg minden, de akinek ilyen igényei vannak, ideje kinőnie a phpból