Affichage des messages à l'utilisateur dans les applications Web. Bibliothèque PHP pour travailler avec l'API Yandex.Money Mauvais message php

J'ai longtemps voulu essayer quelque chose de nouveau, c'est pourquoi, au travail, on m'a demandé d'écrire des exemples d'utilisation de l'API Yandex.Money. différentes langues, j'ai accepté avec plaisir cette offre de défi. Étant donné que cette fonctionnalité est le plus souvent utilisée dans les applications sur divers sites d'hébergement, la décision ferme a été prise d'essayer d'abord de l'écrire en PHP. De plus, je n’avais jamais vu l’API auparavant ; De plus, je n'avais aucune expérience de travail avec PHP, à l'exception des travaux de laboratoire dans une université. L'affaire s'annonçait intéressante.

Sélection de l'environnement

La première chose que j'ai rencontrée, c'est que développer et déployer immédiatement sur l'hébergement n'est pas très pratique. Et j’ai décidé de télécharger un kit pour gentleman pour un développeur Web. Depuis mes années d'étudiant, le nom de Denwer est resté dans ma mémoire. Je l'ai essayé, mais je l'ai rapidement abandonné. Il vit sa propre vie, et lorsque j'ai essayé de le configurer en réécrivant quelque chose dans le fichier de configuration Apache, il l'a écrasé ou ne l'a pas écrasé à sa propre discrétion, ne me permettant pas de tout configurer manuellement. Autrement dit, il s'est avéré que ce n'était pas moi qui l'avais installé, mais lui qui l'avait installé pour moi. Cela m'a rappelé "si j'avais un cheval, ce serait le numéro...". En fin de compte, bien sûr, je l'ai vaincu, mais en même temps j'ai décidé de trouver un serveur WAMP plus simple. Je voudrais souligner que Denwer est un bon produit et je n’ai rien contre, mais je ne voulais pas lire les faits et les manuels à ce sujet.

J'ai trouvé une page avec une liste de WAMP sur le wiki et j'ai commencé à les trier. Les principaux critères de sélection étaient le support du projet, le fait que la version de build soit plus ou moins à jour et la facilité d'installation/d'exécution. par conséquent, je peux recommander en toute confiance The Uniform Server. Il ne nécessite pas d'installation (il suffit de décompresser l'archive), au démarrage, il se bloque dans la barre d'état et démarre avec un léger clic =).

Authentification OAuth

J'ai lu les instructions, téléchargé la documentation, dégainé mon sabre et me suis lancé dans la bataille. Mais dans la bataille, j'ai été rapidement vaincu par l'authentification OAuth. OAuth est un moyen d'accéder à n'importe quel service/compte utilisateur sans saisir et stocker son identifiant et son mot de passe dans votre application. Cela nous vient du créateur de Twitter et cela ressemble à ceci : nous faisons une demande au service (dans notre cas, à Yandex.Money), l'utilisateur saisit son nom d'utilisateur/mot de passe sur le serveur Yandex.Money et donne notre demander l'autorisation d'utiliser son compte. Après cela, le serveur Yandex.Money redirige vers notre application et nous recevons un code temporaire dont la durée de vie est très courte. Ensuite, via une autre demande à Yandex.Money, nous changeons ce code temporaire en un jeton d'utilisateur permanent et puis pour nous, comme pour la démobilisation, toutes les routes sont ouvertes.

Cependant, alors que je passais par l'authentification OAuth, je suis tombé sur un problème de sécurité. J'ai essayé de contacter le serveur Yandex.Money, mais PHP a commencé à jurer et à dire quelque chose sur les certificats. J'ai parcouru un peu Internet et j'ai réalisé que nous avions besoin de notre application pour vérifier le certificat SSL du serveur. Je voulais faire du bon travail pour garantir la sécurité des utilisateurs, j'ai donc continué mes recherches. Mais il n'existe presque aucun exemple sensé de mise en œuvre de la vérification des certificats de serveur dans RuNet. Je vais vous le dire dans l'ordre.

Tout d'abord, nous devions vérifier les certificats dans le code lors de l'envoi des demandes. Comment puis-je obtenir le cURL que j'utilise pour envoyer des requêtes validées par certificat ? J'ai commencé à chercher et j'ai été étonné que le conseil le plus populaire en cas d'erreur de certificat soit : DÉSACTIVER la vérification. Et ceci est proposé sur un tas de sites et de forums (par exemple). Horrible, en général. Voici le code le plus souvent proposé :

Curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

Souvenez-vous-en, les enfants, et n'écrivez jamais. "Maintenant, mon fils, répétons tous ces gros mots que tu devrais oublier." Dieu merci, tout n'est pas si mal sur Internet anglophone et j'ai trouvé un lien qui explique tout. J'ai fait comme c'était écrit là-bas et tout a fonctionné.

Ensuite, vous deviez enregistrer le certificat public Yandex.Money avec vous-même afin d'avoir quelque chose à comparer lors de l'envoi de demandes. Je n’ai pas l’air complètement attardé, mais néanmoins cela m’a semblé assez difficile. Peut-être que cela vous aidera à l'avenir lorsque vous travaillerez avec SSL. On se rend sur le site souhaité via https, on clique sur les certificats et on exporte. Mais il y en a 3, lequel faut-il ? « Prenez une tarte sur l'étagère ; Il y en a deux, prenez celui du milieu. Il s'avère que vous devez exporter le certificat de l'autorité de certification (racine) et intermédiaire (Yandex). Le certificat final change une fois par an, et si nous l'entrons dans la chaîne et oublions de le changer lorsqu'il tourne mal, alors tout dans notre application se brisera. Par conséquent, nous exportons uniquement les 2 certificats spécifiés et les enregistrons simplement dans un seul. fichier texte(capture d'écran). Dans ma bibliothèque, il apparaît comme ym.crt.

Après cela, les demandes ont commencé à fonctionner pour moi. Hourra! Ce qui s'est passé ensuite était une question de technique. Tout était clair dans la documentation ; en fait, c'est pourquoi je l'ai copié dans la documentation du code. Je ferai également une réserve sur le fait que je l’ai écrit comme objet ; à mon avis, travailler avec des objets est une bonne chose et est pratique.

Cryptage

Il y a également eu quelques difficultés mineures avec le cryptage. Tout d’abord, la sauvegarde/restauration des jetons utilisateur a été implémentée à l’aide de la bibliothèque PHP standard Mcrypt. Mais il s’est avéré que cela pose des problèmes. Par exemple, parmi les exemples pris dans le manuel, une seule fonction obsolète a immédiatement fonctionné. Les fonctions restantes ne se souciaient pas de mon désir de les faire fonctionner et ne parlaient que d'une initialisation infructueuse du module. Nous avons dû le découvrir. Ensuite, il s'est avéré que les hébergeurs n'aiment pas beaucoup cette bibliothèque. J'ai demandé au support de mon hébergeur pourquoi il n'y avait pas de module Mcrypt lors de la création d'un site en PHP 5.3. Ils m'ont répondu (littéralement) : « Il y avait des bugs dans la 5.2 pendant des années - ils ne l'ont pas automatiquement ajouté à la 5.3 en tant que module mémorisé une fois tous les cinq ans, mais il y avait des problèmes avec cela. Autres bibliothèques standards pratiques avec implémentations cryptage symétrique Je ne l'ai pas trouvé en PHP (il existe une librairie OpenSSL, mais ce n'est pas vraiment pour ça). Après cela, j'ai décidé de remplacer la bibliothèque de chiffrement par , qui est ouverte et prend en charge l'algorithme AES populaire. Cela a fonctionné immédiatement et sans problème.

Fonctionnalité et exemples d'utilisation

Aussi, pour la « formation sur les chats », ou plutôt les tests et le débogage, des appels aux fonctions de la bibliothèque ont été écrits, que j'ai ensuite affiné avec une mise en page agréable à l'œil, remplie de commentaires et appelée des exemples d'utilisation de la bibliothèque.

En conséquence, des appels aux fonctions API Yandex.Money suivantes ont été mis en œuvre : informations sur le compte, historique des transactions, informations détaillées sur les transactions, transferts d'argent vers d'autres utilisateurs. Avantages et capacités :

  • Autorisation de l'utilisateur OAuth ;
  • sécurité opérationnelle (la vérification de la chaîne de certificat est prise en charge) ;
  • facilité d'utilisation (les réponses du serveur sont présentées sous forme d'objets) et démarrage rapide ;
  • une solution relativement sécurisée et simple pour stocker les jetons utilisateur en utilisant le cryptage et sans utiliser de base de données. Vous pouvez facilement réécrire la mise en œuvre de cette solution pour vos stockages.
La bibliothèque elle-même est un fichier de chaîne de certificats ym.crt et déposer ym.php qui contient :
  • Interface du logiciel IYandexMoney ;
  • classe principale YandexMoney (implémentation de l'interface) ;
  • classe d'énumération avec droits d'accès (portée) ;
  • classes auxiliaires (objets de réponse pour afficher les résultats des requêtes vers l'API).
Le kit de bibliothèque comprend 2 fichiers qui implémentent le cryptage : Rijndael.php et AES.php. Ces fichiers sont extraits de la bibliothèque. Ils sont nécessaires si vous utilisez des méthodes de sauvegarde et de récupération de jetons.
Attention : utilisations Versions PHP 5, ainsi que la bibliothèque cUrl standard pour les requêtes http.

Pour ceux qui ne veulent pas installer et regarder des exemples détaillés, nous montrerons quelques appels.
Pour effectuer des opérations de compte via l'API, vous devez obtenir l'autorisation de l'utilisateur, c'est-à-dire un jeton. Il peut être obtenu par les appels suivants (par exemple, avec accès pour consulter les informations sur le compte et l'historique des transactions) :

YandexMoney::authorize(Consts::CLIENT_ID, "historique des opérations des informations sur le compte", Consts::REDIRECT_URL); // puis, sur la page de redirection, lance la création d'un objet et reçoit un jeton $ym = new YandexMoney(Consts::CLIENT_ID, Consts::CERTIFICATE_CHAIN_PATH); $token = $ym->receiveOAuthToken($_GET["code"], Consts::REDIRECT_URL);
Lorsque l'objet $ym est créé, l'ID d'application et le chemin absolu sur le serveur vers la chaîne de certificats (le fichier ym.crt) lui sont transmis. Les deux sont généralement écrits en constantes dans certains modules (consts.php dans nos exemples).
Eh bien, nous allons vous montrer comment obtenir des informations sur le compte d’un utilisateur. De la même manière, on crée un objet puis on appelle la méthode en lui passant le token utilisateur :

$ym = nouveau YandexMoney (Consts::CLIENT_ID, Consts::CERTIFICATE_CHAIN_PATH); $accountInfoResponse = $ym->accountInfo($token); echo "Numéro de compte : " . $accountInfoResponse->getAccount() . "\n" ; echo "Solde : " . $accountInfoResponse->getBalance() . "\n" ; echo "Code devise : " . $accountInfoResponse->getCurrency() . "\n" ;
Informations sur le compte reçues.

La situation est sensiblement la même pour d’autres défis.

En conséquence, ils ont décidé d'appeler la bibliothèque le grand nom SDK et de la mettre en ligne.

    Être volontaire, être volontaire, être volontaire, être incompétent. (familier). Agir arbitrairement, se comporter arbitrairement. Dictionnaire explicatif d'Ouchakov. D.N. Ouchakov. 1935 1940... Dictionnaire explicatif d'Ouchakov

    SOYEZ VOLONTÉ, oh, oh ; imparfait (familier). Agir arbitrairement. Dictionnaire explicatif d'Ojegov. SI. Ozhegov, N.Yu. Shvedova. 1949 1992… Dictionnaire explicatif d'Ojegov

    Nessov. nepereh. décomposition Faites ce que vous voulez, selon votre caprice. Dictionnaire explicatif d'Éphraïm. T.F. Efremova. 2000... Dictionnaire explicatif moderne de la langue russe par Efremova

    Volonté, volontaire, volontaire, volontaire, volontaire, volontaire, volontaire, volontaire, volontaire, volontaire, volontaire, volontaire, volontaire, volontaire voulu, volontaire, volontaire, ... ... Formes de mots

    agir sans autorisation- être arrogant, oui, oui... Dictionnaire d'orthographe russe

    agir sans autorisation- (Moi), je paresse, je prends le thé, je prends le thé... Dictionnaire orthographique de la langue russe

    Ayu, oui; nsv. Razg. Agir comme bon vous semble, à votre guise, sans demander la permission à personne. S. en visite. S. au travail. Faites votre propre truc à la maison. ◁ Volonté personnelle, moi ; Épouser Pas de volonté personnelle, s’il vous plaît, sinon je vous vire ! ... Dictionnaire encyclopédique

    agir sans autorisation- oh, oh ; nsv.; décomposition voir aussi volonté personnelle Agir selon son propre désir, selon son propre caprice, sans demander la permission à personne. Samovo / paresse lors d'une fête. Samovo/paresseux au travail. Faites votre propre truc à la maison... Dictionnaire de nombreuses expressions

3,3K

Afficher des messages à l'utilisateur est une action assez courante qu'une application Web doit effectuer. Cela peut se produire lors du traitement des formulaires, il peut s'agir de messages d'erreur, de messages vous invitant à vous inscrire lorsqu'un utilisateur tente d'accéder à une partie restreinte du site, et dans bien d'autres cas.

Très souvent, la création et la sortie des messages sont séparées en différentes requêtes HTTP. En règle générale, il est pratique d'utiliser une redirection après le traitement des formulaires (pour éviter les problèmes avec les boutons Précédent et Actualiser), mais en même temps, le moment naturel pour créer un message est précisément le moment du traitement des formulaires et de l'exécution des actions qui l'accompagnent. il. Pourquoi? Imaginez que le texte du message ressemble à ceci : « Le nombre d'unités commandées pour l'article « Tapis de souris » a été modifié avec succès de 7 à 12. » Après une redirection, peut-être vers une page complètement différente en termes de fonctionnalités, ce sera un casse-tête supplémentaire pour déterminer ce qui a été fait auparavant.

Le plus souvent, des messages sont affichés dans la requête POST qui traite le formulaire - ce n'est pas bon, les inscriptions « cette page est obsolète » gâchent la vie (lorsque l'utilisateur décide d'essayer le bouton Retour).

Quelqu'un utilise une redirection, abandonnant les messages amicaux.

En même temps, il existe un moyen simple et évident d’améliorer la vie. Malgré l'évidence, pour une raison quelconque, je n'ai jamais vu personne l'utiliser - du moins lorsque j'ai regardé les sources d'autres personnes.

Nous avons donc un problème : le message doit « vivre » dans différentes requêtes. Nous avons besoin d'un mécanisme pour transférer le texte du message vers la page qui doit l'afficher. Vous vous souvenez probablement déjà des séances.

Oui, en général, vous avez raison. D'autres méthodes, par exemple via une variable globale, ne permettent pas de sauvegarder les données dans le cas où une redirection est utilisée (note de Maxim Naumenko). De plus, je m'assure généralement que chaque écran de l'application a la capacité, avec d'autres informations, d'afficher les messages générés sur les écrans précédents. Ceci est pratique car il n'est pas nécessaire de préparer des écrans séparés pour l'affichage des messages et l'utilisateur n'a pas besoin de cliquer à nouveau avec la souris. Mais en réalité, le concepteur doit réfléchir ici : mettre en évidence la zone dans laquelle les messages apparaîtront.

L'idée est très simple et peut être mise en œuvre avec quelques cours.

La première chose qui nous vient à l’esprit est de créer une classe Message, qui représenterait en fait un message dans notre diagramme de classes simple. Le message doit pouvoir s'enregistrer dans la session, ainsi que s'afficher à l'écran.

class Message ( /** * Contenu du message. */ var $content; /** * Constructeur pour initialiser le texte du message. * * @param content message content */ function Message($content) ( $this->content = $ content ; ) /** * Écrire un message sur la session. */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Afficher un message sur la page */ function toPage () ( echo. " - " . $this->content .
"; } }

La variable $_SESSION est utilisée pour accéder à la session.

Notez que $_SESSION est un tableau, nous n'utilisons qu'un seul élément de ce tableau avec l'index 'session_message'.

Dans ce cas, nous avons affaire à un « tableau de tableaux » - ce que nous stockons dans l'élément « session_message » est un tableau, c'est la liste des messages transmis (bien sûr, il peut y en avoir plusieurs).

Si vous ne parvenez pas à trouver le fil de discussion, il est temps de revoir les sections du manuel dédiées aux sessions et aux tableaux.

Vous avez peut-être une question. Pourquoi les cours sont-ils nécessaires ici ? Il serait possible de se contenter de deux fonctions. Mais regardons plus loin. Nous devrons peut-être créer des messages avec différents types(info, erreur, avertissement), déterminer les destinataires des messages.

Veuillez noter que dans à l'heure actuelle Ce n'est pas l'objet lui-même qui est placé dans la session, mais uniquement le texte du message. La POO nous permet de modifier ultérieurement le comportement de la méthode send() sans changer le code client qui accède à cette méthode (par exemple, à l'avenir, nous pourrons écrire l'intégralité de l'objet Message dans la session s'il comporte de nombreux champs).

Imaginons que nous ferions cela en utilisant des fonctions. Nous aurions probablement une fonction message_send ($ txt), ainsi qu'une fonction message_to_page ($ txt). Nous devons maintenant ajouter la possibilité de comportements différents pour différents types messages. Les appels de fonction changent : message_send($txt, $kind), message_to_page($txt, $kind). Vous devrez parcourir l'intégralité du code de l'application à la recherche de telles fonctions et apporter des corrections.

Cela peut être évité en anticipant la situation à l'avance en représentant le message sous forme de tableau associatif : $msg['txt'], $msg['kind'], il n'y aura alors qu'un seul paramètre dans les appels de fonction. Pouvez-vous sentir à quel point cela essaie de devenir une classe ?

Ainsi, la POO vous donne la possibilité d’avoir le luxe de ne pas tout réfléchir à l’avance.

La classe suivante – Inbox – est conçue spécialement pour cela.

class Inbox ( /** * Tableau des messages reçus. */ var $messages = array(); /** * Dans le constructeur, nous récupérons tous les messages reçus * et les supprimons de la session. */ function Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); pour ($i = 0; $i< $co; $i++) { $this->messages = nouveau message($messages[$i]);
) ) /* effacer le tableau des messages */ $_SESSION["session_messages"] = array();< $co; $i++) { $this->) /** * Afficher le contenu de la boîte de réception sur la page.

*/ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Message du système :

"; ) pour ($i = 0; $i

messages[$i]->VersPage();

) ) )

Essayons notre système de messagerie.

Créons un exemple très simple qui répondra à la soumission d'un formulaire en indiquant le nombre de secondes dans la minute en cours.

envoyer(); /* rediriger vers vous-même */ header("location:"); ) else ( $inbox = new Inbox(); $inbox->toPage(); ) ?>

Nous avons caché tout le travail avec les tableaux et les sessions dans les classes, et le code final semble simple et beau.
Créez un répertoire sur votre serveur Web, puis créez-y ces trois fichiers et essayez le script. Veuillez noter qu'il n'y a aucun problème avec les boutons Précédent et Actualiser. Imaginez maintenant que vous créez un portail complexe, où, en règle générale, il y a plusieurs blocs sur les pages, et chacun peut contenir une application distincte. Nous rencontrons ici deux difficultés :
* J'aimerais que la liste des messages apparaisse dans une partie spécifique de la page, et vous avez déjà trouvé un bon endroit pour cela. Le problème est que vous devez exécuter la commande $inbox->toPage() exactement au moment qui correspondrait à la position de la liste des messages sur la page. Si nous voulons changer la position de cette liste, nous devrons entrer dans le code, mais il n'est pas bon de changer constamment le cadre du portail pour cela. La meilleure solution
Il serait possible d'émettre des messages sous la forme d'un module séparé, dont on sait seulement qu'il doit être connecté au cadre. Autrement dit, libérez-vous de la séquence stricte de lancement des modules. En effet, puisque le résultat de la sortie Inbox ne dépend pas du fonctionnement du système (sur cette étape

Pour tenter de résoudre le premier problème, vous pouvez créer un tampon qui stocke le résultat de la sortie de la boîte de réception.

Peut-être aurons-nous encore plusieurs éléments similaires (à Inbox) et nous devrons créer un système tampon. Afin de ne pas confondre à qui appartient la sortie, nous en viendrons probablement à nommer les tampons. Nous stockerons quelque part la séquence selon laquelle les tampons doivent être sortis - de préférence dans un fichier externe pour faciliter les modifications.

Cette tentative de solution nous donne déjà l'idée d'utiliser XML comme moyen de stockage de données intermédiaires. Et l'utilisation des styles XSLT aidera à résoudre le deuxième problème.

Je ne m'attarderai pas sur ce qu'est XML et ce qu'est XSLT. Si vous n'êtes pas familier avec ces choses, zvon.org est un bon endroit pour commencer vos recherches.

L'idée est de générer non pas du code HTML, mais une structure XML dans les méthodes toPage(). Le document de page sera créé sous forme de chaîne avec du code XML (il servira de « tampon »), et à la dernière étape du script nous utiliserons une transformation XSL.

Tout d'abord, imaginons quel devrait être le résultat de la partie principale du code.

minute 57 seconde : 45

Ce que c'est est assez facile à deviner : deux messages et un formulaire. Veuillez noter que le script PHP n'a besoin que de préparer une telle chaîne - c'est très simple. De plus, l'ordre des balises principales n'a pas d'importance - Vous pouvez le mettre au début, par exemple, car cela conviendra au programmeur. Comment le mettre en œuvre. Vous pouvez, sans rien changer, utiliser la mise en mémoire tampon de sortie, produire du XML au lieu du code HTML et, à la fin, simplement capturer la sortie dans une chaîne. Mais nous perdrons alors de la flexibilité - par exemple, vous souhaitez parfois afficher les informations de débogage directement sur la page (en utilisant echo). En même temps, Développeurs PHP travaillent sur un module DOM qui offre une manière plus avancée de créer et de transmettre des documents arborescents. Si nous voulons implémenter le DOM, nous devrons repenser l'ensemble de l'application, en modifiant la sortie des chaînes pour créer des éléments DOM. Par conséquent, je préfère stocker la représentation XML des objets dans les objets eux-mêmes, en assemblant séquentiellement un document XML commun. Ce n'est pas si difficile, il faut juste une petite modification. Vous verrez que cette technique n'est pas strictement liée à une manière spécifique de stocker les données XML, ce qui vous permettra de faire la transition vers l'utilisation du DOM avec peu d'effort. Tout d’abord, notez que chacun de nos objets possède une méthode toPage(). Cette similarité devrait nous faire réfléchir à l’introduction d’une nouvelle classe parent commune. Laissez chaque classe capable de créer des morceaux d'un document XML pour une page hériter d'une classe qui s'occupera de la représentation XML de l'objet. Appelons-le Outputable.

class Outputable ( /** * Conteneur XML (chaîne). */ var $output = ""; /** * Donne le contenu du conteneur et efface le conteneur. * * @renvoie une chaîne avec des données XML */ function getOutput () ( $ out = $this->output; $this->output = ""; return $out; ->output .= $string . "n" ) /** * Méthode "Abstraite" */ fonction toPage( ) ( ) )

La méthode toPage() est rendue vide - dans ce cas, elle est nécessaire comme indicateur de la manière dont les classes « matriochka » externes doivent communiquer avec la classe interne. Cependant, nous pourrions proposer ici une implémentation par défaut si nous remarquions que de nombreux objets s'affichent sur la page de la même manière.

Les classes Message et Inbox changeront légèrement - elles devraient désormais toutes deux hériter de Outputable, et les méthodes toPage() changeront également
Message.php

class Message extends Outputable ( /** * Contenu du message. */ var $content; /** * Constructeur pour initialiser le texte du message. * * @param content message content */ function Message($content) ( $this->content = $content; ) /** * Écrire un message à la session */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Afficher un message sur la page ( $. this->appendOutput(" ".$this->contenu.""); } }

class Inbox extends Outputable ( /** * Tableau des messages reçus. */ var $messages = array(); /** * Dans le constructeur, nous recevons tous les messages reçus * et les supprimons de la session. */ function Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); pour ($i = 0; $i< $co; $i++) { $this->messages = nouveau message($messages[$i]); ) ) /* effacer le tableau des messages */ $_SESSION["session_messages"] = array();< $co; $i++) { $this->) /** * Afficher le contenu de la boîte de réception sur la page."); } }

*/ fonction toPage() ( $co = sizeof($this->messages); $this->appendOutput("

"); pour ($i = 0; $i
messages[$i]->toPage();

$this->appendOutput($this->messages[$i]->getOutput()); ) $this->appendOutput("La méthode de sortie a changé - désormais, au lieu de sortir directement sur la page, la représentation externe est pour le moment stockée dans Outputable, qui « se trouve » dans chacun des objets. La méthode appendOutput() remplace la construction echo(). Pour obtenir la sortie d'un objet, la méthode getOutput() est utilisée. Voyons maintenant quelle est la partie client du code, qui résoudra le même problème que précédemment. index.php


envoyer();   /* seconde actuelle */ $msg_sec = new Message("second: " . date("s"));
"; ?>

$msg_sec->envoyer(); /* rediriger vers vous-même */ header("location:"); sortie; ) else ( /* prépare une liste de messages sous forme XML */ $inbox = new Inbox(); $inbox->toPage(); $global_content->appendOutput($inbox->getOutput()); ) $global_content- > appendOutput ("

"); $xml_string = $global_content->getOutput(); $xh = xslt_create(); $xarg = array(); /* en-tête du document XML */ $xarg["xml"] = "

Pour visualiser le résultat, il ne reste plus qu'à préparer le modèle XSL.
style.xsl

Exemple XSLT

message

Qu’avons-nous réalisé ?

Tout d'abord, vous pouvez entreprendre avec plus de confiance des projets complexes - une réelle indépendance des modules est assurée. L'ordre dans lequel les résultats sont placés sur la page est désormais contrôlé à l'aide d'un modèle XSL externe et ne dépend pas de l'ordre dans lequel les modules sont exécutés.

Tout module qui génère des données XML à la suite de son travail peut être utilisé dans un projet. C'est d'ailleurs l'un des avantages par rapport aux moteurs de modèles, dans lesquels la création de données consiste en une séquence de méthodes d'appel (affectation, etc.) d'un moteur spécifique, pour lequel il n'existe pas de norme commune.

Un autre avantage est la facilité de débogage. Si vous exécutez le script, vous remarquerez que chaque page contient une sortie de débogage – un prototype XML qui simplifie grandement les applications de débogage.

Une autre chose à laquelle vous devez penser est la façon de créer des objets de message. Il n'est pas toujours pratique d'utiliser new directement dans le code client. Mais c'est peut-être un sujet pour un article séparé.

Enfin, un galop sur les perspectives :

* fenêtres pop-up pour une liste de messages importants
* "pages d'expéditeur" et "pages de destination" dans les messages
* enregistrer les messages dans la base de données
* bouton "afficher l'historique de mes actions"
* analyse statistique des actions des utilisateurs au sein des sessions
* "assistants intelligents" dans les applications Web

Salut tout le monde!

Dans des numéros précédents, nous avons déjà appris comment traiter correctement ces mêmes signaux reçus. Nous approchons désormais du moment où notre démon doit apprendre à communiquer avec d'autres programmes, ou avec lui-même, mais dans des copies différentes.

Dans le monde Unix, il existe une incroyable variété de façons de transmettre une commande ou un message d'un démon à un script Web et vice versa. Mais maintenant, je veux parler uniquement des files d'attente de messages - « Files d'attente de messages System V IPC ».

En tant qu'enfant, votre mère doit déjà vous avoir dit que les files d'attente peuvent être trouvées à la fois dans l'implémentation System V IPC et dans l'implémentation Posix. Je souhaite aborder uniquement le sujet du Système V, car il me touche personnellement. Et j'essaierai d'éviter le sujet posix si possible.

Alors commençons. Les files d’attente fonctionnent au niveau « normal » système opérateur, sont stockés en mémoire et représentent une structure de données accessible à tous programmes système. Dans les files d'attente, comme dans système de fichiers, il est possible de configurer les droits d'accès et la taille des messages. Habituellement, le message dans la file d'attente est défini sur une petite taille, pas plus de 8 kilo-octets.

Ceci conclut la partie introductive, passons à la pratique.

Envoi de messages

file d'attente-envoyer.php

Nous acceptons les messages

file d'attente-receive.php

Exécutons d'abord les fichiers un par un file d'attente-envoyer.php et puis file d'attente-receive.php.

U% php queue-send.php envoie 4 messages u% php queue-receive.php type : 1 type : 1, msgtype : 1, message : s:15:"message, type 1"; tapez : 1, type de message : 1, message : s:15:"message, tapez 1"; tapez : 2 tapez : 2, msgtype : 2, message : s:15:"message, tapez 2"; tapez : 3 tapez : 3, type de message : 3, message : s:15:"message, tapez 3";

Vous voyez que les messages ont été regroupés, et 2 messages du premier type ont été affichés en premier, puis tous les autres.
Si nous avions spécifié de recevoir des messages de type 0, nous aurions reçu tous les messages quel que soit leur type.

While (msg_receive($queue, $i, $msgtype, 4096, $message, false, MSG_IPC_NOWAIT)) ( // ...

De plus, il convient de noter ici une autre fonctionnalité de la file d'attente : si nous supprimons la constante MSG_IPC_NOWAIT, nous supprimons les éléments inutiles du script et exécutons le fichier dans un terminal. file d'attente-receive.php, et dans l'autre, nous exécuterons périodiquement le fichier file d'attente-envoyer.php, nous verrons ensuite comment le démon peut utiliser efficacement la file d'attente en attendant une tâche de sa part.

file d'attente-recevoir-attendre.php

En fait, je vous ai déjà raconté toutes les choses les plus intéressantes sur les files d'attente. Il existe également des fonctions permettant d'obtenir des statistiques de file d'attente, de supprimer et de vérifier l'existence d'une file d'attente.

Essayons maintenant d'écrire un démon qui écoute une file d'attente :
queue-daemon.php