Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP
Code

Διαχειριστείτε Εργασίες Χρονομέτρου με ΡΗΡ

by
Difficulty:IntermediateLength:LongLanguages:

Greek (ελληνικά) translation by Katerina Katapodi (you can also view the original English article)

Εργαστείτε με την βοήθεια Χρονομέτρου  με  PHOΤο χρονόμετρο, ή ''Πίνακας Χρονομέτρου'', είναι ένα σύστημα Linux με διαδικασία επίδειξης που βοηθά στον προγραμματισμό επαναληπτικών εργασιών, κάνοντας πιο εύκολη καθημερινή ζωή της ρουτίνας.

Σε αυτό το σεμινάριο, θα δημιουργήσουμε μια δυναμική κλάση ΡΗΡ, χρησιμοποιώντας ασφαλή σύνδεση, που μας παρέχει τα μέσα για να ρυθμίσουμε το χρονόμετρο!

Υπόβαθρο-Μια Επισκόπηση του Χρονόμετρου

Ας το αντιμετωπίσουμε, έχοντας την ικανότητα να προγραμματίσουμε εργασίες σύμφωνα με τις βασικές αρχές είναι σπουδαίο! Από την υποστήριξη βάσης δεδομένων SQL, φέρνοντας/στέλνοντας emails για την εκπόνηση εργασιών, αναλύοντας την απόδοση, και ακόμα με τροφοδότηση  RSS, οι εργασίες με χρονόμετρο είναι φανταστικές!

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

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

  • Τα Λεπτά αντιπροσωπεύουν τα λεπτά μιας ώρας, 0-59 αντιστοίχως. 
  • Οι Ώρες αντιπροσωπεύουν τις ώρες μιας ημέρας, 0-23 αντίστοιχα.  
  • Οι Μέρες αντιπροσωπεύουν τις μέρες ενός συγκεκριμένου μήνα, 1-31 αντίστοιχα. 
  • Οι Μήνες αντιστοιχούν στους συγκεκριμένους μήνες ενός χρόνου, 1-12. 
  • Ημέρα της Εβδομάδας, αντιπροσωπεύει την συγκεκριμένη μέρα της εβδομάδας, από Κυριακή έως Σάββατο, αριθμητικά, όπως 0-6 αντίστοιχα. 

Έτσι, για παράδειγμα, αν κάποιος θέλει να προγραμματίσει μία εργασία για 12 π.μ την πρώτη ημέρα κάθε μήνα  θα έμοιαζε ως εξής:

Αν κάποιος θέλει να προγραμματίσει ένα έργο για κάθε Κυριακή στις 8¨30 πμ θα πρέπει να γράψει ως εξής:

Yπάρχει επίσης ένας αριθμός χρηστών που μπορεί να χρησιμοποιηθεί για την προσωποποίηση του προγράμματος περαιτέρω:

  • Τα Κόμματα χρησιμοποιούνται για να δημιουργήσουν μια ξεχωριστή λίστα τιμών για οιεσδήποτε των στηλών χρονομέτρου. 
  • Οι Παύλες χρησιμοποιούνται για να ορίσουν μια γκάμα τιμών.
  • -Τα κόμματα χρησιμοποιούνται για να δημιουργήσουν μια ξέχωρη λίστα τιμών για οιεσδήποτε στήλες χρονομέτρου.-Οι παύλες χρησιμοποιούνται για να καθορίσουν μια σειρά από τιμές.-Οι Αστερίσκοι χρησιμοποιούνται για να καθορίσουν το ''όλα'' ή ''κάθε'' τιμή.

Το χρονόμετρο, θα προ-επιλέξει και θα στείλει ειδοποίηση με email οποτεδήποτε έχει εκτελεστεί μια προγραμματισμένη εργασία.

To χρονόμετρο, με βάση προεπιλογή, θα στείλει ειδοποίηση με email όταν θα έχει εκτελεστεί μια προγραμματισμένη εργασία. Σε πολλές περιπτώσεις ωστόσο, αυτό δεν χρειάζεται. Μπορούμε εύκολα να καταστείλουμε αυτήν την λειτουργία, παρόλα αυτά, αποστέλλοντας την σταθερή παραγωγή αυτής της εντολής στην 'μαύρη τρύπα' ή συσκευή /dev/null. Βασικά, αυτός είναι ένας φάκελλος που θα διαγράψει όλα όσα έχουν γραφεί.  Η επανα-προώθηση της παραγωγής γίνεται μέσω του > χειριστή. Ας ρίξουμε μια ματιά στο πόσο μπορούμε να οδηγήσουμε πάλι το υλικό που παράχθηκε στην μαύρη τρύπα χρησιμοποιώντας το χρονόμετρο δείγμα με βάση το οποίο λειτουργεί μια προγραμματισμένη εργασία κάθε Σάββατο στις 0800 π.μ :

Επιπλέον, αν διοχετεύουμε πάλι το στάνταρ υλικό σε μια συσκευή ανενεργή, πιθανόν θα θελήσουμε να διοχετεύσουμε τα στάνταρ λάθη επίσης.  Επιπλέον, αν αποστείλουμε την στάνταρ εργασίας σε μια ανενεργή συσκευή, θα θελήσουμε ίσως να διορθώσουμε και τα λάθη επίσης. Μπορούμε να το κάνουμε αυτό, αποστέλλοντας τα λάθη εκεί όπου υπάρχει και η εργασία, κατά τον ίδιο τρόπο, στην ανενεργή συσκευή!

Βήμα 1- Το Blueprint Θα αρχίσουμε την ταξινόμηση δηλώνοντας τέσσερις ιδιότητες, εκ των οποίων όλες θα είναι ιδιωτικές.

Για να χειριστούμε το χρονόμετρο με ΡΗΡ, θα πρέπει να μπορούμε να εκτελούμε εντολές, στον απομακρυσμένο δίσκο, καθώς και τον χρήστη του οποίου το χρονόμετρο εκδίδουμε.  Προκειμένου να ρυθμίσουμε το χρονόμετρο με ΡΗΡ, θα πρέπει να έχουμε την ικανότητας εκτέλεσης εντολών, στον απομακρυσμένο σέρβερ, καθώς και τον χρήστη του οποίο επεξεργαζόμαστε (εκδίδουμε) το χρονόμετρο. Ευτυχώς, το ΡΗΡ μας παρέχει έναν εύκολο τρόπο να το κάνουμε αυτό μέσω της βιβλιοθήκης SSH2.  Μπορεί να έχετε ή να μην έχετε εγκαταστήσει αυτήν την βιβλιοθήκη έτσι αν όχι, θα θελήσετε να την εγκαταστήσετε:

Eγκατάσταση ΡΗΡ libssh2/Διαμόρφωση 

Θα αρχίσουμε την ταξινόμηση, δηλώνοντας τέσσερις ιδιότητες, εκ των οποίων όλες είναι ιδιωτικές:

  • $connection αντιπροσωπεύει την σύνδεση μας/πηγή.
  • $path αντιπροσωπεύει την διαδικασία για αυτόν τον φάκελλο.
  • $handle αντιπροσωπεύει το όνομα του προσωρινού φακέλλου που δουλεύουμε με χρονόμετρο.
  • $cron_file αντιπροσωπεύει ολόκληρη την διαδικασία και το όνομα του προσωρινού φακέλλου επάνω στον οποίον δουλεύουμε με χρονόμετρο.

Η τάξη μας πρέπει να μπορεί να συνδέσει και πιστοποιήσει, ως κατάλληλος χρήστης, προκειμένου να εκτελέσει εντολές, και να έχει πρόσβαση στο χρονόμετρο αυτού του χρήστη.  Η τάξη μας θα πρέπει να μπορεί να συνδέει και να πιστοποιεί, σαν κανονικός, κατάλληλος χρήσης, προκειμένου να εκτελεί εντολές και να έχει πρόσβαση στο χρονόμετρο του χρήστη. Τοιουτοτρόπως, θα εγκαταστήσουμε μια σύνδεση SSH2 και θα την πιστοποιήσουμε μέσω του ίδιου του κατασκευαστή.

Με μια πιστοποιημένη σύνδεση σε λειτουργία, θα χρειαστούμε μια μέθοδο χειρισμού της εκτέλεσης των πολλαπλών εντολών που χειριζόμαστε. Τα ονομάσουμε αυτήν την μέθοδο exec () Γενικά θα χρησιμοποιήσουμε αυτήν την μέθοδο ανάμεσα στις άλλες μεθόδους της τάξης μας όταν χρειαστεί να εκτελέσουμε μια εντολή στον απομακρυσμένο σέρβερ. 

Μετά, θα χρειαστούμε την δυνατότητα να εγγράψουμε το χρονόμετρο σε ένα φάκελλο αρχείου ώστε να έχουμε πραγματική επαφή μαζί του.  Θα χρειαστούμε επίσης ένα τρόπο να διαγράψουμε αυτόν τον φάκελλο όταν θα έχουμε τελειώσει.  Ας καθορίσουμε την μέθοδο χειρισμού παραγωγής του χρονόμετρου σε ένα φάκελλο  write_to_file και την μέθοδο διαγραφής αυτού του φακέλλου ως remove_file ()

Βέβαια, θα χρειαστούμε επίσης έναν τρόπο να δημιουργήσουμε και να διαγράψουμε εργασίες με χρονόμετρο.  Έτσι θα ορίσουμε ένα append_cronjob () και την μέθοδο remove_cronjob, αντίστοιχα. 

Σε αυτήν την περίπτωση που αφαιρέσαμε την μόνη/τελευταία εργασία με χρονόμετρο θα θελήσουμε να μπορούμε να διαγράψουμε εξ ολοκλήρου το χρονόμετρο παρά να προσπαθήσουμε να δημιουργήσουμε ένα  κενό φάκελλο με χρονόμετρο. Σε περίπτωση που έχουμε αφαιρέσει την μόνη/τελευταία εργασία με χρονόμετρο θα θελήσουμε να μπορέσουμε να διαγράψουμε όλο το χρονόμετρο κατά την προσπάθεια δημιουργίας της μεθόδου remove_crontab για να τον χειριστούμε.  

Τέλος, θα δημιουργήσουμε δύο βοηθητικές μεθόδους για την τάξη μας. H πρώτη από αυτές τις μεθόδους, που θα δώσει μια τιμή boolean, θα ελέγξει απλώς την ύπαρξη του προσωρινού φακέλλου χρόνου,  Η τελευταία θα χρησιμοποιηθεί για την προβολή μηνυμάτων με λάθη αν γίνει ένα λάθος.  Θα ονομάσουμε αυτές τις μεθόδους crontab_file_exists () και error_message (), αντίστοιχα.

Βήμα 2- Ο Κατασκευαστής!

Ο δημιουργός της τάξης θα είναι βασικά υπεύθυνος για την εγκατάσταση και πιστοποίηση της σύνδεσης SSH2.  Βήμα 2- Ο Κατασκευαστής!Ο κατασκευαστής τάξης θα είναι βασικά υπεύθυνος για την εγκατάσταση και πιστοποίηση της σύνδεσης SSH2. Θα χρειαστούν τέσσερα επιχειρήματα, κάθε ένα από αυτά θα έχει μια προ-επιλεγμένη τιμή ΝULL (MΗΔΕΝ): 

  • $ host: αντιπροσωπεύει την διεύθυνση ip του απομακρυσμένου σέρβερ που θέλουμε να συνδεθούμε. 

  • $port: είναι η πύλη εισόδου που χρησιμοποιείται για την σύνδεση SSH2.
  • $username: αντιστοιχεί στην σύνδεση του ονόματος χρήστη για τον δίσκο. 
  • $password: αναφέρεται στον κωδικό πρόσβασης χρήστη για τον δίσκο. (σέρβερ).

Στα πλαίσια του ίδιου του συστήματος κατασκευής, η πρώτη ιδιότητα που ορίζουμε είναι $ this->path που θα αντιστοιχεί σε μια ''λίστα προεπιλογών'' για τους προσωρινούς φακέλλους που λειτουργούν με χρονόμετρο. 

Θεωρητικά, θα μπορούσαμε απλώς να χρησιμοποιήσουμε την μαγική σταθερά του ΡΗΡ, --DIR--για να ορίσουμε αυτήν την παράμετρο ως το τρέχον ευρετήριο  εργασίας.  Υπάρχουν ωστόσο περιπτώσεις, όπου αυτή η σταθερά (παράμετρος) μπορεί να μην οριστεί.  Γι'αυτό, θα ελέγξουμε να δούμε αν το --DIR--έχει ορισθεί. 

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

Θα χρησιμοποιήσουμε το strrpos (), που επαναφέρει την θέση του τελευταίουΘα χρησιμοποιήσουμε το strrpos (), που επαναφέρει τον τελευταία δευτερεύουσα σειρά, για να εντοπίσει την θέση τoυ διαχωριστικού στη σειρά --FILE--. Αυτή η τιμή, την οποία θα αποθηκεύσουμε ως μεταβλητή $path_length, θα μας δώσει τον αριθμό των χαρακτήρων αλλά που δεν περιέχουν το τελευταίο χώρισμα προώθησης. 

Η λειτουργία substr() θα επιλέξει μια σειρά 'σύνδεσης' όπου θα επιστρέψει μια ειδική ποσότητα σειρών που βασίζεται στην θέση έναρξης της σύνδεσης και τον αριθμό των χαρακτήρων που θέλουμε να επιστρέψει. 

Θα δώσουμε τρεις λόγους για την  λειτουργία substr

  • -την σειρά με την οποία εργαζόμαστε
  • -τη θέση έναρξης της σύνδεσης, σε αυτή την περίπτωση 
  • την τελική θέση της σύνδεσης, που αντιπροσωπεύεται από την μεταβλητή $path_length.

Τώρα θα συνδέσουμε μαζί ένα χώρισμα προώθησης στο τέλος αυτής της σειράς που θα μας δώσει το τρέχον ευρετήριο εργασίας.

Τώρα, θα ορίσουμε μια προεπιλεγμένη ονομασία φακέλλου για τον προσωρινό φάκελλο που λειτουργεί με χρονόμετρο ως $this->handle και μετά θα προβούμε στην ένωση  διαδικασίας και στηριγμάτων μαζί ως $this-> cron_file.  Αυτή η βάση θα αντιπροσωπεύει την πλήρη διαδικασία προεπιλογής και το όνομα του φακέλλου για τον φάκελλο εργασίας που λειτουργεί προσωρινά με χρονόμετρο. 

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

Στα πλαίσια του μπλοκ try , θα τσεκάρουμε πρώτα να δούμε ότι όλα τα επιχειρήματα έχουν οριστεί χρησιμοποιώντας την λειτουργία is_null () η οποία θα δώσει σωστό ή λάθος.  Αν κάποια από αυτά τα επιχειρήματα είναι NULL, θα κάνουμε μια νέα εξαίρεση με ένα κατάλληλο μήνυμα. 

Μετά, θα επιλέξουμε $this->connection δίνοντας τις παραμέτρους $host και $port στη λειτουργία ssh2_connect () που θα εγκαταστήσει μια απομακρυσμένη σύνδεση και θα επαναφέρει αυτήν την πηγή προέλευσης ή FALSE αν η σύνδεση αποτύχει. 

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

Τώρα θα προσπαθήσουμε να πιστοποιήσουμε/συνδεθούμε χρησιμοποιώντας την λειτουργία ssh2_auth_password περνώντας στο μέσον επαναφοράς της σύνδεσης μας καθώς και το όνομα χρήστη και τον κωδικό πρόσβασης του χρήστη με τον οποίον είμαστε συνδεδεμένοι.  το ssh2_auth_password() θα δώσει μια αλγεβρική τιμή που αντιπροσωπεύει το στάτους της πιστοποίησης όπου μπορούμε να κάνουμε μια νέα εξαίρεση αν η πιστοποίηση (αναγνώριση)αποτύχει. 

Το ΡΗΡ θα προσπαθήσει να βρει ένα κατάλληλο μπλοκ εντοπισμού, για κάθε εξαίρεση που δόθηκε, και μετά να δημιουργήσει/δώσει ένα αντικείμενο εξαίρεσης που περιέχει μερικές χρήσιμες ιδιότητες, σε αυτό το μπλοκ. 

Έτσι, στο μπλοκ εντοπισμού, θα χρησιμοποιήσουμε την μέθοδο εξαίρεσης του αντικειμένου getMessage για πρόσβαση και προβολή του μηνύματος που ορίστηκε στην εξαίρεση. 

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

Βήμα 3-Εκτέλεση Πολλαπλών Εντολών

Βήμα 3-Εκτέλεση Πολλαπλών Εντολών Με αυτήν την μέθοδο θα εκτελούνται εντολές στον απομακρυσμένο σέρβερ (δίσκο). Είναι παρεμφερές να εισάγουμε εντολές χειροκίνητα σε ένα κέλυφος (ή αλλιώς ''κουτί/πλαίσιο) όπως, ας πούμε PuTTY.  Για μεγαλύτερη ευκολία, θα κοινοποιήσουμε αυτήν την μέθοδο ώστε οι χρήστες να μπορούν πράγματι να εκτελούν άλλες εντολές λειτουργίας.  Θα επιτρέψουμε επίσης για οιονδήποτε αριθμό επιχειρημάτων με μέγεθος όσο τουλάχιστον μια φορά έχει οριστεί. Αυτά τα επιχειρήματα θα εκπροσωπούν τις εντολές χειρισμού με την χρήση της λειτουργίας ssh2_exec.

Έτσι, το πρώτο πράγμα που θα κάνουμε σε αυτήν την μέθοδο είναι να καθορίσουμε μια μεταβλητή που αντιπροσωπεύει έναν αριθμό του συνολικού αριθμού των βοηθημάτων που δόθηκαν.    Θα χρησιμοποιήσουμε το σύστημα PHP func_num_args() για να κάνουμε αυτήν την καταμέτρηση. 

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

Μετά, χρησιμοποιώντας την λειτουργία func_get_args () θα δημιουργήσουμε μια σειρά από όλα τα επιχειρήματα που δόθηκαν σ'αυτήν την μέθοδο.

Χρησιμοποιώντας ένα τριαδικό σύστημα λειτουργίας, θα ορίσουμε μια νέα μεταβλητή, $command_string, ως μια απλή παρουσίαση σειρών των παρόντων εντολών Linux που θα εκτελέσουμε. 

Αν όντως έχουμε πολλές εντολές να εκτελέσουμε, θα χρησιμοποιήσουμε το implode PHP, για να αναλύσουμε τα επιχειρήματα μέσα σε μια σειρά. Θα περάσουμε δύο επιχειρήματα στο implode, το κόλλα, ή τον διαχωριστή, που είναι βασικά ακριβώς μια σειρά που θα εισαχθεί ανάμεσα στα δεδομένα που έχουν τα ίδια παραταχθεί.  Θα χωρίσουμε κάθε στοιχείο με το σύστημα λειτουργίας lINUX, && το οποίο μας επιτρέπει να εκτελέσουμε πολλές εντολές, με την σειρά, σε μια γραμμή!

Αντίθετα, άν υπάρχει μόνο μια εντολή, θα ορίσουμε την σειρά εντολών ως &arguments {0} που αντιπροσωπεύει το πρώτο μόνο επιχείρημα/εντολή.

Με τις εντολές μας έτοιμες και αναλυμένες σε μια σειρά, μπορούμε τώρα να προσπαθήσουμε να τις εκτελέσουμε χρησιμοποιώντας την λειτουργία ssh2_exec (). Θα περάσουμε τον σύνδεσμο id της σύνδεσης $this->connection, καθώς και το $command_string σε αυτή την λειτουργία που μπορεί να δώσει το σωστό σε περίπτωση επιτυχίας και λάθος σε περίπτωση αποτυχίας. 

Οι ροές ορίζονται ως αρχικό αντικείμενο συγκέντρωσης.. που μπορεί να αναγνωσθεί ή να γραφεί σε ένα γραμμικό σχήμα. 

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

Αυτό είναι για το μπλοκ δοκιμής! Μέσα στα πλαίσια του μπλοκ εντοπισμού, θα ανατρέξουμε απλώς στη μέθοδο error_message () προκειμένου να προβάλλουμε οιαδήποτε εσφαλμένα μηνύματα στον χρήστη μας.  Με τα μπλοκ δοκιμής και σύλληψης λαθών που τώρα έχει ολοκληρωθεί θα επιστρέψουμε το $this στο τέλος της μεθόδου exec ()που θα μπορεί να καταστεί δυνατή την σύνδεση της μεθόδου!

Βήμα 4-Γράφοντας το Χρονόμετρο σε έναν Φάκελλο 

Η επόμενη μέθοδος, write_to_file (), θα χρησιμοποιηθεί για την εγγραφή του παρόντος χρονομέτρου σε έναν προσωρινό φάκελλο ή να δημιουργία προσωρινά κενού φακέλλου.  αν δεν υπάρχουν εργασίες με χρονόμετρο.  χωρίς εργασίες με χρονόμετρο. Θα χρειαστούν δύο επιχειρήματα (δύο λόγοι)

  • -την διαδικασία δημιουργίας προσωρινού φακέλλου
  • το όνομα που πρέπει να χρησιμοποιήσουμε κατά την δημιουργία του.

Συνεχίζοντας με την λογική του κατασκευαστή μας και μεθόδους εκτέλεσης, θα προ-επιλέξουμε τιμές για αυτά τα επιχειρήματα όπως NULL. 

Το πρώτο πράγμα που κάνουμε εδώ είναι να ελέγξουμε αν ο φάκελλος χρονομέτρου υπάρχει ήδη χρησιμοποιώντας την αλγεβρική (boolean)που θα δημιουργήσουμε σύντομα.  Αν ο φάκελλος υπάρχει, δεν χρειάζεται να προβούμε στην διαδικασία.  Αν δεν υπάρχει, θα χρησιμοποιήσουμε ένα τριαδικό σύστημα λειτουργίας για να ελέγξουμε το $path και τα βοηθήματα $handle για να προσδιορίσουμε εάν ή όχι είναι NULL (ΜΗΔΕΝ). Αν και τα δύο είναι NULL, θα χρησιμοποιήσουμε τις προ-ορισμένες υποστηρίξεις του κατασκευαστή μας για να τις ορίσουμε. 

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

Μετά, θα χρησιμοποιήσουμε την εντολή Linux, με την εγκατάσταση του -Ι, για να προβάλλει στους χρήστες του cronTab ως σταθερή παραγωγή.  Μετά, με την χρήση του συστήματος Linux, θα διευθύνουμε και πάλι στην στάνταρ παραγωγή, ή STDOUT, στον προσωρινό φάκελλο αντί να συμπτύξουμε το $this->cron_file σε μια σειρά εντολών! Το πέρασμα εκ νέου της παραγωγής σε φάκελλο, με τη χρήση του >,θα δημιουργεί πάντα αυτόν τον φάκελλο αν δεν υπάρχει.

Αυτό λειτουργεί πολύ καλά, αλλά μόνο αν υπάρχουν ήδη εργασίες που έχουν προγραμματιστεί στα πλαίσια του χρονόμετρου.  Αν δεν υπάρχουν καθόλου εργασίες με χρονόμετρο, αυτός ο φάκελλος δεν θα δημιουργηθεί ποτέ! Χρησιμοποιώντας τον χειριστή && παρόλα αυτά, μπορούμε να προσθέσουμε επιπλέον εντολές/εκφράσεις στην σειρά.  Αυτό λειτουργεί πολύ καλά αλλά μόνον όταν έχουν προγραμματιστεί εργασίες με το cronTab. Aν δεν υπάρχουν εργασίες με χρονόμετρο, παρόλα αυτά, αυτός ο φάκελλος ποτέ δεν θα δημιουργηθεί! Χρησιμοποιώντας το σύστημα && ωστόσο, μπορούμε να προσθέσουμε επιπλέον εντολές/εκφράσεις σε αυτή την σειρά. Ώστε, ας προσθέσουμε μια συμβατική έκφραση για να ελέγξουμε αν υπάρχει ο φάκελλος που λειτουργεί με χρονόμετρο.  Αν ο φάκελλος δεν υπάρχει, αυτή η έκφραση θα δείξει λάθος.  Έτσι, μπορούμε μετά να χρησιμοποιήσουμε το | | ή '''η'' το σύστημα λειτουργίας μετά από αυτή την συμβατική λειτουργία για να δημιουργήσουμε έναν νέο κενό φάκελλο αν χρειάζεται! 

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

Στο τέλος, θα ανατρέξουμε στη μέθοδο exec() και θα περάσουμε την γραμμή εντολών σ'αυτόν ως τη μόνη αιτιολόγηση.  Τότε, προκειμένου να καταστήσουμε την μέθοδο δυνατή προς σύνδεση επίσης, θα επιστρέψουμε στο $this.

Βήμα 5-Κατάργηση του Προσωρινού Φακέλλου Χρονομέτρου 

Αυτή η μέθοδος, remove_file είναι τόσο εύκολη όσο θα μπορούσε να είναι! Θα χρησιμοποιήσουμε την βοηθητική μέθοδο, crontab_file_exists(), για να ελέγξουμε την ύπαρξη του προσωρινού φακέλλου που λειτουργεί με χρονόμετρο και μετά να εκτελέσουμε την εντολή Linux rm για να τον διαγράψουμε αν υπάρχει.  Ως συνήθως, θα επαναφέρουμε το $this για να διατηρήσουμε την συνδεσιμότητα. 

Βήμα 6-Δημιουργία Νέων Εργασιών με Χρονόμετρο

Αυτή η μέθοδος θα δημιουργήσει νέες εργασίες με χρονόμετρο με τρόπο που να προσθέτει νέες εργασίες/γραμμές στον προσωρινό φάκελλο χρονομέτρου και μετά να εκτελεί την εντολή crontab σε αυτόν τον φάκελλο που θα εγκαταστήσει όλες αυτές τις εργασίες ως νέο χρονόμετρο.  Τοιουτοτρόπως, το append_cronjob() θα έχει μια αιτιολογία, το $cron_jobs, που είτε θα είναι μια σειρά, είτε σύνολο σειρών που αντιπροσωπεύουν τις εργασίες με χρονόμετρο που θα προσαρτήσουμε. 

Θα κάνουμε έναρξη αυτής της μεθόδου προσδιορίζοντας αν το $cron_jobs έχει τιμή NULL  Αν ναι, θα χρησιμοποιήσουμε την μέθοδο error_message για να σταματήσουμε περαιτέρω εκτέλεση και να ενημερώσουμε τον χρήστη για μήνυμα λάθους. . 

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

Μετά, θα ορίσουμε μια νέα μεταβλητή, $append_cronfile, σαν σειρά, με το ηχογραφημένο κείμενο να ακολουθείται από διάστημα και μια απλή αναφορά στο τέλος. Θα προβάλλουμε αυτή την σειρά με τις διάφορες εργασίες χρονομέτρου που προσθέτουμε καθώς και την αναφορά κλεισίματος στιγμιαία.  Κατασκευάζουμε αυτήν την σειρά χρησιμοποιώντας το σύστημα συνένωσης των σειρών.

Χρησιμοποιώντας ένα τριαδικό σύστημα χρήσης, θα προσδιορίσουμε εάν το $cron_jobs είναι μια σειρά ή όχι.  Αν ναι, θα φορτώσουμε αυτή την σειρά με νέες γραμμές, \n, έτσι ώστε κάθε εργασία με χρονόμετρο να γράφεται πάνω στην δική του σειρά μέσα στο φάκελλο χρονομέτρου.  Αν το αιτιολογικό $cron_jobs δεν είναι μια σειρά, απλώς θα συνδέσουμε αυτή την εργασία στη σειρά $append_cron χωρίς κάποια ειδική διαδικασία.  Με αυτόν τον τρόπο, έχουμε μια σειρά για εγγραφές κατάλληλα διαμορφωμένη ανεξάρτητα αν ή δουλεύουμε ή όχι με μια σειρά. 

Βασικά, μπορούμε απλώς να ηχογραφήσουμε την εργασία μας στο φάκελλο που λειτουργεί με χρονόμετρο, εισάγοντας την εργασία που έχει παραχθεί μέσα στο φάκελλο πάλι.  Ετσι, με την χρήση του συστήματος συνένωσης  σειρών, θα προσαρτήσουμε την απλή αναφορά κλεισίματος στην σειρά εντολών καθώς και το σύστημα Linux >> μαζί με την πλήρη διαδικασία και ονομασία φακέλλου για τον φάκελλο χρονομέτρου.  Ο χειριστής >>, διαφορετικά από τον χειριστή > που πάντοτε σβήνει το περιεχόμενο των φακέλλων, προσαρτά το υλικό παραγωγής στο τέλος του φακέλλου. Έτσι, χρησιμοποιώντας αυτόν τον χειριστή, δεν θα σβήσουμε καθόλου υπάρχουσες εργασίες που έγιναν με χρονόμετρο.  

Τώρα θα ορίσουμε μια μεταβλητή, σαν μια σειρά, με την εντολή που θα χρησιμοποιήσουμε για να εγκαταστήσουμε έναν νέο φάκελλο εργασίας με χρονόμετρο που πρόκειται τώρα να δημιουργήσουμε! Τώρα θα ορίσουμε μια μεταβλητή, σαν σειρά, με την εντολή που θα χρησιμοποιήσουμε για να ανοίξουμε τον νέο φάκελλο με χρονόμετρο που πρόκειται να δημιουργήσουμε! Είναι τόσο απλό σαν να χρησιμοποιείς την εντολή του crontab μαζί με την διαδικασία και την ονομασία φακέλλου του φακέλλου που λειτουργεί με χρονόμετρο. 

Πριν εκτελέσουμε αυτές τις εντολές μέσω της μεθόδου exec(),ωστόσο, θα ονομάσουμε την μέθοδο write_to_file, προκειμένου να φτιάξουμε τον προσωρινό φάκελλο που λειτουργεί με χρονόμετρο.  Μετά, μέσω σύνδεσης, θα εκτελέσουμε αυτές τις εντολές και θα ονομάσουμε την μέθοδο remove_file() για να διαγράψουμε τον προσωρινό φάκελλο.  Πριν να εκτελέσουμε αυτές τις εντολές με την μέθοδο exec(), πρώτα θα πάμε στη μέθοδο write_to_file για να δημιουργήσουμε τον προσωρινό φάκελλο χρονομέτρου. Μετά, μέσω σύνδεσης, θα εκτελέσουμε αυτές τις εντολές πηγαίνοντας στην μέθοδο remove_file () για να διαγράψουμε τον προσωρινό φάκελλο. Στο τέλος, θα κάνουμε return$this έτσι ώστε η μέθοδος append_cronjob να μπορεί να συνδεθεί. 

Βήμα 7-Κατάργηση Εργασιών με Χρονόμετρο 

Τώρα που μπορούμε να δημιουργήσουμε νέες εργασίες με χρονόμετρο, είναι μόνο λογικό να έχουμε την δυνατότητα και να τις διαγράψουμε! Η μέθοδος remove_cronjob() θα πάρει μια αιτιολόγηση που θα είναι μια απλή κανονική φράση.  Αυτό το regEx θα χρησιμοποιηθεί για να βρούμε σχετικές εργασίες μέσα από το χρονόμετρο και αντίστοιχα να τις διαγράψουμε.   Όπως η μέθοδος append_cronjob (), το πρώτο πράγμα που θα κάνουμε είναι να ελέγξουμε να δούμε αν  το βοήθημα $cron_jobs είναι NULL και κάνει την εκτέλεση αν είναι. Αν όχι θα ανατρέξουμε στη μέθοδο create_file προκειμένου να εισάγουμε το χρονόμετρο σε φάκελλο. 

Όταν δημιουργηθεί ο φάκελλος με το χρονόμετρο, τώρα θα τον διαβάσουμε σε μια σειρά με την χρήση της λειτουργίας PHP file ()  Αυτή η λειτουργία θα αναλύσει έναν συγκεκριμένο φάκελλο μέσα σε μια σειρά με κάθε γραμμή να είναι στοιχείο της σειράς.  Θα προσαρμόσουμε τον φάκελλο χρονομέτρου σε αυτήν λειτουργία όπως το πρώτο βοήθημα και θα βάλουμε μια ειδική σημαία, FILE_IGNORE_NEW_LINES, που θα κάνει το file() να αγνοήσει όλες τις νέες γραμμές.  Με την δημιουργία φακέλλου χρονομέτρου, θα την διαβάσουμε τώρα σε μια σειρά με την χρήση της λειτουργίας PHP file. Αυτή η λειτουργία θα αναλύσει έναν συγκεκριμένο φάκελλο μέσα στη σειρά με κάθε γραμμή ως στοιχείο της σειράς. Θα περάσουμε τον φάκελλο μας σε αυτή την λειτουργία ως πρώτο βοήθημα και μετά θα τοποθετήσουμε μια ειδική σημαία, FILE_IGNORE_NEW_LINES, που θα κάνουν τον φάκελλο να αγνοήσει όλες τις νέες γραμμές. Τοιουτοτρόπως, θα έχουμε μια σειρά με μόνο εργασίες χρονομέτρου. 

Αν δεν προγραμματιστούν καθόλου εργασίες με χρονόμετρο, αυτή η σειρά θα μείνει κενή.  Κατά συνέπεια, δεν υπάρχει λόγος να συνεχίσουμε.  Κατ'αυτόν τον τρόπο θα ελέγξουμε για να δούμε αν το βοήθημα(υποστήριγμα) $cron_array είναι κενό και σταμάτησε την εκτέλεση αν είναι. 

Αν το χρονόμετρο δεν είναι άδειο, τότε θα μετρήσουμε τα στοιχεία στο βοήθημα $cron_array χρησιμοποιώντας το σύστημα μέτρησης PHP count.  Θα αποθηκεύσουμε αυτή την τιμή ως $original_count.  Θα το χρησιμοποιήσουμε για λίγο, για να προσδιορίσουμε εάν έχουμε αφαιρέσει κάποιες εργασίες χρονομέτρου από το βοήθημα $cron_array.

Τώρα, θα προσδιορίσουμε αν το βοήθημα (υποστήριγμα)$cron_jobs είναι ένα σύνολο σειρών ή όχι.  Αν είναι ένα σύνολο σειρών, θα περιηγηθούμε μέσα με έναν περιορισμό foreach. Μέσα από αυτήν την στενωπό (περιορισμό) θα εκτελέσουμε μόνο μια λειτουργία, το preg_grep() Αυτή η φίνα λειτουργία, που δεν διαφέρει από το preg_match, θα επιστρέψει μια σειρά με όλα τα στοιχεία που ταιριάζουν στην τακτική έκφραση που έχει οριστεί.  Σε αυτήν την περίπτωση ωστόσο, θέλουμε τα στοιχεία της σειράς που δεν ταιριάζουν.  Με άλλα λόγια, χρειαζόμαστε μια σειρά από όλες τις εργασίες με χρονόμετρο, που πρόκειται να κρατήσουμε ώστε να μπορούμε να ενεργοποιήσουμε το χρονόμετρο με απλώς τρεις εργασίες.  Κατ'αυτόν τον τρόπο, θα τοποθετήσουμε μια ειδική σημαία εδώ, PREG_GREP_INVERT, που θα κάνει το preg_grep να επιστρέψει μια σειρά με όλα τα στοιχεία που δεν είναι κοινότυπα. ('ταιριάζουν με την τακτική έκφραση'). Έτσι, θα έχουμε μια σειρά με όλες τις εργασίες χρονομέτρου που θέλουμε να κρατήσουμε!

Αν το βοήθημα $cron_jobs δεν είναι μια σειρά θα προβούμε σε αυτή την διαδικασία με τον ίδιο τρόπο αλλά χωρίς καμία επανάληψη.   Ξανά, θα καθορίσουμε το $cron_array ως την σειρά που προκύπτει από την λειτουργία preg_grep(), με την τοποθέτηση της σημαίας ως PREG_GREP_INVERT. 

Με το βοήθημα μας $cron_array, τώρα, θα συγκρίνουμε το τρέχον μήκος της σειράς με το αρχικό του μήκος που αποθηκεύσαμε προσωρινά στην μεταβλητή $original_count.  Αν τα μήκη είναι τα ίδια, απλώς θα επαναφέρουμε την μέθοδο remove_file () για να διαγράψουμε τον προσωρινό φάκελλο χρονομέτρου.  Αν δεν ταιριάζουν, θα αφαιρέσουμε το υπάρχον χρονόμετρο και μετά θα εγκαταστήσουμε το νέο!

Τα βοηθήματα remove_file, remove_crontab() και οι μέθοδοι append_cronjob επιστρέφουν το $this ώστε με την επαναφορά αυτών των μεθόδων διατηρούμε ακόμα την συνδεσιμότητα των μεθόδων. 

Βήμα 8-Κατάργηση Παντελώς του Χρονομέτρου

Η κατάργηση παντελώς του χρονομέτρου είναι σχετικά απλή.  Βασικά, απλώς θα εκτελέσουμε την εντολή crontab με την τοποθέτηση της σημαίας r που καταργεί εξ ολοκλήρου το χρονόμετρο για έναν δοσμένο χρήστη.  Εφόσον το χρονόμετρο έχει αφαιρεθεί θα μπορούσαμε επίσης να διαγράψουμε και τον προσωρινό φάκελλο χρονομέτρου, αν υπάρχει.  H κατάργηση του χρονομέτρου εξ ολοκλήρου είναι σχετικά απλό πράγμα. Βασικά, θα εκτελέσουμε την εντολή cronTab με την σημαία r που καταργεί παντελώς το χρονομέτρου για έναν συγκεκριμένο χρήστη. Εφόσον το χρονόμετρο .έχει καταργηθεί θα μπορούμε επίσης να διαγράψουμε τον προσωρινό φάκελλο που λειτουργεί με χρονόμετρο, αν υπάρχει. Μετά θα πάμε στο return$this για να διατηρήσουμε την συνδεσιμότητα. 

Βήμα 9-Μερικές Βοηθητικές Μέθοδοι 

Με την απότομα γραμμένη τάξη του χειρισμού του χρονομέτρου, τώρα θα ρίξουμε μια ματιά στις δύο μικρές αλλά χρήσιμες μεθόδους που χρησιμοποιήσαμε κατά την διάρκεια του μαθήματος μας, crontab_file_exists() και error_message ().

  • Με την ενεργοποίηση της τάξης μας για την ρύθμιση του χρονομέτρου γραπτώς, θα ρίξουμε μια ματιά τώρα στις δύο μικρές αλλά χρήσιμες μεθόδους που έχουμε χρησιμοποιήσει στην τάξη μας, crontab_file_exists() και error_message().$this_crontab_file_exists()  

    Αυτή η μέθοδος απλώς θα δώσει το αποτέλεσμα της μεθόδου ΡΗΡ file_exists(), σωστό ή λάθος, ανάλογα με το αν υπάρχει η όχι ο προσωρινός φάκελλος που λειτουργεί με χρονόμετρο.  

  • $this->error_message($error)

    Αυτή η μέθοδος, θα πάρει ένα βοήθημα, μια σειρά για γράψιμο, που αντιστοιχεί στο λάθος μήνυμα που θέλουμε να προβάλλουμε. $this->error_message ($error)Αυτή η μέθοδος θα πάρει ένα βοήθημα, μια σειρά, που αντιπροσωπεύει το μήνυμα λάθους που θέλουμε να προβάλλουμε. Μετά θα χρησιμοποιήσουμε την μέθοδο του ΡΗΡ die προκειμένου να σταματήσουμε την εκτέλεση και να προβάλλουμε το μήνυμα. Η ίδια η σειρά, θα συνενωθεί σε ένα στοιχείο <pre> με απλό στυλ στην εφαρμογή.  H  ίδια η σειρά, θα συνενωθεί σε ένα στοιχείο <pre>με λίγο περισσότερο απλό στυλ.

Βήμα 10-Βάζοντας τα όλα μαζί

Τώρα που έχουμε ολοκληρώσει τη διευθέτηση του χρόνου της τάξης μας, ας ρίξουμε μια ματιά στα λίγα παραδείγματα το πώς να το χρησιμοποιήσουμε!

  • Παραδειγματίζοντας την τάξη και καθιερώνοντας μια πιστοποιημένη σύνδεση:

    Πρώτα, ας δημιουργήσουμε ένα νέο παράδειγμα στην τάξη μας.  Να θυμάστε, θα πρέπει να δώσουμε την διεύθυνση ip, πύλη εισόδου, όνομα χρήστη και κωδικό πρόσβασης στον κατασκευαστή της τάξης. 

  • Προσθέτοντας μια απλή εργασία με χρονόμετρο:

    Προσάρτηση μιας απλής εργασίας με χρονόμετρο Με μια πιστοποιημένη σύνδεση ως δεδομένο, ας ρίξουμε μια ματιά στο πώς μπορούμε να δημιουργήσουμε μια νέα απλή εργασία με χρονόμετρο. 

  • Προσθήκη (προσάρτηση) μιας σειράς εργασιών με χρονόμετρο:

     Η Προσάρτηση πολλών εργασιών με χρονόμετρο είναι τόσο εύκολη όσο η προσθήκη μιας μόνο εργασίας με χρονόμετρο.   Απλώς θα δώσουμε μια σειρά στη μέθοδο append_cronjob().

  • Κατάργηση μιας απλής εργασίας με χρονόμετρο:

    Κατάργηση μιας απλής εργασίας με χρονόμετρο:Με τον ίδιο τρόπο που δημιουργήσαμε μια απλή εργασία με χρονόμετρο, μπορούμε και να την καταργήσουμε.  Αυτή τη φορά, ωστόσο, θα χρησιμοποιήσουμε μια τακτική έκφραση για να βρούμε την κατάλληλη εργασία. Αυτό το regEx μπορεί να είναι τόσο απλό ή περίπλοκο, όσο χρειάζεστε να είναι. Πράγματι, υπάρχουν πολλοί τρόπο για regex της εργασίας που ψάχνετε.  Για παράδειγμα, αν η εργασία που πρέπει να αφαιρέσετε είναι η μόνη όπου η εντολή χειρισμού δεν χρησιμοποιείται κάπου αλλού στο Χρονόμετρο, θα μπορούσατε απλά να καθορίσετε το όνομα εντολής σαν το regEx σας.  Επιπλέον, αν θέλατε να διαγράψετε όλες τις εργασίες για έναν συγκεκριμένο μήνα, θα μπορούσατε απλώς να γράψετε μια τακτική έκφραση για να βρείτε έναν συνδυασμό εργασιών για ένα συγκεκριμένο μήνα!

  • Αφαίρεση μιας σειράς εργασιών με χρονόμετρο:

    Κατάργηση σειράς εργασιών με χρονόμετρο:Η κατάργηση πολλών εργασιών με χρονόμετρο γίνεται με τον ίδιο τρόπο όπως η κατάργηση μιας απλής εργασίας με χρονόμετρο, με μια απλή εξαίρεση, θα περάσουμε μια σειρά από τακτικές εκφράσεις εργασίας με χρονόμετρο στη μέθοδο remove_cronjob().

Συμπέρασμα

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

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.