Τι είναι το PHP-FIG; Οντότητα "πλαίσιο" για PHP από μία κατηγορία Anemic ομάδα php

16.09.2016

Ας προσπαθήσουμε να προσδιορίσουμε πώς να αυξήσουμε την απόδοση ενός διακομιστή εφαρμογών με βάση php-fpm και επίσης να δημιουργήσουμε μια λίστα ελέγχου για τον έλεγχο της διαμόρφωσης της διαδικασίας fpm.

Πρώτα απ 'όλα, θα πρέπει να προσδιορίσετε τη θέση του αρχείου διαμόρφωσης της πισίνας. Εάν εγκαταστήσατε το php-fpm από το χώρο αποθήκευσης του συστήματος, τότε η διαμόρφωση της πισίνας wwwθα βρίσκεται περίπου εδώ /etc/php5/fpm/pool.d/www.conf . Εάν χρησιμοποιείτε τη δική σας έκδοση ή άλλο λειτουργικό σύστημα (όχι το debian), θα πρέπει να αναζητήσετε τη θέση του αρχείου στην τεκμηρίωση ή να την καθορίσετε με μη αυτόματο τρόπο.

Ας προσπαθήσουμε να δούμε τη διαμόρφωση με περισσότερες λεπτομέρειες.

Μετάβαση σε υποδοχές UNIX

Πιθανώς το πρώτο πράγμα που πρέπει να προσέξετε είναι πώς τα δεδομένα ρέουν από τον διακομιστή ιστού προς τις διαδικασίες PHP σας. Αυτό αντικατοπτρίζεται στην οδηγία ακρόασης:

ακρόαση = 127.0.0.1:9000

Εάν έχει οριστεί διεύθυνση:port, τότε τα δεδομένα περνούν από τη στοίβα TCP και αυτό μάλλον δεν είναι πολύ καλό. Εάν υπάρχει μια διαδρομή προς την πρίζα, για παράδειγμα:

listen = /var/run/php5-fpm.sock

τότε τα δεδομένα περνούν από μια υποδοχή unix και μπορείτε να παραλείψετε αυτήν την ενότητα.

Γιατί αξίζει ακόμα να μεταβείτε σε πρίζα unix; Το UDS (υποδοχή τομέα unix), σε αντίθεση με την επικοινωνία μέσω της στοίβας TCP, έχει σημαντικά πλεονεκτήματα:

  • δεν απαιτούν εναλλαγή περιβάλλοντος, το UDS χρησιμοποιεί το netisr)
  • Το datagram UDS γράφεται απευθείας στην υποδοχή προορισμού
  • Η αποστολή ενός datagram UDS απαιτεί λιγότερες λειτουργίες (χωρίς αθροίσματα ελέγχου, χωρίς κεφαλίδες TCP, χωρίς δρομολόγηση)

Μέση καθυστέρηση TCP: 6 us UDS μέση καθυστέρηση: 2 us PIPE μέση καθυστέρηση: 2 us TCP μέση απόδοση: 253702 msg/s Μέση απόδοση UDS: 1733874 msg/s μέση απόδοση PIPE: 1682796 msg/s

Έτσι, το UDS έχει καθυστέρηση από ~66% λιγότεροκαι απόδοσης μέσα 7 φορές περισσότερο TCP. Επομένως, πιθανότατα αξίζει να μεταβείτε σε UDS. Στην περίπτωσή μου, η υποδοχή θα βρίσκεται στο /var/run/php5-fpm.sock.

; Ας το σχολιάσουμε αυτό - listen = 127.0.0.1:9000 listen = /var/run/php5-fpm.sock

Θα πρέπει επίσης να βεβαιωθείτε ότι ο διακομιστής web (ή οποιαδήποτε άλλη διαδικασία που χρειάζεται να επικοινωνήσει) έχει πρόσβαση ανάγνωσης/εγγραφής στην υποδοχή σας. Υπάρχουν ρυθμίσεις για αυτό ακούστε.grupΚαι ακρόαση.λειτουργίαΟ ευκολότερος τρόπος είναι να εκτελέσετε και τις δύο διεργασίες από τον ίδιο χρήστη ή ομάδα, στην περίπτωσή μας php-fpm και ο διακομιστής web θα ξεκινήσει με την ομάδα www-data:

listen.owner = www-data listen.group = www-data listen.mode = 0660

Έλεγχος του επιλεγμένου μηχανισμού επεξεργασίας συμβάντων

Για να εργαστείτε αποτελεσματικά με I/O (είσοδος/έξοδος, περιγραφείς αρχείου/συσκευής/πρίζας), αξίζει να ελέγξετε εάν η ρύθμιση έχει καθοριστεί σωστά γεγονότα.μηχανισμός. Εάν το php-fpm έχει εγκατασταθεί από το αποθετήριο συστήματος, πιθανότατα όλα είναι καλά εκεί - είτε δεν έχει καθοριστεί (εγκατεστημένο αυτόματα) είτε έχει καθοριστεί σωστά.

Η σημασία του εξαρτάται από το λειτουργικό σύστημα, για το οποίο υπάρχει μια υπόδειξη στην τεκμηρίωση:

; - epoll (linux >= 2.5.44) ; - kqueue (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0) ; - /dev/poll (Solaris >= 7) ; - λιμάνι (Solaris >= 10)

Για παράδειγμα, εάν εργαζόμαστε σε μια σύγχρονη διανομή Linux, χρειαζόμαστε epool:

γεγονότα.μηχανισμός = επολ

Επιλογή τύπου πισίνας - δυναμικό / στατικό / κατ' απαίτηση

Επίσης, αξίζει να δώσετε προσοχή στις ρυθμίσεις του διαχειριστή διεργασιών (pm). Ουσιαστικά, αυτή είναι η κύρια διαδικασία, η οποία θα διαχειρίζεται όλα τα παιδιά της (που εκτελούν τον κώδικα της εφαρμογής) σύμφωνα με μια συγκεκριμένη λογική, η οποία στην πραγματικότητα περιγράφεται στο αρχείο διαμόρφωσης.

Υπάρχουν συνολικά 3 διαθέσιμα σχήματα ελέγχου διαδικασίας:

  • δυναμικός
  • στατικός
  • κατα παραγγελια

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

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

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

Διαρροές μνήμης και δολοφόνος OOM

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

  • pm.max_requests
  • request_terminate_timeout

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

request_terminate_timeoutορίζει το μέγιστο χρονικό διάστημα που μπορεί να εκτελεστεί μια θυγατρική διεργασία προτού σβήσει. Αυτό σας επιτρέπει να αποφύγετε μεγάλα ερωτήματα εάν για κάποιο λόγο έχει αλλάξει η τιμή max_execution_time στις ρυθμίσεις του διερμηνέα. Η τιμή θα πρέπει να οριστεί με βάση τη λογική των εφαρμογών που υποβάλλονται σε επεξεργασία, ας πούμε δεκαετία του '60(1 λεπτό).

Δημιουργία δυναμικής πισίνας

Για τον κύριο διακομιστή εφαρμογών, λόγω προφανών πλεονεκτημάτων, επιλέγεται συχνά ένα δυναμικό pool. Η λειτουργία του περιγράφεται από τις ακόλουθες ρυθμίσεις:

  • μ.μ.max_children- μέγιστος αριθμός θυγατρικών διεργασιών
  • pm.start_servers- αριθμός διαδικασιών κατά την εκκίνηση
  • pm.min_spare_servers- ο ελάχιστος αριθμός διαδικασιών που περιμένουν για συνδέσεις (αιτήματα για επεξεργασία)
  • pm.max_spare_servers- μέγιστος αριθμός διαδικασιών σε αναμονή για συνδέσεις (αιτήματα προς επεξεργασία)

Για να ορίσετε σωστά αυτές τις τιμές, είναι απαραίτητο να λάβετε υπόψη:

  • πόση μνήμη καταναλώνει κατά μέσο όρο μια παιδική διαδικασία;
  • ποσότητα διαθέσιμης μνήμης RAM

Μπορείτε να μάθετε τη μέση τιμή μνήμης ανά μία διεργασία php-fpm σε μια εφαρμογή που ήδη εκτελείται χρησιμοποιώντας τον προγραμματιστή:

# ps -ylC php-fpm --sort:rss S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD S 0 1445 1 0 80 0 9552 42588 ep_pol ? 00:00:00 php5-fpm

Χρειαζόμαστε τη μέση τιμή στη στήλη RSS (μέγεθος μόνιμης μνήμης σε kilobyte). Στην περίπτωσή μου είναι ~20MB. Εάν δεν υπάρχει φόρτωση σε εφαρμογές, μπορείτε να χρησιμοποιήσετε το Apache Benchmark για να δημιουργήσετε ένα απλό φορτίο σε php-fpm.

Η ποσότητα της συνολικής / διαθέσιμης / χρησιμοποιημένης μνήμης μπορεί να προβληθεί χρησιμοποιώντας Ελεύθερος:

# δωρεάν -m συνολικά χρησιμοποιημένο δωρεάν ... Μνήμη: 4096 600 3496

Συνολικές μέγιστες διεργασίες = (Συνολική μνήμη Ram - (Μεταχειρισμένη Ram + Buffer)) / (Μνήμη ανά διεργασία php) Συνολική μνήμη RAM: 4 GB Χρησιμοποιημένη RAM: 1000 MB Ενδιάμεση μνήμη ασφαλείας: 400 MB Μνήμη ανά παιδί διεργασία php-fpm (κατά μέσο όρο): 30 MB Μέγιστος δυνατός αριθμός διεργασιών = (4096 - (1000 + 400)) / 30 = 89 Ζυγός αριθμός: 89 στρογγυλοποιούνται προς τα κάτω στο 80

Η τιμή των υπόλοιπων οδηγιών μπορεί να οριστεί με βάση το αναμενόμενο φορτίο στην εφαρμογή και επίσης να ληφθεί υπόψη τι άλλο κάνει ο διακομιστής εκτός από την εκτέλεση php-fpm (για παράδειγμα, το DBMS απαιτεί επίσης πόρους). Εάν υπάρχουν πολλές εργασίες στον διακομιστή, αξίζει να μειώσετε τον αριθμό των αρχικών / μέγιστων διεργασιών.

Για παράδειγμα, ας λάβουμε υπόψη ότι υπάρχουν 2 pools www1 και www2 στον διακομιστή (για παράδειγμα, 2 πόροι Ιστού), τότε η διαμόρφωση καθενός από αυτά μπορεί να μοιάζει με:

pm.max_children = 40 ; 80 / 2 pm.start_servers = 15 pm.min_spare_servers = 15 pm.max_spare_servers = 25

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

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

Ας προχωρήσουμε σε μια συγκεκριμένη εργασία "εκτελούμενη" - ένα επίπεδο αντικειμένου για εργασία με βάσεις δεδομένων στην PHP. Υπάρχει μια μεγάλη ποικιλία λύσεων, που κυμαίνονται από ΠΟΠ έως πολυεπίπεδες (και, κατά τη γνώμη μου, όχι απόλυτα κατάλληλες σε PHP) μηχανές ORM.

Οι περισσότερες από αυτές τις λύσεις μεταφέρθηκαν στην PHP από άλλες πλατφόρμες. Συχνά όμως οι συγγραφείς δεν λαμβάνουν υπόψη τα χαρακτηριστικά της PHP, κάτι που θα απλοποιούσε σημαντικά τόσο τη γραφή όσο και τη χρήση των μεταφερόμενων δομών.
Μία από τις κοινές αρχιτεκτονικές για αυτήν την κατηγορία εργασιών είναι το μοτίβο Active Record. Συγκεκριμένα, αυτό το πρότυπο χρησιμοποιείται για τη δημιουργία των λεγόμενων οντοτήτων, οι οποίες χρησιμοποιούνται με τη μία ή την άλλη μορφή σε διάφορες πλατφόρμες, που κυμαίνονται από μόνιμα φασόλια στο EJB3 έως EF στο .NET.

Λοιπόν, ας δημιουργήσουμε μια παρόμοια κατασκευή για την PHP. Ας συνδυάσουμε δύο ωραία πράγματα - την έτοιμη βιβλιοθήκη ADODB και τις ασθενώς πληκτρολογημένες και δυναμικές ιδιότητες των αντικειμένων της γλώσσας PHP.
Ένα από τα πολλά χαρακτηριστικά του ADODB είναι η λεγόμενη αυτόματη δημιουργία ερωτημάτων SQL για εισαγωγή (INSERT) και ενημέρωση (UPDATE) εγγραφών που βασίζονται σε συσχετιστικούς πίνακες με δεδομένα.
Στην πραγματικότητα, δεν υπάρχει τίποτα στρατιωτικό για τη λήψη ενός πίνακα, όπου τα κλειδιά είναι τα ονόματα των πεδίων και οι τιμές είναι, αντίστοιχα, τα δεδομένα και δημιουργούν μια συμβολοσειρά ερωτήματος SQL. Αλλά το ADODB το κάνει με πιο έξυπνο τρόπο. Το ερώτημα βασίζεται στη δομή του πίνακα, η οποία έχει προηγουμένως διαβαστεί από το σχήμα της βάσης δεδομένων. Ως αποτέλεσμα, πρώτον, μόνο τα υπάρχοντα πεδία περιλαμβάνονται στην sql και όχι όλα στη σειρά, δεύτερον, λαμβάνεται υπόψη ο τύπος πεδίου - προστίθενται εισαγωγικά για συμβολοσειρές, οι μορφές ημερομηνίας μπορούν να διαμορφωθούν με βάση τη χρονική σήμανση εάν το δει το ADODB αντί για μια συμβολοσειρά στην μεταδιδόμενη τιμή κ.λπ. .

Τώρα ας πάμε από την πλευρά της PHP.
Ας φανταστούμε μια τέτοια τάξη (απλοποιημένη).

Οντότητα κλάσης( προστατευμένα $fields = array(); δημόσια τελική συνάρτηση __set($name, $value) ($this->fields[$name] = $value; ) δημόσια τελική συνάρτηση __get($name) (επιστροφή $ this- >πεδία[$name]; ) )

Περνώντας τον εσωτερικό πίνακα στη βιβλιοθήκη ADODB, μπορούμε να δημιουργήσουμε αυτόματα ερωτήματα SQL για να ενημερώσουμε μια εγγραφή στη βάση δεδομένων με ένα δεδομένο αντικείμενο. Ταυτόχρονα, δεν χρειάζονται περίπλοκα σχέδια για την αντιστοίχιση πεδίων πίνακα βάσης δεδομένων σε οντότητα που βασίζεται σε XML πεδία αντικειμένων και παρόμοια. Είναι απαραίτητο μόνο το όνομα του πεδίου να ταιριάζει με την ιδιότητα του αντικειμένου. Δεδομένου ότι το πώς ονομάζονται τα πεδία στη βάση δεδομένων και τα πεδία του αντικειμένου δεν έχει σημασία για τον υπολογιστή, δεν υπάρχει λόγος να μην ταιριάζουν.

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

Ας φανταστούμε ότι έχουμε ένα σημάδι σαν αυτό:

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ «χρήστες» («όνομα χρήστη» varchar(255), ημερομηνία «δημιουργίας», «αναγνωριστικό_χρήστη» int(11) ΟΧΙ NULL AUTO_INCREMENT, ΚΥΡΙΟ ΚΛΕΙΔΙ («user_id»))
Ο τύπος της βάσης δεδομένων δεν έχει σημασία - το ADODB παρέχει φορητότητα σε όλους τους κοινούς διακομιστές βάσεων δεδομένων.

Ας δημιουργήσουμε μια κλάση οντότητας χρήστη με βάση την κλάση οντότητα

/** * @table=users * @keyfield=user_id */ class Ο χρήστης επεκτείνει την οντότητα( )

Αυτό είναι όλο.
Εύχρηστος:

$user = νέος χρήστης(); $user->username="Vasya Pupkin"; $user->created=time(); $user->save(); //save to storage //load again $thesameuser = User::load($user->user_id); echo $thesameuser ->όνομα χρήστη;

Υποδεικνύουμε τον πίνακα και το πεδίο κλειδιού σε ψευδοσημειώσεις.
Μπορούμε επίσης να καθορίσουμε μια προβολή (για παράδειγμα, view = userview) εάν, όπως συμβαίνει συχνά, η οντότητα επιλέγεται βάσει του πίνακα της με συνημμένα ή υπολογισμένα πεδία. Σε αυτήν την περίπτωση, τα δεδομένα θα επιλεγούν από την προβολή και ο πίνακας θα ενημερωθεί. Όσοι δεν τους αρέσουν τέτοιοι σχολιασμοί μπορούν να παρακάμψουν τη μέθοδο getMetatada() και να καθορίσουν τις παραμέτρους του πίνακα στον πίνακα που επιστρέφεται.

Τι άλλο είναι χρήσιμο για την κλάση Entity σε αυτήν την υλοποίηση;

Για παράδειγμα, μπορούμε να παρακάμψουμε τη μέθοδο init(), η οποία καλείται μετά τη δημιουργία μιας παρουσίας οντότητας, για να αρχικοποιήσουμε την προεπιλεγμένη ημερομηνία δημιουργίας.
Ή υπερφορτώνετε τη μέθοδο afterLoad(), η οποία καλείται αυτόματα μετά τη φόρτωση μιας οντότητας από τη βάση δεδομένων, για να μετατρέψετε την ημερομηνία σε χρονική σήμανση για περαιτέρω πιο βολική χρήση.
Ως αποτέλεσμα, έχουμε μια όχι πολύ πιο περίπλοκη δομή.

/** * @table=users * @view=usersview * @keyfield=user_id */ class Ο χρήστης επεκτείνει την οντότητα( προστατευμένη συνάρτηση init() ( $this->created = time(); ) προστατευμένη συνάρτηση afterLoad() ( $this ->created = strtotime($this->created); ) )

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

Φορτώνουμε μια λίστα οντοτήτων με κριτήριο (ουσιαστικά προϋπόθεση για το WHERE).
$users = Χρήστης::load("όνομα χρήστη όπως "Pupkin" ");
Επίσης, η κλάση Entity σάς επιτρέπει να εκτελέσετε ένα αυθαίρετο, "εγγενές" ερώτημα SQL, ας πούμε έτσι. Για παράδειγμα, θέλουμε να επιστρέψουμε μια λίστα χρηστών με ορισμένες ομαδοποιήσεις βάσει στατιστικών. Δεν έχει σημασία ποια συγκεκριμένα πεδία θα επιστραφούν (το κύριο πράγμα είναι ότι θα πρέπει να υπάρχει ένα user_id εάν υπάρχει ανάγκη περαιτέρω χειρισμού της οντότητας), απλά πρέπει να γνωρίζετε τα ονόματά τους για να αποκτήσετε πρόσβαση στα επιλεγμένα πεδία. Κατά την αποθήκευση μιας οντότητας, όπως είναι προφανές από τα παραπάνω, δεν χρειάζεται επίσης να συμπληρώσετε όλα τα πεδία που θα υπάρχουν στο αντικείμενο οντότητας, αυτά θα πάνε στη βάση δεδομένων. Δηλαδή, δεν χρειάζεται να δημιουργήσουμε επιπλέον κλάσεις για τυχαία δείγματα. Όπως και οι ανώνυμες δομές κατά την ανάκτηση στο EF, μόνο που εδώ είναι η ίδια κατηγορία οντοτήτων με όλες τις μεθόδους επιχειρηματικής λογικής.

Αυστηρά μιλώντας, οι παραπάνω μέθοδοι για τη λήψη λιστών είναι κάπως πέρα ​​από το μοτίβο AR. Ουσιαστικά, αυτές είναι εργοστασιακές μέθοδοι. Αλλά όπως κληροδότησε ο γέρος του Occam, ας μην δημιουργήσουμε οντότητες πέρα ​​από αυτό που είναι απαραίτητο και ας δημιουργήσουμε ένα ξεχωριστό Entity Manager ή κάτι τέτοιο.

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

Ποιος μπορεί να ωφεληθεί από αυτό; Φυσικά, όχι σε έμπειρους προγραμματιστές που πιστεύουν ότι η χρήση κάτι απλούστερου από ένα δόγμα δεν είναι σεβαστή, και όχι στους τελειομανείς που είναι σίγουροι ότι εάν μια λύση δεν αποσύρει ένα δισεκατομμύριο κλήσεις στη βάση δεδομένων ανά δευτερόλεπτο, τότε δεν είναι λύση . Κρίνοντας από τα φόρουμ, πολλοί απλοί προγραμματιστές που εργάζονται σε συνηθισμένα έργα (99,9%) αντιμετωπίζουν αργά ή γρήγορα το πρόβλημα της εύρεσης ενός απλού και βολικού τρόπου πρόσβασης στη βάση δεδομένων που βασίζεται σε αντικείμενα. Αλλά έρχονται αντιμέτωποι με το γεγονός ότι οι περισσότερες λύσεις είτε είναι αδικαιολόγητα εξελιγμένες είτε αποτελούν μέρος κάποιου είδους πλαισίου.

ΥΣΤΕΡΟΓΡΑΦΟ. Έφτιαξε τη λύση από το πλαίσιο ως ξεχωριστό έργο

1. ΟΜΑΔΟΠΟΙΗΣΤΕ ΑΠΟ ένα κλειδί

Αυτή η συνάρτηση λειτουργεί ως GROUP BY για πίνακα, αλλά με έναν σημαντικό περιορισμό: Είναι δυνατή μόνο μία "στήλη" ομαδοποίησης ($identifier).

Συνάρτηση arrayUniqueByIdentifier( array $array, string $identifier) ​​( $ids = array_column($array, $identifier); $ids = array_unique($ids); $array = array_filter($array, function ($key, $value) ) χρήση ($ids) ( return in_array($value, array_keys($ids)); ), ARRAY_FILTER_USE_BOTH); επιστροφή $array; )

2. Ανίχνευση των μοναδικών σειρών για έναν πίνακα (δισδιάστατος πίνακας)

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

Η στρατηγική είναι απλή: Δημιουργήστε από τον αρχικό πίνακα έναν ρηχό πίνακα, όπου τα στοιχεία είναι εμπλουτισμένα d "στήλες" του αρχικού πίνακα. στη συνέχεια εφαρμόστε το array_unique(...) σε αυτό. και ως τελευταία χρησιμοποιήστε τα αναγνωριστικά που εντοπίστηκαν για το φιλτράρισμα του αρχικού πίνακα.

Συνάρτηση arrayUniqueByRow(array $table = , string $implodeSeparator) ( $elementStrings = ; foreach ($table ως $row) ( // Για να αποφύγετε ειδοποιήσεις όπως "Μετατροπή πίνακα σε συμβολοσειρά". $elementPreparedForImplode = array_map(function ($field) $valueType = gettype($field); $simpleTypes = ["boolean", "integer", "double", "float", "string", "NULL"]; $field = in_array($valueType, $simpleTypes) ? $field: $valueType; επιστροφή $field; ), $row), επιστροφή $table; )

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

Το $implodeSeparator θα πρέπει να είναι περισσότερο ή λιγότερο πολύπλοκο, z.B. spl_object_hash($this) .

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

Αυτή η λύση βασίζεται στη 2η. Τώρα η πλήρης "σειρά" δεν χρειάζεται να είναι μοναδική. Δύο "σειρές" (στοιχεία της πρώτης διάστασης) είναι ίσες τώρα, αν όλες σχετικόΤα "πεδία" (στοιχεία της δεύτερης διάστασης) της μίας "σειράς" είναι ίσα με τα αντίστοιχα "πεδία" (στοιχεία με το ίδιο κλειδί).

Τα "σχετικά" "πεδία" είναι τα "πεδία" (στοιχεία της δεύτερης διάστασης), τα οποία έχουν κλειδί, που ισούται με ένα από τα στοιχεία των περασμένων "αναγνωριστικών".

Συνάρτηση arrayUniqueByMultipleIdentifiers (πίνακας $πίνακας, πίνακας $identifiers, συμβολοσειρά $implodeSeparator = null) ( $arrayForMakingUniqueByRow = $removeArrayColumns($table, $identifiers, true); deSeparator); $arrayUniqueByMultipleI αναγνωριστικά = array_intersect_key ($table, $arrayUniqueByRow); επιστροφή $arrayUniqueByMultipleIdentifiers; ) συνάρτηση removeArrayColumns(πίνακας $table, πίνακας $columnNames, bool $isWhitelist = false) ( foreach ($table ως $rowKey (if$_is) row )) ( if ($isWhitelist) ( foreach ($row as $fieldName => $fieldValue) (if (!in_array($fieldName, $columnNames)) ( unset($table[$rowKey][$fieldName] ); ) ) επιστροφή $ πίνακα;)

Η PHP μπορεί να ονομαστεί πλήρως η «λαϊκή γλώσσα του προγραμματισμού Ιστού»· είναι πολύ δύσκολο να βρεθεί άλλη γλώσσα που θα μπορούσε να την ανταγωνιστεί επί ίσοις όροις όσον αφορά τη δημοτικότητά της. Αποφάσισα να γνωρίσω τους ανθρώπους πίσω από την ανάπτυξή του, να απαντήσω σε πιεστικές ερωτήσεις, να συζητήσω τις τελευταίες καινοτομίες και ακόμη και να προσπαθήσω να κοιτάξω το μέλλον του Διαδικτύου. Για να το κάνουμε αυτό, συναντηθήκαμε με τους θρυλικούς συμμετέχοντες PHP Core Team, οι οποίοι επιβλέπουν άμεσα την ανάπτυξη αυτής της γλώσσας και έχουν κερδίσει τη φήμη ως αναγνωρισμένων παγκόσμιων ειδικών στον τομέα των τεχνολογιών Ιστού.

Έτσι, σήμερα κορυφαίοι προγραμματιστές από PHP Core Team— (Andrei Zmievski), (Stas Malyshev), (Ilia Alshanetsky).

Για αρχή, πείτε μας λίγα λόγια για τον εαυτό σας - τι κάνετε τώρα και πού εργάζεστε. Θυμηθείτε την ιστορία του πώς ήρθατε στον κόσμο του προγραμματισμού.

SM:Τώρα ζω στις ΗΠΑ και εργάζομαι σε μια εταιρεία, δουλεύοντας στην υποδομή αυτού του προϊόντος - δηλ. εκείνα τα μέρη του συστήματος που παρέχουν τη βάση για γενική λειτουργικότητα και παρέχουν μια διεπαφή για την ανάπτυξη συγκεκριμένων λειτουργικών μονάδων.

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

Θα ήταν δύσκολο να απαριθμήσω όλα όσα με επηρέασαν σε αυτό το μονοπάτι, αλλά τα βιβλία πιθανότατα είχαν τη μεγαλύτερη επίδραση πάνω μου, ιδιαίτερα τα έργα (The Mythical Man-Month) και (The Inmates Are Running the Asylum - σε ρωσική μετάφραση «Ψυχιατρικό νοσοκομείο στα χέρια ασθενών»).

Α-Ω:Ζω στο Σαν Φρανσίσκο εδώ και 5 χρόνια και νομίζω ότι είναι η πιο όμορφη πόλη της Αμερικής. Δουλεύω σε μια εταιρεία. Αν και πρόκειται για μια σχετικά νέα startup, έχουμε ήδη περίπου 110-120 υπαλλήλους. Μια μεγάλη ποικιλία εταιρειών σε όλο τον κόσμο χρησιμοποιούν το προϊόν μας για να παρακολουθούν τα επιχειρηματικά τους συστήματα και να εντοπίζουν γρήγορα προβλήματα. Έχουμε επίσης μεγάλους πελάτες, για παράδειγμα, Netflix, Priceline και άλλους.

Όσο για τον έρωτά μου με τον προγραμματισμό... θεωρώ ότι το πιο πιθανό είναι να σε επιλέξει αυτό το επάγγελμα παρά να το επιλέξεις εσύ. Θυμάμαι όταν ήμουν 9 ετών, έλαβα την πρώτη μου προγραμματιζόμενη αριθμομηχανή, αλλά ακόμη και πριν από αυτό είχα αξιοσημείωτες κλίσεις προς τα μαθηματικά, τη λογική και τα τεχνικά πράγματα - από όσο θυμάμαι, αυτές οι ικανότητες ήταν εγγενείς σε μένα.

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

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

ΙΑ:Ζω και εργάζομαι στο Τορόντο του Καναδά.

Όσο για την είσοδό μου στον προγραμματισμό, εξακολουθεί να μου προκαλεί έκπληξη. Στην αρχή του ταξιδιού μου, ο προγραμματισμός ήταν περισσότερο χόμπι, εκτός από μια περίεργη δουλειά που κατά κάποιο τρόπο απέκτησα για το καλοκαίρι, που σχετίζεται με την ανάπτυξη χαμηλού επιπέδου στο C. Όταν ήμουν νέος, ποτέ δεν έβαλα συνειδητά στόχους ή σχέδια στον εαυτό μου να το κάνω επαγγελματικά. Ενώ ασχολιόμουν ερασιτεχνικά με τα προγράμματα C μου, κάποτε συμμετείχα στην πρώτη μου προσαρμοσμένη ανάπτυξη ιστού, η οποία έγινε στο Perl. Εδώ ξεκινά το ταξίδι μου στο Διαδίκτυο και η εξειδίκευσή μου στον προγραμματισμό Ιστού.

Δυστυχώς, καθώς αυτό το έργο της Perl μεγάλωνε, δεν μου άρεσε όλο και περισσότερο η ασυνέπεια αυτής της γλώσσας και η εταιρεία φιλοξενίας που με εξυπηρετούσε εκείνη την εποχή, «ταλαιπωρημένη» από εμένα, μια μέρα προσφέρθηκε η ίδια να δοκιμάσω την PHP, η οποία ήταν νέα για αυτό χρόνος. Μου άρεσε αμέσως αυτή η γλώσσα γιατί ήταν καλύτερα δομημένη και πιο κοντά στη σύνταξή της στην αγαπημένη μου C. Εξαιρετική ηλεκτρονική τεκμηρίωση - ολοκλήρωσε τη γρήγορη και τελική μετεγκατάστασή μου σε αυτό.


Ilya Alshanetsky

Άρχισα να χρησιμοποιώ την PHP 3 τόσο ενεργά που σταδιακά άρχισαν να εμφανίζονται οι δικές μου εξελίξεις, επεκτείνοντας τις δυνατότητές της, τις οποίες άρχισα να προσφέρω τακτικά στο κανάλι IRC στον δημιουργό της Rasmus. Υπήρχαν τόσες πολλές ενημερώσεις κώδικα και διορθώσεις από εμένα που γρήγορα το κουράστηκε και μου έδωσε απευθείας πρόσβαση στο CVS στο αποθετήριο του έργου. Από τότε, έχουν γραφτεί και γίνει πολλά, είχα μάλιστα την ευκαιρία να γίνω διαχειριστής έκδοσης (PHP release master) για τις δημοφιλείς εκδόσεις 4.3, 5.1 και 5.2.

Παρεμπιπτόντως, παράλληλα με αυτή τη δραστηριότητα, υπήρχε πολλή συμβουλευτική εργασία για εξωτερικούς εμπορικούς πελάτες, για τους οποίους μερικές φορές πολύ εξαιρετικά προβλήματα με την απόδοση, την επεκτασιμότητα και την ασφάλεια των δικών τους έργων που δημιουργήθηκαν στην PHP επιλύονταν ιδιωτικά. Σε μια από αυτές τις διαβουλεύσεις, βυθίστηκα τόσο βαθιά στο έργο τους που κατέληξα να γίνω συνεργάτης σε αυτήν την εταιρεία (Centah Inc.) και έλαβα τη θέση του CIO, όπου εργάζομαι αυτήν τη στιγμή.

Πώς μπήκατε στην ομάδα PHP Core, ποιο μονοπάτι ακολουθήσατε για να φτάσετε εκεί;

Α-Ω:Επιτρέψτε μου να απαντήσω με το δικό μου παράδειγμα, αλλά πρώτα μια μικρή ιστορία. Άρχισα να δουλεύω με την PHP γύρω στο 1998, τότε ήταν η PHP 3, μια από τις παλαιότερες εκδόσεις. Ξαναγράφαμε ένα μεγάλο έργο από άλλη γλώσσα σε PHP και έπρεπε να βρω υποστήριξη για το σχεδόν ξεχασμένο . Δεν βρήκα τέτοια βιβλιοθήκη, αλλά μου άρεσε πολύ που η PHP είχε εξαιρετική τεκμηρίωση και API, οπότε αποφάσισα να γράψω τη δική μου επέκταση. Όταν τελείωσα, το έστειλα αμέσως στη λίστα αλληλογραφίας της PHP. Και απροσδόκητα για μένα, αποφάσισαν να το προσθέσουν στην επόμενη έκδοση της γλώσσας.

Στη συνέχεια, μου δόθηκε πρόσβαση στο CVS και άρχισα να διορθώνω σφάλματα, να γράφω περισσότερες διαφορετικές λειτουργίες κ.λπ. Μέχρι το τέλος του 1999, ήμουν ένα από τα πιο ενεργά μέλη της ομάδας και στη συνέχεια πρότεινα τη διοργάνωση της πρώτης συνάντησης προγραμματιστών PHP στο Ισραήλ για να συζητήσουμε το μέλλον της γλώσσας και με συμπεριέλαβα σε αυτήν τη λίστα αλληλογραφίας. Άρα δεν έγινε ψηφοφορία, έτυχε να μπω αμέσως PHP Core Team.


Rasmus Lerdorf, δημιουργός της PHP

Αυτό το είδος εμπιστοσύνης και διαφάνειας με παρακίνησε να δουλεύω όλο και περισσότερο στον κώδικα PHP. Μετά το WDDX, δούλεψα σε μια ενότητα συνεδρίας, μετά έγραψα μια δέσμη συναρτήσεων για να δουλέψω με πίνακες και μετά αποφάσισα ότι η PHP έπρεπε να έχει κανονικές εκφράσεις παρόμοιες με την Perl, οπότε δημιούργησα μια λειτουργική μονάδα PCRE. Μέχρι εκείνη τη στιγμή, η PHP 4 είχε κυκλοφορήσει εδώ και καιρό, αλλά με ενοχλούσαν πολύ ορισμένα προβλήματα με τον τρόπο που λειτουργούσαν τα αντικείμενα και οι κλάσεις (ή μάλλον δεν λειτουργούσαν). Με αυτήν την ευκαιρία, είχα μακρά αλληλογραφία με τον Andi και τον Zeev, οι οποίοι δημιούργησαν το , και αυτό οδήγησε σε ουσιαστικά νέα υποστήριξη Αντικειμενοστραφής προγραμματισμόςστη νέα τότε PHP 5.

Μετά από αυτό, δούλεψα κυρίως στον κώδικα για το ίδιο το Zend Engine και έφτιαξα επίσης μια νέα μονάδα tokenizer. Από το 2003, μαζί με τον Rasmus, και εκεί ξεκίνησα ένα έργο για την υποστήριξη Unicode σε PHP, αλλά αυτό είναι για άλλη μια φορά...

Τι πιστεύετε ότι είναι για την PHP που την έχει κάνει τόσο δημοφιλή;

Α-Ω:Τυχαίνει αυτή τη στιγμή να γράφω ένα έργο σε C++ και Python, οπότε θα απαντήσω με βάση αυτή τη συγκριτική εμπειρία, μοιάζοντας σαν από αυτό το «διαφορετικό καμπαναριό».

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

Τα σφάλματα ασφαλείας είναι ένας σημαντικός πονοκέφαλος για τους προγραμματιστές Ιστού και τους πολλούς χρήστες των προϊόντων τους. Ανατρέχοντας στην εκτεταμένη εμπειρία σας, ποια είναι τα πιο σημαντικά και τυπικά προβλήματα ασφάλειας με την PHP και τους προγραμματιστές της; Μπορείτε να δώσετε κάποια συμβουλή για την εκπαίδευση νέων προγραμματιστών PHP;

SM:Ένα από τα κύρια μαθήματα, νομίζω, είναι ότι η ασφάλεια του κώδικα δεν είναι μια ποιότητα που μπορεί να ενσταλάξει εξωτερικά, ανεξάρτητα από τον υπόλοιπο κώδικα. Όσον αφορά την ασφάλεια πρέπει να είναι καθημερινό μέρος της εργασίας, από το πρώτο κιόλας λεπτό, από το σχεδιασμό έως την κυκλοφορία του τελικού προϊόντος. Έχουν γίνει αρκετές προσπάθειες να προστεθούν χαρακτηριστικά ασφαλείας "από έξω" στην PHP - αλλά η εμπειρία έχει δείξει ότι αυτές οι προσπάθειες, χωρίς συνεχή επαγρύπνηση από την πλευρά του προγραμματιστή, είναι καταδικασμένες σε αποτυχία. Η πλατφόρμα μπορεί μόνο να τον βοηθήσει να παρακολουθεί την ασφάλεια του κώδικα, αλλά δεν μπορεί να εγγυηθεί αυτήν την ασφάλεια χωρίς προσπάθεια εκ μέρους του.

Επομένως, η κύρια συμβουλή θα ήταν η ακόλουθη - μην εμπιστεύεστε ποτέ εξωτερικά δεδομένα ή δεδομένα για τα οποία είναι δυνατός ο έλεγχος από έξω. Το 99% των προβλημάτων ασφαλείας παρουσιάζονται επειδή οι υποθέσεις που γίνονται σχετικά με τα δεδομένα εισόδου αποδεικνύονται λανθασμένες και όταν στη συνέχεια συμβεί μια επίθεση, ο κώδικας συμπεριφέρεται διαφορετικά από ό,τι σχεδίαζε ο προγραμματιστής. Επομένως, αναπτύξτε τη συνήθεια να ρωτάτε πάντα τον εαυτό σας - «τι γίνεται αν αυτή η παράμετρος αλλάξει με απροσδόκητο τρόπο; Τι γίνεται αν αυτό το επιχείρημα δεν εφαρμοστεί όπως επιδιώκεται;» Και δοκιμάστε τον κωδικό σας ανάλογα.

Η επόμενη σύστασή μου είναι ότι αντί να ελέγχετε "εάν υπάρχει κάτι παράνομο στα δεδομένα", μετατρέψτε προληπτικά τα δεδομένα έτσι ώστε να είναι εγγυημένα όπως θα έπρεπε. Αυτό θα διευκολύνει πολύ την αποφυγή λαθών. Επίσης, μην βασίζεστε σε άλλα μέρη του κώδικά σας για να φροντίσετε την ασφάλεια—για παράδειγμα, εάν κάνετε ένα ερώτημα δυναμικής βάσης δεδομένων, βεβαιωθείτε πάντα ότι οι παράμετροι και το ερώτημα δημιουργούνται και φιλτράρονται με τέτοιο τρόπο ώστε sql injectionείναι αδύνατο - ακόμα κι αν είστε βέβαιοι ότι τα δεδομένα φιλτράρονται κάπου αλλού (για παράδειγμα, σε επίπεδο πλαισίου). Στη συνέχεια, εάν ο εξωτερικός κώδικας αλλάξει με τέτοιο τρόπο ώστε αφιλτράριστα δεδομένα εισέλθουν ξαφνικά στη διαδικασία σας, η ευπάθεια δεν θα προκύψει.

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

Σε γενικές γραμμές, το πρόγραμμα περιήγησης θα γίνει τελικά ένα πλήρες μέρος της υποδομής ιστού και ως εκ τούτου ορισμένες από τις ευθύνες που εκτελεί επί του παρόντος ο διακομιστής θα μεταφερθούν στην πλευρά του πελάτη. Επομένως, θα συμβούλευα τα άτομα που εργάζονται αυτήν τη στιγμή με την PHP να παρακολουθούν επίσης τις τελευταίες εξελίξεις σε Javascript, HTML5, CSS3 κ.λπ.

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

Χαρακτήρες:


Αντρέι Ζμιέφσκι, ένας από τους επιμελητές Έργο PHP, προγραμματιστής Zend Engine, δημιουργός έργου και συν-συγγραφέας του δημοφιλούς εγχειριδίου, συγγραφέας υλοποιήσεων Unicode και OOP στην PHP. Στον ελεύθερο χρόνο του απολαμβάνει τον αθλητισμό, τη ζυθοποιία στο σπίτι και τη μαγειρική. Του αρέσει πολύ να διαβάζει και να ταξιδεύει.

Stas Malyshev, συμμέτοχος Έργο PHPαπό το 2000, υπεύθυνος έκδοσης έκδοσης PHP 5.4, συμμετέχων σε πολλά έργα OpenSource. Στον ελεύθερο χρόνο του, πνευματικά παιχνίδια (αθλητική έκδοση του «Τι; Πού; Πότε;», «Brain Ring») και αϊκίντο.

Ilya Alshanetsky, ειδικός σε θέματα ασφάλειας και ένας από τους παλαιότερους προγραμματιστές PHP, επικεφαλής, υπεύθυνος έκδοσης εκδόσεων PHP 4.3, 5.1, 5.2, δημιουργός της μηχανής φόρουμ, ενεργός συμμετέχων σε πολλά έργα OpenSource. και στο θέμα της ασφάλειας προγραμματισμού Ιστού.

p.s.: Υπόσχομαι ότι το νέο έτος 2013 θα δημοσιεύσω πολλές περισσότερες από τις VIP συνεντεύξεις μου με κορυφαίους προγραμματιστές στον κόσμο - ας παραμείνουν ορισμένες λεπτομέρειες μυστικό προς το παρόν.