Qu'est-ce que php-figue? Entité "Cadre" pour PHP d'une classe Comment avez-vous eu une équipe de base PHP, ce que la façontte est allée à cette

16.09.2016

Essayons de déterminer comment vous pouvez améliorer les performances du serveur d'applications sur la base de données PHP-FPM et former une liste de contrôle pour vérifier la configuration du processus FPM.

Tout d'abord, il convient de déterminer l'emplacement du fichier de configuration de la piscine. Si vous avez installé PHP-FPM dans le référentiel système, la configuration de la piscine www Il sera situé environ ici /etc/php5/fpm/pool.d/www.conf. Si votre version est utilisée ou un autre système d'exploitation (non debian), vous devez rechercher l'emplacement du fichier dans la documentation ou la spécifier manuellement.

Essayons de considérer la configuration plus de détails.

Aller à des prises UNIX

La première chose à faire attention correspond probablement à la manière dont les données d'un serveur Web à vos processus PHP sont probablement. Ceci est reflété dans la directive de l'écoute:

Écoute \u003d 127.0.0.1:9000

Si l'adresse est définie: le port est défini via la pile TCP, ce qui n'est probablement pas très bon. S'il y a un chemin vers la prise, par exemple:

Écoute \u003d /var/run/php5-fpm.sock.

les données passent via une prise UNIX et vous pouvez ignorer cette section.

Pourquoi vaut-il toujours la peine de bouger sur une prise UNIX? UDS (socket de domaine UNIX), contrairement à une communication à travers la pile TCP, présente des avantages importants:

  • ne nécessite pas de commutation de contexte, UDS utilise Netisr)
  • uDS DATAGRAM enregistré directement sur la prise de destination
  • l'envoi de datagrammes uds nécessite moins d'opérations (pas de somme de contrôle, pas de Capage TCP, de ne pas produire de routage)

TCP Délai moyen: 6 US UDS Délai moyen: 2 Délai moyen des tuyaux américains: 2 US TCP Bande passante moyenne: 253702 MSG / S Bande passante moyenne: 1733874 MSG / S Pipe Débit de la moyenne: 1682796 MSG / S

Ainsi, les UDS tardent ~ 66% de moins et bande passante dans 7 fois plus TCP. Par conséquent, probablement, il vaut la peine de bouger sur des UD. Dans mon cas, la prise sera située à /var/run/php5-fpm.sock.

; Comvent this - Écouter \u003d 127.0.0.1:9000 Écouter \u003d /var/run/php5-fpm.sock

Vous devez également vous assurer que le serveur Web (ou tout autre processus requis selon lequel les besoins de communication) dispose d'un accès en lecture / écriture à votre prise. Il existe des paramètres pour cela. écouter.grup. et écouter.mode. Le moyen le plus simple consiste à exécuter les deux processus d'un utilisateur ou d'un groupe, dans notre cas PHP-FPM et le serveur Web sera lancé avec un groupe. www-data.:

Écouter.owner \u003d www-data été écouter.group \u003d www-data été écouter.mode \u003d 0660

Vérifiez le mécanisme de traitement de l'événement sélectionné

Pour fonctionner avec un fonctionnement efficace avec des E / S (sortie-sortie, gestionnaires de fichiers / dispositifs / sockets), il convient de vérifier si le réglage est correctement indiqué. Événements.Mécanisme. Si PHP-FPM est défini à partir du référentiel système, tout est probablement tout est en ordre. Il n'est pas spécifié (installé automatiquement) ou spécifié correctement.

Sa valeur dépend du système d'exploitation, pour lequel il y a un indice dans la documentation:

; - Epoll (Linux\u003e \u003d 2.5.44); - KQuue (FreeBSD\u003e \u003d 4.1, openbsd\u003e \u003d 2.9, NetBSD\u003e \u003d 2.0); - / dev / sondage (Solaris\u003e \u003d 7); - Port (Solaris\u003e \u003d 10)

Par exemple, si nous travaillons sur une distribution de Linux moderne, nous avons besoin d'Epool:

Événements.Mécanisme \u003d Epoll

Sélection de type piscine - Dynamique / Statique / Ondemand

En outre, il convient de faire attention aux paramètres du gestionnaire de processus (PM). En substance, c'est le processus principal (processus maître), qui gérera toutes les filiales (qui exécutent le code de l'application) par une logique spécifique qui est décrite dans le fichier de configuration.

Au total, 3 schémas de gestion de processus sont disponibles:

  • dynamique
  • statique.
  • sur demande.

Le plus simple est statique.. Le schéma de ses travaux est le suivant: exécutez un nombre fixe de processus d'enfants et les maintenir en état de fonctionnement. Ce système d'exploitation n'est pas très efficace, car le nombre de demandes et leur charge peut varier de temps à autre, et le nombre de processus enfants ne sont pas - ils occupent toujours une certaine quantité de RAM et ne peuvent pas traiter des charges de pointe dans l'ordre de la file d'attente. .

dynamique La piscine résoudra ce problème, il ajuste le nombre de processus enfants en fonction des valeurs du fichier de configuration, de la modifier en un côté important ou plus petit, en fonction de la charge. Cette piscine convient le mieux au serveur d'applications, ce qui nécessite une réponse rapide à une demande, fonctionne avec une charge de pointe, une économie de ressources est requise (en réduisant les filiales lorsque simple).

sur demande. la piscine est très similaire à statique.Mais il ne lance pas les processus d'enfants au début du processus principal. Ce n'est que lorsque la première demande vient - le premier processus enfant sera créé et après l'expiration d'un certain temps d'attente (spécifié dans la configuration), il sera détruit. Par conséquent, il est pertinent pour les serveurs avec des ressources limitées, ou cette logique qui ne nécessite pas une réponse rapide.

Fuite de la mémoire et Oom Killer

L'attention devrait être accordée à la qualité des applications qui seront effectuées par des processus d'enfants. Si la qualité de l'application n'est pas très élevée ou que plusieurs bibliothèques tierces sont utilisées, vous devez alors penser à des fuites de mémoire possibles et définir des valeurs une telle variable:

  • pM.MAX_Requests.
  • demande_terminate_timeout.

pM.MAX_Requests. Il s'agit du nombre maximal de demandes que le processus d'enfant traite avant d'être détruit. La destruction forcée du processus évite la situation dans laquelle la mémoire du processus d'enfant "gonflera" en raison de fuites (car le processus continue de fonctionner après la demande de demande). D'autre part, une valeur trop faible entraînera des redémarrages fréquents, ce qui entraînera des pertes en matière de performance. Il convient de commencer par une valeur de 1000 et de réduire ou d'augmenter encore cette valeur.

demande_terminate_timeout. Définit la durée d'exécution maximale du processus d'enfant avant qu'elle ne soit détruite. Cela vous permet d'éviter de longues demandes, si, pour une raison quelconque, la valeur de max_execution_time a été modifiée dans les paramètres d'interpréteur. La valeur est d'établir en fonction de la logique des applications traitées, par exemple 60s. (1 minute).

Mise en place de Pula dynamique.

Pour l'application Server principale, en raison des avantages explicites, la piscine dynamique choisit souvent. Son travail est décrit par les paramètres suivants:

  • pm.max_children. - Nombre maximum de filiales
  • pM.Start_serververs. - le nombre de processus au début
  • pM.MIN_SPARE_SERVERS - Nombre minimum de processus en attente de connexions (demandes de traitement)
  • pM.MAX_SPARE_SERVERS - Nombre maximum de processus en attente de connexions (demandes de traitement)

Afin d'établir correctement ces valeurs, il est nécessaire d'envisager:

  • combien la moyenne de mémoire consomme un processus enfant
  • volume de RAM accessible

Découvrez la valeur de mémoire moyenne sur un processus PHP-FPM sur une application déjà en cours d'exécution à l'aide du planificateur:

# PS -YLC PHP-FPM --Sort: RSS S UID PID PPID C PRI NI RSS SZ WCHAN TTY TTY TEMPS CMD S 0 1445 1 0 80 0 9552 42588 EP_POL? 00:00:00 PHP5-FPM

Nous avons besoin de la valeur moyenne dans la colonne RSS (la taille de la résidence en kilo-octets). Dans mon cas, il est ~ 20 Mo. S'il n'y a pas de charges sur l'application, vous pouvez utiliser Apache Benchmark pour créer la charge la plus simple sur PHP-FPM.

Le total / accessible / la mémoire requise peut être visualisée en utilisant libérer.:

# Free -M Total Total usagé ... Mémoire: 4096 600 3496

Total Max Processes \u003d (Total RAM - (Mémérateur de tampon RAM +) / (Mémoire par processus PHP) Total RAM: 4 Go de bélier de sécurité: 1000 Mo de tampon de sécurité: 400 Mo de mémoire pour un enfant PHP-FPM Processus (en moyenne): 30 Mo maximum Numéro possible des procédés \u003d (4096 - (1000 + 400)) / 30 \u003d 89 Même Quantité: 89 arrondi à un côté plus petit jusqu'à 80

La valeur des directives restantes peut être définie sur la base de la charge attendue de l'application et de prendre en compte l'autre serveur autre que l'opération PHP-FPM (disent que le SGBD nécessite également des ressources). S'il existe de nombreuses tâches sur le serveur - il est nécessaire de réduire les processus K-in sous forme de processus initiaux / maximum.

Par exemple, nous prenons en compte qu'il y a 2 piscines www1 et www2 (par exemple 2 ressources Web), puis la configuration de chacun d'eux peut ressembler à:

pm.max_children \u003d 40; 80/2 pm.start_servers \u003d 15h.min_spare_servers \u003d 15h.max_spare_servers \u003d 25

Langage de programmation PHP C'était un grand sens de l'outil pour créer des pages personnelles à un usage général. Aujourd'hui, il est installé sur des millions de serveurs du monde entier, est utilisé par des millions de développeurs qui créent beaucoup de projets.

Il est facile d'étudier et extrêmement populaire, en particulier chez les nouveaux arrivants. Par conséquent, après le développement de la langue, le développement puissant de la communauté a suivi. Un grand nombre de scripts, pour toutes les occasions, différentes bibliothèques, cadres. L'absence de normes simples d'enregistrement et de code d'écriture a conduit à l'émergence d'un vaste réservoir de produits d'information construits sur leurs propres principes du développeur de ce produit. C'était particulièrement perceptible lorsque vous travaillez avec divers Cadres PHPLequel depuis longtemps était un écosystème fermé qui n'est pas compatible avec d'autres cadres, malgré le fait que les tâches qui sont souvent résolues par eux sont souvent similaires.

En 2009, les développeurs de plusieurs cadres ont convenu de créer une communauté PHP Framework Interop Group (PHP-FIG)Cela produirait des recommandations pour les développeurs. Il est important de souligner qu'il ne s'agit pas de Normes ISO, plus correctement parler des recommandations. Mais depuis la création PHP-figue Les développeurs communautaires représentent des cadres principaux, leurs recommandations sont de graves poids. Support Normes PSR (Recommandation Standart PHP) Vous permet d'assurer une compatibilité, ce qui facilite et accélère le développement du produit final.

Au total, au moment de cette rédaction, il y a 17 normes et 9 d'entre elles sont approuvées, 8 sont dans la phase du projet, sont activement discutées, 1 standard n'est pas recommandé pour une utilisation.

Maintenant, passons directement à la description de chaque norme. Notez que je ne désassemblerai pas chaque standard en détail ici, c'est plutôt une légère introduction. Également dans l'article seulement ceux qui seront considérés normes PSRqui sont officiellement acceptés, c'est-à-dire sont situés dans le statut d'accepté..

Psr-1. Norme de codage de base

Ce sont les règles les plus générales, telles que, par exemple, l'utilisation tags php., Codage de fichiers, séparant le lieu des annonces de la fonction, de la classe et du lieu d'utilisation, le nom des classes, des méthodes.

PSR-2. Guide de style de code

C'est une continuation de la première norme et régule les problèmes d'utilisation dans le code de l'onglet, les transferts de lignes, la longueur maximale des lignes de code, les règles d'enregistrement des structures de contrôle, etc.

Psr-3. Interface de journalisation.

Cette norme est conçue pour fournir (journalisation) la journalisation dans les applications écrites dans Php..

Psr-4. AutoLoad standard

C'est probablement la norme la plus importante et la plus nécessaire à laquelle un article séparé détaillé soit dédié. Classes qui mettent en œuvre Psr-4.Peut être téléchargé par un seul autochargeur, qui permet à des pièces et des composants d'un cadre ou d'une bibliothèque à utiliser dans d'autres projets.

PSR-6. Interface de mise en cache

La mise en cache est utilisée pour augmenter les performances du système. ET PSR-6. Vous permet de stocker et d'extraire des données du cache à l'aide d'une interface unifiée.

PSR-7. Interface de messagerie HTTP

Quand écrit un peu difficile sites sur PHP., presque toujours à travailler avec Http titres. Sûr, langue php nous fournit des opportunités prêtes avec eux, telles que tableau superglobal $ _ServerLes fonctions entête (), setcookie () Etc. Cependant, leur analyse manuelle est envahie par des erreurs et il n'est pas toujours possible de prendre en compte toutes les nuances de travailler avec eux. Et afin de faciliter le travail du développeur, ainsi que de faire une interface uniforme d'interaction avec Protocole HTTP Cette norme a été adoptée. De plus en détail sur cette norme, je vais raconter dans l'un des articles suivants.

PSR-11. Interface de conteneur

Quand écrire Programmes PHP Vous devez souvent utiliser des composants tiers. Et afin de ne pas se perdre dans cette dépendance dans cette forêt, diverses méthodes de dépendances de code ont été inventées, souvent incompatibles entre elles, qui donnaient des normes et conduit à un dénominateur commun.

PSR-13. Liens hypermédia

Cette interface est conçue pour faciliter le développement et l'utilisation d'interfaces de programmation d'applications ( API.).

PSR-14. Interface de mise en cache simple

Est une continuation et une amélioration de la norme PSR-6.

Ainsi, aujourd'hui, nous avons examiné Normes PSR. Pour les informations actuelles sur l'état des normes, veuillez contacter

PHP peut être entièrement appelé le "langage de programmation Web", il est très difficile de trouver une autre langue de ce type qui pourrait rivaliser avec elle en termes de popularité. J'ai décidé d'apprendre à apprendre des personnes derrière son développement, de répondre aux questions fortes, de discuter des nouveaux nouveaux articles et d'essayer même d'examiner l'avenir d'Internet. Pour cela, nous avons rencontré des participants légendaires Équipe de base PHPqui supervisent directement le développement de cette langue et ont acquis une réputation d'experts mondiaux reconnus dans le domaine des technologies Web.

Donc aujourd'hui les principaux développeurs de Équipe de base PHP - (Andrei Zmievski), (Stas Malyshev), (Ilia Alshanetsky).

Pour commencer, s'il vous plaît, dites-moi un peu de vous - qu'est-ce que tu fais maintenant et où tu travailles. Rappelez-vous l'histoire de la façon dont vous êtes venu dans le monde de la programmation.

CM: Maintenant, je vis aux États-Unis et je travaille dans l'entreprise, je suis engagé dans des infrastructures de ce produit - c'est-à-dire Ces parties du système fournissant une base de données pour une fonctionnalité globale et fournissent une interface pour développer des modules spécifiques.

Si nous parlons de l'histoire de mon arrivée dans la programmation, j'ai commencé à l'école, avec et avec des programmes publiés dans la revue " Technique - Jeunesse" Bien que d'abord, il était impossible d'être appelé programmation - je suis fondamentalement introduit des programmes imprimés dans le journal, dans la mémoire de la voiture et regardé ce qui a été obtenu. Mais ensuite, je me voulais apprendre à forcer cela difficile (à cette époque) la voiture pour faire ce que je veux, et j'ai commencé à comprendre - seul et avec l'aide des aînés - comment tout fonctionne. Il a participé aux cercles, passa l'horloge dans la bibliothèque pour la lecture de magazines étrangers, a écrit les programmes de son plaisir, puis - et pour de l'argent. Il s'est avéré que j'aime forcer les ordinateurs à bénéficier, et à ma grande chance, une telle compétence bénéficie d'une bonne demande aujourd'hui sur le marché du travail.

Énumérez tout ce qui m'a influencé sur ce chemin sera difficile, mais le plus grand effet sur moi, probablement, eu des livres, en particulier des travaux, ("mythique mois mois") et (les détenus exécutent l'asile - en traduction en russe "le hôpital psychiatrique entre les mains des patients ").

AZ: Pendant 5 ans, je vis à San Francisco et croyais que c'est la plus belle ville d'Amérique. Je travaille dans l'entreprise. Bien que ce soit une startup relativement jeune, nous avons environ 110-120 employés. Une variété d'entreprises dans le monde utilise notre produit pour surveiller leurs systèmes d'entreprise et trouver rapidement des problèmes. Nous avons de grands clients, tels que Netflix, Priceline et autres.

À propos de mon roman avec la programmation ... Je pense que cela plutôt que cette profession vous choisit que vous. Je me souviens de quand j'avais 9 ans, j'ai reçu ma première calculatrice programmable, mais auparavant que j'avais des dépôts notables pour les mathématiques, la logique et les choses techniques - autant que je me souvienne, ces capacités étaient initialement.

Comme un exemple brillant de la façon dont tout a commencé, je donnerai une histoire de l'enfance. Ensuite, je, comme la plupart des enfants soviétiques, n'était pas à la maison, je n'étais pas chez moi, alors je suis allé régulièrement dans un centre d'informatique où vous pourriez louer une voiture horaire et travailler sur basique et pascal. Je y suis allé plusieurs fois par semaine, mais je venais une fois du matin très tôt le matin, j'étais tellement intéressé que je suis tombé dans un programme intéressant pour moi, alors que je perdais complètement le sentiment et j'ai oublié qu'il était temps d'y aller domicile.

Je me suis réveillé que lorsque ce centre était déjà fermé, à 22 heures. À ce moment-là, les parents avaient déjà téléphoné à tous mes amis, enseignants, etc. À la recherche de moi, mais heureusement, ils m'ont tombé sur moi revenant du centre. J'ai ensuite eu beaucoup beaucoup, mais en regardant en arrière, je comprends: combien je me souviens de moi-même, j'ai toujours écrit les programmes et vivais dans ce monde virtuel, alors ma profession actuelle n'est donc qu'une continuation d'un voyage fascinant commencé dans l'enfance.

Ia: Je vis et travaille à Toronto, Canada.

Quant à mon arrivée dans la programmation, il est toujours surprenant pour moi. Au tout début de mon chemin, la programmation était plutôt un passe-temps, à l'exception d'un travail aléatoire, obtenu par moi pour l'été et le développement de bas niveau associé sur C. Consciemment dans le plus jeune, je n'ai jamais mis les tâches et envisage de le faire de manière professionnelle. Dans le contexte de la cueillette amateur de leurs programmes sur le SI une fois, j'ai participé à mon premier développement Web personnalisé, qui a été fabriqué dans la langue Perl. De là, il commence mon chemin vers Internet et ma spécialisation dans la programmation Web.

Malheureusement, comme ce projet pousse sur Perl, je n'ai toujours pas aimé l'incohérence de cette langue, et ici "torturé" une société d'hébergement qui m'a servi à l'époque, une fois qu'elle a suggéré d'essayer une nouvelle fois PHP. J'ai immédiatement aimé ce langage, car il était mieux structuré et plus proche de sa syntaxe à mon SI bien-aimé. Excellente documentation en ligne - complété ma transition rapide et finale.


Ilya alshanetsky (ilia alshanetsky)

J'ai commencé à utiliser PHP 3 si activement, qui a progressivement commencé à apparaître leurs propres développements, à élargir ses capacités qui ont commencé à offrir régulièrement à son créateur de Rasmus dans la chaîne IRC. Les correctifs et les corrections de moi étaient tellement qu'il en a été rapidement fatigué et il m'a donné un accès direct CVS au référentiel du projet. Depuis lors, il y a eu beaucoup de choses écrites et faites, j'ai même eu l'occasion d'être un gestionnaire de sortie (Master de publication PHP) pour ses versions populaires de 4.3, 5.1 et 5.2.

Au fait, parallèlement à cette activité, il y avait beaucoup de travaux de consultation pour les clients commerciaux externes, pour qui, en particulier, des problèmes parfois très extraordinaires de productivité, d'évolutivité et de sécurité de leurs propres projets créés sur PHP ont été résolus. Dans l'une de ces consultations, j'étais si profondément plongée dans leur projet, ce qui est finalement devenu partenaire de cette société (Centah Inc.) et a reçu une position de CIO, où je travaille actuellement.

Comment êtes-vous entré dans une équipe de base PHP, de quelle manière est allée à cela?

AZ: Permettez-moi de répondre à votre exemple, mais d'abord un peu d'histoire. J'ai commencé à travailler avec PHP quelque part en 1998, alors c'était PHP 3, l'une des premières versions. Nous avons réécrit un grand projet d'une autre langue en PHP, et je devais trouver un soutien maintenant presque oublié. Je n'ai pas trouvé une telle bibliothèque, mais j'ai vraiment aimé que PHP avait une excellente documentation et API, alors j'ai décidé d'écrire mon expansion. Lorsque j'ai fini, envoyez-le immédiatement à l'envoi PHP. Et ils décidaient de manière inattendue de l'ajouter à la prochaine version de la langue.

Par la suite, on m'a donné accès aux CVS et j'ai commencé à réparer les bugs, à écrire des fonctions plus différentes, etc. À la fin de 1999, j'étais l'un des membres les plus actifs du groupe, puis j'ai suggéré d'organiser le premier congrès des développeurs PHP en Israël pour discuter de l'avenir de la langue et m'a inclus dans ce bulletin. Donc, il n'y avait pas de vote, ça vient d'arriver que je suis immédiatement entré dans Équipe de base PHP.


Rasmus lerdorf (rasmus lerdorf), créateur php

Une telle confiance et cette ouverture m'a motivé à travailler de plus en plus sur le code PHP. Après WDDX, j'ai travaillé sur un module de session, puis écrit un tas de fonctions pour travailler avec des tableaux, puis j'ai décidé que PHP devrait avoir des expressions régulières comme Perl, ainsi créé un module PCRE. À cette époque, PHP 4 sortit depuis longtemps, mais j'ai été très ennuyé par certains problèmes de la manière dont j'ai travaillé (ou que je n'ai pas travaillé) Objets et classes. A cette occasion, j'avais beaucoup de correspondance avec Andi et Zeev, qui a créé, et de cela s'est avéré fondamentalement nouveau soutien. Programmation orientée objet Dans la nouvelle PHP 5.

Après cela, j'ai travaillé principalement sur le code de Zend Moteur lui-même, a également fait un nouveau module de tokenizer. Depuis 2003, avec Rasmus, j'ai lancé un projet pour soutenir Unicode en PHP, mais c'est pour les autres fois ...

Que pensez-vous que c'est dans PHP, qu'est-ce qui l'a rendu si populaire?

AZ: C'est donc arrivé que pour le moment je rédige un projet sur C ++ et Python, je vais donc répondre sur la base de cette expérience comparative, ressemblant à cette "autre clocher".

Pour moi, l'essentiel est que PHP a une API riche et étendue, avec laquelle vous pouvez élargir la langue dans de nombreuses directions, même parfois inattendues. D'autre part, j'entends souvent des gens à quel point il était facile de commencer à utiliser PHP et à la manière dont ils aiment que vous puissiez écrire un site Web ou un programme en quelques heures. Voici l'essence de php: il est à la fois complexe et simple, démodé et moderne, original et empruntant des idées de l'extérieur - il est tout simplement très polyvalent.

Les erreurs liées à la sécurité sont les principaux maux de tête pour les programmeurs Web et de nombreux utilisateurs de leurs produits. En regardant autour de votre expérience riche, quels sont les problèmes les plus importants et les plus typiques de la sécurité de PHP et de ses développeurs que vous pouvez mettre en évidence? Pouvez-vous donner des conseils dans l'édification des jeunes programmes PHP?

CM: L'une des principales leçons, il me semble que la sécurité du code n'est pas la qualité qui peut être instillé vers l'extérieur, quel que soit le reste du code. Prendre soin de la sécurité devrait être la partie quotidienne du travail, à partir de la première minute, à commencer par la conception et à la libération du produit fini. Dans PHP, plusieurs tentatives ont été faites pour ajouter les outils de sécurité "de l'extérieur" - mais l'expérience a montré que ces tentatives, sans vigilance constante par programmeur, sont condamnées à une défaillance. La plate-forme ne peut que l'aider à suivre la sécurité du code, mais ne peut pas garantir cette sécurité sans effort de sa part.

Par conséquent, les conseils principaux seront les suivants - Ne faites jamais confiance aux données externes, ni données, contrôler ce qui est possible. 99% des problèmes de sécurité se produisent car les hypothèses sur les données d'entrée sont incorrectes et lorsque l'attaque se produit par la suite, le code ne se comporte pas comme le développeur lui-même conçu. Par conséquent, développez-vous une habitude de vous demander toujours - «Et si ce paramètre est de changer de manière inattendue? Et si cet argument s'applique pas comme il a été supposé? " Et testez votre code, respectivement.

La prochaine ma recommandation est au lieu de vérifier "Il n'y a pas de problème de quelque chose de non autorisé", convertissant de manière préventive des données afin qu'elles soient garanties au besoin. Il sera donc beaucoup plus facile d'éviter les erreurs. En outre, ne comptez pas que d'autres parties du code s'occuperont de la sécurité - par exemple, si vous créez une demande de base de données dynamique, assurez-vous toujours que les paramètres et la demande sont générés et filtrés de manière à ce que injection SQL Il est impossible - même si vous êtes sûr que les données sont toujours filtrées (par exemple, au niveau du cadre). Ensuite, si le code externe est modifié de manière à ce que les données non filtrées tombent soudainement dans votre procédure, les vulnérabilités ne surviennent de toute façon.

La croissance rapide des applications mobiles est susceptible de continuer, mais beaucoup d'entre elles passeront à HTML5 comme une plate-forme universelle. À cet égard, il sera nécessaire de développer des protocoles de synchronisation de données, ainsi que dans le développement de modèles qui nous permettent de travailler simultanément avec les navigateurs traditionnels et divers clients mobiles qui ont souvent des caractéristiques différentes.

En général, le navigateur deviendra enfin une partie intégrante de l'infrastructure Web et, par conséquent, une partie des responsabilités exécutées par le serveur se retournera maintenant sur le côté du client. Par conséquent, je conseillerais aux personnes qui travaillent maintenant avec PHP, en même temps, suivez les dernières réalisations du JavaScript, HTML5, CSS3, etc.

Je remercie les membres Équipe de base PHPQui, malgré le grand emploi, j'ai gentiment trouvé le temps de répondre aux questions de nos lecteurs.

Personnages:


Andrei Zmeievsky, l'un des conservateurs Projet PHP., Développeur Zend Engine, Créateur de projets et co-auteur du manuel populaire, auteur des implémentations d'Unicode et OOP en PHP. Dans son temps libre, il fonde des sports, se prépare à la maison, la cuisine. Aime beaucoup à lire et à voyager.

Stas Malyshev, participant Projet PHP. Depuis 2000, le gestionnaire de sortie de PHP 5.4, membre de nombreux projets OpenSource. Dans son temps libre, des jeux intellectuels (version sportive "? Où? Quand?", "Brain anneau") et Aikido.

Ilya alschenetsky, Expert en sécurité et l'un des plus anciens développeurs PHP, chapitre, directeur de la publication des versions PHP 4.3, 5.1, 5.2, le créateur du moteur du forum, un membre actif des projets Set OpenSource. Et sur la sécurité de la programmation Web.

p.S.: Je promets que dans le nouveau 2013, je posterai plus de nombreux entretiens VIP avec les principaux développeurs mondiaux, que certains spécifie soient un secret.

1. Groupe par une clé

Cette fonction fonctionne en groupe par groupe, mais une limitation importante: un seul groupe "colonne" ($ identifiant) est possible.

Fonction ArrayuniqueByIdentifier (Array $ Array, String $ Identificateur) ($ IDS \u003d Array_Column ($ Array, $ Identifiant); $ IDS \u003d Array_unique ($ IDS); $ Array \u003d array_filter ($ clé, $ ) Utilisez ($ IDS) (retour In_array (Valeur $, Array_Keys ($ IDS));), array_filter_use_both); retournez $ TRAY;)

2. Détection des lignes uniques pour une table (tableau juncensionnel)

Cette fonction est pour filtrer les "lignes". Si nous disons, un tableau juvénal est une table, puis son élément est une rangée. Nous pouvons donc supprimer les lignes dupliquées avec cette fonction. Deux rangées (éléments de la première dimension) sont égales, si toutes leurs colonnes (éléments de la deuxième dimension) sont égales. À la compassion des valeurs "colonne" s'applique: Si une valeur est d'un type simple, la valeur elle-même sera utilisée sur la comparaison;: si une valeur elle-même sera utilisée sur la comparaison; Sinon, son type (tableau, objet, ressource, type inconnu) sera utilisé.

La stratégie est simple: faites à partir du tableau d'origine un tableau autrefois, où les éléments sont implorés de "colonnes" de la matrice d'origine; Puis appliquer array_unique (...) dessus; Et comme étant la dernière utilisation des identifiants détectés pour le filtrage de la matrice d'origine.

Fonction ArrayuniqueByRow (Array $ Table \u003d, String $ ImploDeseparator) ($ Éléments) ($ d'éléments \u003d; foreach ($ table en tant que $ rangée) (// Pour éviter les avis comme «Tableau à la conversion de chaîne». $ TRAMPAREDFORIMPLED \u003d Array_map (Fonction ($ champ ($) ( $ Valeurype \u003d gettype ($ champ); $ SimpleTypes \u003d ["" Boolean "," Integer "," Double "," Flott "," String "," NULL "]; $ champ \u003d in_array ($ valeurype, $ SimpleTypes)? $ champ: $ valeur de type; retour $ de champ;), $ ligne); $ élémentstrings \u003d implorez ($ implorant Implodeeseparator, $ elementpreparedforimplode); $ TABLEDY \u003d Table \u003d Array_InterSect_Key ($ Table d'éléments); Retour $ Table;)

Il est également possible d'améliorer la comparaison de la classe "de la valeur" de la colonne ", si son type est objet.

Le $ implicesparator doit être plus ou moins complexe, Z.B. Spl_object_hash ($ ceci).

3. Détection des lignes avec des colonnes d'identifiant uniques pour une table (tableau jind-dimensionnelle)

Cette solution repose sur le 2e. Maintenant la "ligne" ne doit pas être unique. Deux "rangées" (éléments de la première dimension) sont égaux maintenant, si tout pERTINENT. "Les champs de la seule" ligne "sont égaux aux" champs "(éléments de la même clé).

Les «champs« pertinents »sont la deuxième dimension» (éléments de la deuxième dimension), qui ont une clé, qui est égale à l'un des éléments des "identifiants" transmis.

Fonction ArrayuniqueBymultipleursInditifs (Array $ Tableau, Array $ Identificateurs, String $ ImploDeseparator \u003d null) ($ ArrayformakakeColumns ($ Tableau, € Arrayuniquebyrow); $ Arrayuniquebymultiplété ($ table, $ arrayuniquebybyrow); retournez $ ArrayuniqueBymultipleursInditifs;) Fonction RemoVearrayColumns (Array $ Tableau, Array Noms de colonnes, BOOL $ ISWHITELIST \u003d FAUX) ($ TABLED AS $ ROWRY ($) )) (Foreach ($ rangée comme $ nom de terrain \u003d\u003e $ campagnard) (if (! In_array ($ nom de champ, $ Columnames)) ($ Tableau de champ]);));));)););););););););););););););));));); $ ligne en tant que $ nom de terrain \u003d\u003e $ FieldValue) (si (in_array (in_array (Nom de terrain $, Noms de colonnes $)) (Déséquitation ($ Tableau [$ nom]);));));)););)

Étant donné que le développement des technologies a conduit au fait que chaque programmeur a maintenant son propre ordinateur, comme effet secondaire, nous avons des milliers de bibliothèques, de cadres, de services, d'API, etc. pour toutes les occasions. Mais quand ce cas de vie vient, le problème se pose - que pour les utiliser et quoi faire s'il n'est pas tout à fait approprié - de réécrire, d'écrire à partir de zéro ou de fixer plusieurs solutions pour différentes options d'utilisation.

Je pense que beaucoup ont remarqué qu'il était souvent nécessaire de créer un projet pas tellement à la programmation de la quantité à écrire du code pour l'intégration de plusieurs solutions prêtes à l'emploi. Parfois, de telles combinaisons se transforment en de nouvelles solutions pouvant être utilisées à plusieurs reprises dans des tâches ultérieures.

Nous nous tournons vers une tâche «exécutée» spécifique - couche d'objet pour travailler avec des bases de données dans PHP. Les solutions sont un excellent ensemble, allant de PDO et se terminant par plusieurs niveaux (et, à mon avis, pas tout à fait pertinents dans les moteurs PHP) Orm.

La plupart de ces solutions sont déplacées à PHP d'autres plates-formes. Mais souvent, les auteurs ne tiennent pas compte des caractéristiques de PHP, ce qui permettrait de simplifier fortement l'orthographe et l'utilisation de structures portables.
L'une des architectures communes de cette classe de tâches est le modèle d'enregistrement actif. En particulier, la soi-disant entité (entité) est construite sur ce modèle, sous une forme ou une autre utilisée dans un certain nombre de plates-formes, allant des bacs persistants dans l'EJB3 se terminant par EF VET.

Nous construisons donc un design similaire pour PHP. Connectez les deux morceaux cools les uns aux autres - la bibliothèque Adodb prêt à l'emploi et la briquet et les propriétés dynamiques des objets PHP.
L'une des nombreuses fonctionnalités Adodb est la soi-disant demande de génération automatique SQL pour les enregistrements d'insertion (insertion) et de mise à jour (mise à jour) basés sur des tableaux associatifs avec des données.
En fait, il n'ya rien d'armée pour prendre un tableau où les clés sont les noms des champs et les valeurs - respectivement, les données et génèrent la chaîne SQL PRESTENE. Mais Adodb le fait plus intellectuellement. La demande est basée sur une structure de table, qui est auparavant lu dans le schéma de base de données. En conséquence, tout d'abord, seuls les champs existants sont en train de tomber dans SQL, et non de tout, deuxièmement, le type de champ est pris en compte - des citations sont ajoutées pour les chaînes, les dates peuvent être formées sur la base de l'horodatage si Adodb le voit au lieu d'un chaîne dans la valeur transmise, etc..

Maintenant aller de php.
Imaginez une telle classe (simplifiée).

Entité de la classe (protégée $ champs \u003d tableau (); Fonction finale publique __Se __set (NAOM $, VALEUR $) ($ ceci-\u003e champs [$ nom] \u003d $ valeur;) Fonction finale ($ Nom) (Retour $ ceci- \u003e Champs [$ nom];))

En passant une matrice interne de la bibliothèque ADODB, nous pouvons générer automatiquement des requêtes SQL pour mettre à jour l'entrée de la base de données avec cet objet, sans avoir besoin de conceptions volumineuses des champs de mappage des tables de base de données sur le champ d'objet d'entrée sur XML et le aimer. Il est seulement nécessaire que le nom de champ coïncide avec la propriété objet. Étant donné que les champs sont mentionnés dans la base de données et des champs d'objet, la valeur n'a pas de valeur pour l'ordinateur, il n'y a aucune raison pour ne pas coïncider.

Montrez comment cela fonctionne dans la version finale.
Le code de la classe terminée est situé sur GIST. Il s'agit d'une classe abstraite contenant le minimum nécessaire pour travailler avec la base de données. Je note que cette classe est une version simplifiée de la solution consacrée à plusieurs dizaines de projets.

Imaginez que nous avons un tel signe:

Créer une table `Utilisateurs` (` Nom d'utilisateur` Varcharchar (255), `Created` Date,` user_id` int (11) Not Auto_incrènement, clé primaire (`user_id`))
Le type de base de données n'a pas d'importance - Adodb fournit une portabilité pour tous les serveurs de base de données communs.

Créez une classe d'entité utilisateur, basé sur la classe d'entité

/ ** * @ table \u003d utilisateurs * @ Keyfield \u003d user_id * / Class Utilisateur étend une entité ()

En fait, tous.
Utilisé simplement:

$ Utilisateur \u003d nouvel utilisateur (); $ Utilisateur-\u003e nom d'utilisateur \u003d "PUMPKIN VASYA"; $ Utilisateur-\u003e créé \u003d heure (); $ Utilisateur-\u003e sauvegarder (); // enregistrer dans le référentiel // télécharger à nouveau $ Thesameuser \u003d utilisateur :: chargement ($ utilisateur-\u003e user_id); Echo $ thésameigner -\u003e nom d'utilisateur;

Le champ de table et de clé indiquent la pseudonotation.
Nous pouvons également spécifier la présentation (par exemple, View \u003d userview) Si, comme cela se produit souvent, l'entité est sélectionnée sur la base de sa table avec Southerners ou des champs calculés. Dans ce cas, les données seront sélectionnées à partir de la vue et la table sera mise à jour. Qui n'aiment pas que de telles annotations puissent remplacer la méthode getmettadia () et spécifier les paramètres de table dans le tableau renvoyé.

Quoi d'autre utilise la classe d'entité dans cette implémentation?

Par exemple, nous pouvons remplacer la méthode init (), appelée après la création d'une instance d'entité pour initialiser la date de création par défaut.
Ou surcharger la méthode Afterload (), qui est automatiquement appelée après chargement de l'entité de la base de données pour convertir la date à l'horodatage pour une utilisation plus approfondie.
En conséquence, nous obtenons une conception beaucoup plus complexe.

/ ** * @ Table \u003d utilisateurs * @ View \u003d userView * @ Keyfield \u003d user_id * / Class Utilisateur étend une entité (fonction protégée init () ($ ceci-\u003e créé \u003d heure ();) ($ ceci -\u003e créé \u003d strtotime ($ this-\u003e créé);))

Vous pouvez également surcharger des méthodes avant et d'avant et d'autres événements de cycle de vie où vous pouvez, par exemple, effectuer une validation avant d'enregistrer ou d'autres actions - par exemple, supprimez les images d'une application à la suppression d'un utilisateur.

Nous téléchargeons la liste des entités par le critère (essentiellement la condition de l'endroit où).
$ Users \u003d utilisateur :: charge ("nom d'utilisateur comme" puppin ");
En outre, la classe d'entité vous permet d'effectuer des questions arbitraires, «natives» afin de parler de la requête SQL. Par exemple, nous souhaitons retourner une liste d'utilisateurs avec des groupes statiques. Quels sont les champs spécifiquement, cela ne reviendra pas d'importance (l'essentiel est d'être user_id, s'il ya un besoin de manipulation supplémentaire de l'entité), il vous suffit de connaître leurs noms à se tourner vers les champs sélectionnés. Lorsque l'entité est maintenue, comme apparemment de ce qui précède, il n'est également pas nécessaire de remplir tous les champs qui seront présents dans l'objet de l'entité, ceux-ci iront à la base de données. C'est-à-dire que nous n'avons pas besoin de créer des classes supplémentaires pour des échantillons arbitraires. Environ comme des structures anonymes lors de l'échantillonnage dans EF, seule voici la même classe d'entité avec toutes les méthodes logiques d'entreprise.

Strictement parlant, les méthodes ci-dessus d'obtention des listes vont au-delà des limites du modèle Ar. En substance, ce sont des méthodes d'usine. Mais comment le vieil homme d'Okkam légué, nous ne produirons pas les essences dans l'excédent de la nécessité et de brûler un gestionnaire d'entité distinct ou un type d'un.

Notez que ce qui précède est simplement les classes PHP et peuvent être consultées et modifiées, en matière d'addition d'essences (ou de la classe d'entité de base) et des méthodes de logique commerciale. C'est-à-dire que nous ne recevons pas simplement une copie des lignes de la table de base de données, à savoir une entité commerciale dans le cadre de l'architecture d'objet.

Qui peut-il être utile? Bien sûr, non pas pompé d'irrégularités, qui croient que l'utilisation de quelque chose est plus facile la doctrine n'est pas solide et non perfectionnistes, convaincus que si la décision ne tire pas un milliard d'appels à la base de données en une seconde, ce n'est pas une solution. À en juger par les forums, devant de nombreux développeurs conventionnels travaillant sur des projets ordinaires (KOI 99,9%) tôt ou tard, il existe un problème pour trouver une méthode d'objet simple et pratique pour accéder à la base de données. Mais face au fait que la plupart des solutions sont injustifiées ou font partie de tout cadre.

P.s. Exclu du cadre un projet distinct

Avez-vous aimé l'article? Partager avec des amis: