Buon giorno a tutti,
mi trovo a dover eseguire una modifica/aggiunta ad un sito esistente, sempre fatto dal sottoscritto.
Attualmente il cliente ha la possibilità di inserire nouve newsletter dal pannello di amministrazione: titolo e testo della medesima. Volendo puo' metterne anche più di una, vengono salvate sul db e inviate in ordine di inserimento.
Come? Ho un file php che esegue un controllo sull'esistenza o meno di newsletter da inviare nel db, se la risposta è affermativa, prende 50 mail dal db delle mail, cicla e le invia. Il tutto è gestito da un crontab che passa ogni ora ed esegue la medesima cosa, riprende la prima newsletter disponibile, estrae le 50 mial successive ed invia, così fin quando non ha esaurito tutte le mail, alla fine setta la newsletter nel db come inviata e passa alla successiva, sempre che ve ne siano.
Fin qui tutto ok, nessun problema, niente di strano diciamo.
Ora per motivi che non sto qui a spiegare, vi è la necessità di farne una nuova affiancata a quella esistente, ma automatizzata, ovvero, nel sito esistono due sezioni di news, dato che il cliente prepara ed invia newsletter ad ogni morte di papa, vorrei far inviare in automatico le news delle due categorie di cui prima.
Il prolema non sta nell'eseguire la query che mi estrae le news (quelle ancora attive piuttosto che le ultime 5, ecc,ecc), ma nella logica della cosa.
Quindi, attualmente abbiamo un crontab che esegue ogni ora il controllo e l'invio a 50 mail delle newsletter generali. Chiaramente il db delle mail iscritte è uno solo e il procedimento che uso è: estraggo le 50 mail le ciclo, inserisco il nome e cognome dell'utente registrato, compilo la mail, invio e spunto il campo "inviata", in questo modo dovrei evitare al masimo reinvii o mancati invii per qualsiasi motivo e la query di estrazione è sempre LIMIT 0,50 andando ad estrarre solo le mail che non hanno la spunta su "inviata".
Ora dovendo far eseguire una nuova newsletter che pesca le mail dal medesimo db, sorgono dei dubbi su come procedere.
Pensavo, faccio fare un controllo in più alla attuale newsletter, se ho qualcosa da inviare ma anche la seconda newsletter sta inviando, mi fermo e ricontrollo tra un ora se la seconda ha finito, ovviamente anche la nouva newsletter deve eseguire il medesimo controllo.
Poi però mi sono reso conto di una cosa, se la prima newsletter esegue il controllo ed ha da inviare e la seconda invece no, parte ed invia le prime 50 mail, dopo un ora torna, esegue il medesimo controllo e diciamo che invia altre 50 mail (e siamo a 100), la terza ora però anche la seconda newsletter si rende conto di aver qualcosa da inviare, ma si ferma perche la prima sta lavorando, peccato che quando la prima che ha gia inviato 100 mail, torna a controllare sa di avere qualcosa da inviare ma vede che anche la seconda ha pronti degli invii....e si ferma....e qui casca l'asino e crolla il castello di carte.
Allora mi son detto, faccio tre crontab, due ogni ora e uno settimanale, i primi due passano ogni ora ed eseguono gli eventuali invii, il trezo passa settimanalmente per compilare la eventuale newsletter delle news, ma solo se la prima non sta facendo altro, i questo modo ovvio al problema, se la newsletter generale sta inviando non genero la seconda newsletter, così al sucessivo invio della prima non ho uno stop, quando avrà finito al sucessivo controllo genererò la newsletter delle news e di conseguenza partiranno anche i rispettivi invii fermando la partenza di eventuali nouve newsletter generali.
Un po' contorto? Forse si, soprattutto perchè se sono in programma 5 newsletter generali, probabilmente ci impiega più di una settimana a mandarle tutte e 5 a tutti gli utenti registrati, posticipando sempre la creazione e l'invio della newsletter delle news, che nel frattempo decaderanno o addirittura verranno cancellate perchè ormai vecchie....sgrunt.
Ora che ho scritto il decamerone...sorry...l'unico modo che rimane è aggiungere nella tabella delle mail un campo in più, tipo "inviata2", su cui far agire gli invii della newsletter delle news così non ho più la necessità di controllare e femarne per forza una delle due.
I due crontab però passerebbero entrambi ogni ora, non è che si incasinano eseguendo query simultanee e invii simultanei, che diventerebbero 100 e non 50 a botta?
Scusate la lnghezza del post, ma la sintesi non è il mio forte, si accettano consili.
Grazie
SK