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

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

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

Απάντηση
txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

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

Δημοσίευση από txc » 02 Απρ 2014 20:06

Μετά από καιρό αποφάσισα να παίξω με cron job

Η υπόθεση εργασίας είναι η εξής :
Έχω μια db με καμιά 700 emails, ο server μου λέει ότι μπορώ να στείλω μέχρι 500 emails την ώρα

Οπότε σκέφτηκα όταν ο χρήστης στέλνει ενα email εγώ πρέπει αφού στείλω το πρώτο email στους πρώτους 500 να βρω πόσα email είναι καταχωρημένα να το διαιρέσω με το 500 και το αποτέλεσμα να το στρογγυλοποιήσω προς τα πάνω, έτσι θα έχω το σύνολο των φορών που πρέπει να στείλω το newsletter ανά ώρα.

Άρα πρέπει δυναμικά να δημιουργήσω το cron job και να το εκτελέσω αντίστοιχες φορές,
βρήκα αυτό το
tut/ εδώ

η ερώτησή μου είναι η εξής, εγώ το cron job σε ποιο folder θα το αποθηκεύσω?

στο παραπάνω tut υπάρχει το τελικό αρχείο cronModel.php , το filepath είναι το τελικό php αρχείο που θα στέλνει το newsletter?

$filePath= /usr/bin/php /var/www/vhosts/mydomain.com/httpdocs/filename.php;
shell_exec("(crontab -l ; echo "".$min." ".$hour." ".$day_of_month." ".$month." ".$day_of_week." ".$filePath." ") | crontab -");

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

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

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

Δεν υπάρχει κανένας λόγος να δημιουργείς cron jobs από την php ούτε να χρησιμοποιήσεις την shell_exec και να "χτίζεις" shell commands.
Κάνε το αντίστροφο: Από ένα σταθερό και προκαθορισμένο cron job, εκτέλεσε ένα php script.

Το είχα υλοποιήσει παλότερα για αντίστοιχους λόγους, αλλά ο Θεός ξέρει που είναι θαμμένος ο κώδικας και δεν μπορώ να τον βρώ... Οπότε, θα σου περιγράψω τη φιλοσοφία.

Βήμα 1: Δημιουργείται ένα mail για αποστολή.
Ουσιαστικά δεν δημιουργείται μόνο ένα, αλλά τόσα όσα είναι οι παραλήπτες.
Αντί να αποσταλούν αμέσως, μπαίνουν στο τέλος μίας "ουράς" (μπορεί να περιμένουν κι άλλα ωστόσο).
Το σύστημα ελέγχει τι περιθώριο έχει για να στείλει e-mails μέσα στην τρέχουσα ώρα. Δηλαδή αποφασίζει πόσα μπορεί να στείλει αμέσως.
Τα υπόλοιπα μένουν στην ουρά.

Βήμα 2. Το cron job
Από τα παραπάνω καταλαβαίνεις ότι, κάθε φορά που θέλεις να σταλεί ένα mail, η ουρά προχωρά όσο πρέπει για να μην υπερβείς το όριό σου.
Αν όμως δεν δημιουργηθεί κανένα mail για πάνω από μία ώρα, θα πρέπει να υπάρχει κάτι να κάνει trigger την προώθηση. Εδώ παίζει ο cron.
Δημιουργείς ένα job που τρέχει μία φορά την ώρα και καλεί ένα δικό σου php script, είτε από shell είτε μέσω κάποιου wget, curl ή παρόμοιου.
Αυτό το script κάνει ότι είπαμε παραπάνω, εκτός από το να προσθέτει νέα e-mails στην ουρά.

Βήμα 3. Περαιτέρω
Η δική μου περίπτωση αφορούσε ημερήσιο newsletter και συνεπώς ήξερα πόσα περίπου e-mail θα χρειαστεί να σταλούν τη μέρα (είχα και μία πρόχειρη πρόβλεψη για το πόσοι νέοι χρήστες πρόκειται να εγγραφούν πάνω-κάτω).
Επομένως, μπορούσα να τα προγραμματίσω έτσι, ώστε να "σκορπίζονται" ομοιόμορφα μέσα στο 24ωρο, και συνεπώς δεν εξαντλούσα κάθε φορά το time slot.
Έτσι, ο ιδιοκτήτης μπορούσε να στείλει κάποιο mail αν τύχαινε κάποια περίσταση, χωρίς αυτό να χρειαστεί να μπει στην ουρά και να περιμένει 1000+ newsletters μέχρι να γίνει dispatch...

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

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

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

να σου πω την αλήθεια με μπέρδεψες λίγο, είναι σύνθετο το θέμα όπως το θέτεις εσύ

η λύση που πρότεινα εγώ δε σου φαίνεται λογική?

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

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

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

Δεν είναι και τόσο σύνθετο αν το καλοσκεφτείς.
Τουλάχιστον το κομμάτι του cron είναι απείρως απλούστερο.

Φαντάσου ότι η ουρά των μηνυμάτων θα είναι στην ουσία ένα table στη βάση σου.
- Με ένα πεδίο sent όπου, αν είναι null το μήνυμα περιμένει στην ουρά κι αν έχει τιμή, αυτή είναι η ημερομηνία/ώρα που "έφυγε" επιτυχώς.
- Κι ένα πεδίο "spooled" που έχει τη χρονική στιγμή που δρομολογήθηκε, ώστε να καθορίζεται η προτεραιότητα.

Τι είναι πιο εύκολο να διαχειρίζεσαι, έναν ακόμα πίνακα ή Ν cron jobs φτιαγμένα δυναμικά;
Φαντάσου να κάνεις debug το καθένα από τα δύο, και θα καταλάβεις τι εννοώ.

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

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

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

κοίτα στην ουσία ένα cron job θα έχω φτιάξει και τη τελευταία φορά που θα τρέξει για να στείλει το email θα κάνει έλεγχο για τον αν έχουν σταλεί όλα τα email και τότε θα διαγράφω το cron job

και την επόμενη φορά θα ξαναφτιάχνω κλπ

άρα πάντα θα έχω ένα να διαχειρίζομαι

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

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

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

Γιατί ένα;

Όταν ένας χρήστης προσπαθήσει να στείλει 700 e-mails, πως ξέρεις ότι δεν έχεις εξαντλήσει το περιθώριο της τρέχουσας ώρας;

Αποκλείεται κάποιος να θέλει να στείλει e-mails ενώ υπάρχει ενεργό cron job;

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

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

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

τη πρώτη φορά που ο χρήστης θα πατήσει αποστολή εγώ θα ξεκινάω π.χ. να στείλω να πρώτα 200 emails , όταν τα στείλω κάνω Update στη βάση μια τιμή ότι έχουν σταλεί

οπότε αφού τα στείλει δημιουργώ το cron job το οποίο σαν παραμέτρους θα πάρει πόσες φορές θα τρέξει ανά μια ώρα(από τη διαίρεση των συνολικών email μείον τα πρώτα 200 στρογγυλοποιημένο προς τα πάνω)

άρα την επόμενη φορά που θα τρέξει αυτόματα το cron job θα τρέξει το αποθηκευμένο template του newsletter και θα το στείλει, ο χρήστης δε θα πάρει χαμπάρι τίποτα απλά θα του έχω πεί να αφήνει ένα περιθώριο μέχρι την επόμενη φορά που θα στείλει email

έτσι το σκέφτομαι σαν υλοποίηση

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

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

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

txc έγραψε:...όταν τα στείλω κάνω Update στη βάση μια τιμή ότι έχουν σταλεί...
Άρα κι εσύ κρατάς έμμεσα "ουρά". Αυτό είναι κοινό στοιχείο και στις δύο υλοποιήσεις.

Κατάλαβα τον τρόπο που το σκέφτηκες. Σενάριο:

Στο διάστημα 11:00 με 11:59:59 έχω περιθώριο να στείλω 200 e-mail.
Στις 11:17 κάποιος χρήστης στέλνει 700 e-mail. Στέλνω εγώ τα 200 και φτιάχνω ένα job που θα τρέξει:
- Στiς 12:00 για να στείλει 200
- Στις 13:00 για να στείλει άλλα 200
- Στις 14:00 για να στείλει άλλα 100
Σωστά ως εδώ;

Τώρα, έστω ότι στις 12:45 ένας άλλος χρήστης θέλει να στείλει άλλα 700.
Υπάρχει ήδη το άλλο job, καθώς δεν έχει τελειώσει τη δουλειά του.
Στέλνω 200; Όχι, διότι στις 12:00 εξάντλησα ήδη το όριό μου.
Θα πρέπει να φτιάξω άλλο ένα cron job που θα τρέξει:
- Στις 15:00, 16:00, 17:00 για να στείλει από 200
- Και στις 18:00 για να στείλει 100
Αυτό, στην πιο απλουστευμένη περίπτωση.
Αν θέλεις να είσαι σωστός, θα πρέπει να "δεις" ότι στις 14:00 δεν εξάντλησες το περιθώριό σου, και θα μπορούσες να "στριμώξεις" άλλα 100 εκεί, για να μην ξοδέψεις τα μισά των 18:00.

Δεν ξέρω αν είναι κάτι που δεν έχω καταλάβει, αλλά βλέπεις πόσο πολύπλοκο αρχίζει να γίνεται...

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

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

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

σωστό το σκεπτικό σου αλλά με μια παράμετρο που σου είπα και παραπάνω και δεν έλαβες υπόψιν

ο χρήστης θα ενημερωθεί ότι επειδή τα emails στέλνονται με συγκεκριμένη σειρά άρα θα πρέπει να περιμένει τουλάχιστον 3-4 ώρες μέχρι να στείλει το επόμενο newsletter

ίσως και με κάποιο μήνυμα να του πετάω στο διαχειριστικό ότι υπάρχει ενεργή αποστολή newsletter οπότε αναγκαστικά πρέπει να περιμένει

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

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

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

1) Δεν μου φαίνεται και πολύ λειτουργικό αυτό.
Αν ήμουν ο χρήστης, δεν θα μου άρεσε να μου λένε ότι δεν μπορώ να κάνω τη δουλειά μου τώρα που θέλω και μπορώ, και θα πρέπει να "ξαναπεράσω αργότερα".
Αντί να μου πουν "κάνε τη δουλειά σου, και θα τα στείλω μόλις μοπρέσω".

2) Μόνο αυτός θα στέλνει e-mails;
Θυμήσου ότι το όριο του server είναι καθολικό (ακόμα και για τα mails που φεύγουν χωρίς να το ξέρει η εφαρμογή σου!) αλλά δεν έχεις διευκρινίσει αν μόνο ένας χρήστης θα μπορεί να στέλνει.
Με άλλα λόγια, αν είμαι ο Γιώργος και θέλω να στείλω mail, θα μου πει "περίμενε, διότι ο Κώστας έστειλε 700 πριν από μία ώρα, ξαναέλα σε 3 ώρες";
Κι αν εγώ ξαναπροσπαθήσω σε 4 αντί 3 ώρες (γιατί τότε μπόρεσα), και ωστόσο με έχει προλάβει η Κατερίνα; Θα φάω άλλες 3 ώρες "πρόστιμο";

Νομίζω ότι, έχοντας μία συγκεκριμένη υλοποίηση στο μυαλό σου, κάνεις σχεδιαστικούς συμβιβασμούς για να ταιριάξεις το σχεδιασμό στην υλοποίηση.
Αυτό είναι κλασσικό λάθος, και σχεδόν πάντα καταλήγει σε μη λειτουργικές εφαρμογές.
Σχεδίασε πρώτα και μετά υλοποίησε. Γνώμη μου.

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

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

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

ναι σωστό αυτό που λες απλά στο server μου έχω λίγα newsletter προς αποστολή και μπορώ να το κοντρολάρω αργότερα

η δική σου λύση λύνει αυτό το πρόβλημα?
γιατί κάπου σε έχασα διαβάζοντας αυτό που προτείνεις

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

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

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

Ναι βέβαια το λύνει, αφού ο χρήστης παίρνει άμεσα απάντηση ότι τα e-mails του έχουν δρομολογηθεί.

Επίσης, εκτός του ότι τα e-mails μπαίνουν σε χρονολογική σειρά, μπορώ να υλοποιήσω κι άλλες προτεραιότητες (πχ μηνύματα πιο "σημαντικά" ή "επείγοντα").
Επιπλέον, μπορώ να κεντρικοποιήσω την αποστολή e-mails από διάφορες πηγές και αιτίες. Πχ μία contact form ή ένα αυτοματοποιημένο σκριπτάκι που ειδοποιεί τον admin για κάποιο γεγονός. Όλα μπαίνουν στην ίδια ουρα, κι ο dispatcher απλά βλέπει τι έχει να στείλει, με ποια σειρά και τι περιθώρια έχει.

Το cron job είναι απλά επικουρική διαδικασία και όχι διεργασία άμεσα συνδεδεμένη με την εφαρμογή μου.

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

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

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

σωστή μου ακούγεται αλλά να σου πω την αλήθεια μπερδεύτηκα με το τρόπο και σκέψη υλοποίησης

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

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

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

Οκ, για να μην επαναλαμβάνομαι, τι ακριβώς σε μπερδεύει;

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

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

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

βασικά πρώτη ερώτηση, η μεγάλη διαφορά σου σε σχέση με αυτό που λέω εγώ είναι ότι πρέπει να διαχειρίζεσαι πολλούς αποστολείς newsletter οι οποίοι θέλουν να στείλουν email

εγώ έχω 5 site π.χ. σε διαφορετικές βάσεις δεδομένων, πως θα κάνω μια σούμα όλων των newsletter που θέλουν να σταλούν την ίδια στιγμή έτσι ώστε να ξεκινήσω να τα βάζω σε μια ουρά?

Απάντηση

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

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

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