Δημιουργία Cron Job

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δημιουργία Cron Job

Δημοσίευση από geomagas » 03 Απρ 2014 15:26

txc έγραψε:βασικά πρώτη ερώτηση, η μεγάλη διαφορά σου σε σχέση με αυτό που λέω εγώ είναι ότι πρέπει να διαχειρίζεσαι πολλούς αποστολείς newsletter οι οποίοι θέλουν να στείλουν email
Δεν "πρέπει", απλά μπορείς.
txc έγραψε:εγώ έχω 5 site π.χ. σε διαφορετικές βάσεις δεδομένων, πως θα κάνω μια σούμα όλων των newsletter που θέλουν να σταλούν την ίδια στιγμή έτσι ώστε να ξεκινήσω να τα βάζω σε μια ουρά?
Για να είσαι "παντός καιρού", θα πρέπει να φτιάξεις ένα 6ο service που θα ακούει σε ένα ξεχωριστό domain και θα έχει πίσω του μία βάση. Τα client sites θα επικοινωνούν μαζί του με http (back-to-back) και θα προσθέτουν e-mails στην κεντρική ουρά. Ο cron θα τριγκάρει μία διαδικασία στο κεντρικό, και μόνο σε αυτό.

Αυτό όμως είναι ολόκληρο project, και υπερβολικό για την περίσταση (αν θέλεις, το συζητάμε).

Θα σου έλεγα να ορίσεις ένα από τα 5 να παίζει αυτόν το ρόλο, με τη δική του βάση.
Θα υπάρχει ένα σύνολο κώδικα σε ξεχωριστό directory που θα τον μοιράζονται και τα πέντε, ώστε οι διαδικασίες να είναι κοινές.
Ο κώδικας αυτός θα περιλαμβάνει οτιδήποτε χρειάζεται για να επικοινωνήσεις με τη βάση, να κάνεις enqueue τα mail, και τέλος τον dispatcher.

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Δημιουργία Cron Job

Δημοσίευση από nbc » 03 Απρ 2014 16:20

Το πρόβλημα δεν αφορά scheduling (θέλω να κάνω κάτι στο μέλλον), αλλά throttling (θέλω να κάνω κάτι τώρα, αλλά με μειωμένα γκάζια). Κακώς η συζήτηση περιστρέφεται γύρω από το cron.

Επιπροσθέτως, οποιαδήποτε λύση είναι βασισμένη στο cron, ξεκινά με γκολ από τα αποδυτήρια, καθώς αφορά το *nix, άρα η εφαρμογή δεν παίζει στα Windows. Συν τοις άλλοις, λύσεις που απαιτούν shell commands, open_basedir, κλπ, είναι καταδικασμένες να αποτύχουν στην πλειοψηφία των shared πακέτων.

Υπό ιδανικές συνθήκες, το throttling είναι δουλειά του MTA. Προτείνω στον @txc να κοιτάξει πρώτα τι mail server διαθέτει το πακέτο του και αν έχει αυτήν τη δυνατότητα.

Αν δεν, τότε υπάρχει μια quick & dirty λύση των 2 εντολών και δευτερολέπτων, για υλοποίηση του throttling σε επίπεδο PHP:

Πας στο function που στέλνει τα mails, και βάζεις στην αρχή του (πριν το loop) μια set_time_limit(0). Στη συνέχεια, προσθέτεις ένα sleep(8) στο τέλος του loop σου.

Problem solved, πας γι άλλα...


Υ.Γ.: Αν θες να το κάνεις και μουράτο, προσθέτεις στο loop και τη flush(), για να κάνεις update το interface (progress bar). Βάζεις και ένα [Abort] και είσαι άρχοντας.

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δημιουργία Cron Job

Δημοσίευση από geomagas » 03 Απρ 2014 16:27

nbc έγραψε:Αν δεν, τότε υπάρχει μια quick & dirty λύση των 2 εντολών και δευτερολέπτων, για υλοποίηση του throttling σε επίπεδο PHP:

Πας στο function που στέλνει τα mails, και βάζεις στην αρχή του (πριν το loop) μια set_time_limit(0). Στη συνέχεια, προσθέτεις ένα sleep(8) στο τέλος του loop σου.

Problem solved, πας γι άλλα...
Εννοείς δηλαδή ότι αυτό λύνει το συγκεκριμένο πρόβλημα που συζητάμε;

txc
Δημοσιεύσεις: 627
Εγγραφή: 02 Δεκ 2003 23:08

Δημιουργία Cron Job

Δημοσίευση από txc » 03 Απρ 2014 21:19

το sleep το έχω βάλει αλλά δυστυχώς δε παίζει και τόσο καλά

ειδικά με τη mail function

το έκανα με sleep(5) και να στέλνει σε πακέτο email αλλά πολλά γύρισαν πίσω

το πακέτο που έχω επιτρέπει 500 emails ανά ώρα

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δημιουργία Cron Job

Δημοσίευση από geomagas » 03 Απρ 2014 21:41

Η ώρα έχει 3600 δευτερόλεπτα.
Με sleep των 5'' προσπαθείς να στείλεις 3600/5=720 e-mails. Ξεφεύγεις κατά 220.
Αν βάλεις 8'' που είπε ό nbc, τότε πας για 3600/8=450 e-mails. Σου περισσεύουν δηλαδή και 50.

txc
Δημοσιεύσεις: 627
Εγγραφή: 02 Δεκ 2003 23:08

Δημιουργία Cron Job

Δημοσίευση από txc » 03 Απρ 2014 21:48

geomagas έγραψε:Η ώρα έχει 3600 δευτερόλεπτα.
Με sleep των 5'' προσπαθείς να στείλεις 3600/5=720 e-mails. Ξεφεύγεις κατά 220.
Αν βάλεις 8'' που είπε ό nbc, τότε πας για 3600/8=450 e-mails. Σου περισσεύουν δηλαδή και 50.
ναι αλλά θα πρέπει να κάνω sleep(3600) έτσι ώστε το επόμενο σετ email να φύγει μετά από μια ώρα και να φύγουν τα επόμενα

τώρα κατά πόσο θα μπορεί να παίξει το sleep(3600) για τόσο μεγάλο χρονικό διάστημα ούτε ξέρω

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δημιουργία Cron Job

Δημοσίευση από geomagas » 03 Απρ 2014 21:52

Υποθέτω ότι εννοεί sleep( 8 ) μετά από κάθε e-mail, ώστε να φεύγει ένα κάθε 8'', δηλαδή 450 στην ώρα. Αλλιώς δεν έχει καν νόημα...

(Disclaimer: Προσπαθώ να το εξηγήσω θέλοντας να βοηθήσω. Εγώ δεν προτείνω τέτοια λύση.)

txc
Δημοσιεύσεις: 627
Εγγραφή: 02 Δεκ 2003 23:08

Δημιουργία Cron Job

Δημοσίευση από txc » 03 Απρ 2014 21:58

geomagas έγραψε:Υποθέτω ότι εννοεί sleep( 8 ) μετά από κάθε e-mail, ώστε να φεύγει ένα κάθε 8'', δηλαδή 450 στην ώρα. Αλλιώς δεν έχει καν νόημα...

(Disclaimer: Προσπαθώ να το εξηγήσω θέλοντας να βοηθήσω. Εγώ δεν προτείνω τέτοια λύση.)
ο αρχικός μου κώδικας είναι αυτός, για να διαλέγω πρώτα τα 350 που θέλω

Κώδικας: Επιλογή όλων

$emails = mysql_query("SELECT newsletterid,newsletteremail FROM newsletter where enabled='0' limit 350") or die(mysql_error());								
   while ($sendemail = mysql_fetch_array($emails))
   {
   $email = $sendemail["newsletteremail"];
   $id = $sendemail["newsletterid"];
   $query2 = mysql_query("update newsletter set enabled='1' where newsletterid='$id' ") or die(mysql_error());	   
    mail($email,$subject,$s,$headers);
	}
εσύ λες να βγάλω το limit350 και κάτω από το mail() να βάλω sleep( 8 )

άρα ούτε το update θέλω, αφού το sleep θα κάνει τη δουλειά που θέλω

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δημιουργία Cron Job

Δημοσίευση από geomagas » 03 Απρ 2014 22:03

Για το update δεν ξέρω, εγώ θα το κρατούσα για logging.
EDIT: Τελικα σου χρειάζεται, γιατί τώρα είδα ότι το enabled το φιλτράρεις στο select.

Αλλά ναι, με αυτή τη λογική, το limit δεν σου χρειάζεται.

txc
Δημοσιεύσεις: 627
Εγγραφή: 02 Δεκ 2003 23:08

Δημιουργία Cron Job

Δημοσίευση από txc » 03 Απρ 2014 22:04

να σου πω την αλήθεια με φοβίζει το συνεχόμενο sleep για τόσο αριθμό email

βέβαια με τη set_time_limit το κάνεις απεριόριστο αλλά και πάλι

EDIT : ναι το είδα θα το τροποποιήσω κατάλληλα αυτό

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δημιουργία Cron Job

Δημοσίευση από geomagas » 03 Απρ 2014 22:06

Χεχε! Δεν ξέρω, ο nbc σίγουρα θα είναι σε θέση να σου λύσει αυτές τις απορίες.

Εγώ εμμένω στη δική μου υλοποίηση.

txc
Δημοσιεύσεις: 627
Εγγραφή: 02 Δεκ 2003 23:08

Δημιουργία Cron Job

Δημοσίευση από txc » 03 Απρ 2014 22:15

και ένα θέμα είναι οτι ο χρήστης θα δει το site κολλημένο όταν πατήσει αποστολή μάλλον γιαυτό ο φίλος λέει για τη flush()

αλλα δεν την έχω χρησιμοποιήσει για να ξέρω

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Δημιουργία Cron Job

Δημοσίευση από jpk » 12 Απρ 2014 13:03

Και όμως είναι πολύ βασανισμένο ερώτημα που οι δύο λύσεις που είναι προφανείς ποτέ δεν δούλεψαν για εμάς. Δεν θα επεκταθώ γιατί ... αλλά το sleep θα ήταν πολύ καλό μόνο που η ίδια η PHP δεν το υποστηρίζει σε πάρα πολλές δικές της προεκτάσεις (το PDO είναι το πρώτο που σκέφτομαι αλλά δεν είναι το μόνο). Από την άλλη το default των cron jobs δεν υποστηρίζει ανά x δευτερόλεπτα.
Λύση αλυσίδα: Όταν τρέχει κάπου το γράφω και όταν σταματά το διαγράφω. Άρα ξέρω κάθε στιγμή αν τρέχει άλλο ίδιο proccess. Οπότε αν δεν τρέχει το τρέχω και καλώ το επόμενο μετά από x seconds ...
Λύση Shell Script: Το sleep δουλεύει όπως θα έπρεπε σε shell script ... Οπότε έχω ένα shell script στο server που κάνει αυτή την δουλειά , φροντίζοντας πάλι με κάποιον τρόπο να μην τύχει να πέσει το ένα πάνω στο άλλο η' ποιο συνηθισμένα η μία κλήση να έχει απόσταση x δευτερολέπτων από την δεύτερη ( π.χ. amazon SES)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες