Démon, socket, sandbox, mémoire partagée ... ?

ViPHP
ViPHP | 4674 Messages

31 juil. 2009, 22:56

Hey :-),

Alors voilà, j'ai un gros dilème à résoudre. Accrochez-vous bien, ça risque d'être un peu compliqué mais je vais faire mon maximum ;-).

Le but du jeu est de faire communiquer une application PHP (A) avec une autre application PHP (B). Ce n'est pas seulement un bête Hello World que l'on va devoir envoyer, mais des objets, des ressources etc. Les deux applications sont exécutées en même temps sur la même machine. Pour ça, on a plusieurs solutions.

Mémoire partagée

PHP propose l'extension Shared Memory qui permet de créer des blocs de mémoire partagée. On peut imaginer A écrire dans un bloc et que B le lise.

Avantage : très rapide.

Inconvénient : l'extension existe partout mais n'est pas forcément compilée (même si sous les *AMP habituelles, on l'a, tout comme les compilations par défaut), on peut avoir des gros problèmes de sécurité (seulement entre PHP normalement), pas simple à gérer.

Démon ou socket

Le but est de créer un client et un serveur qui s'écoutent et s'écrivent mutuellement. A peut être le client et B peut contenir le serveur. Autre configuration possible, on a A qui est le client, notre serveur et B un autre client ; dans ce cas, le serveur est une sorte de pivot. Bref, ça ne change pas grand chose.
Dans le cas d'un démon, c'est le même problème. Le fonctionnement reste celui d'un client-serveur.

Inconvénient :
On va devoir sérialiser les données pour les envoyer dans le flux client-serveur. On note que des données comme des objets ou des ressources peuvent mal se sérialiser. On risque donc de perdre des informations, notamment dès qu'une référence (autre qu'un objet) se présente, l'information est perdue. On va essayer de considérer qu'il ne faut pas perdre les références pour l'évolution du projet.

Avantage :
Des protocoles comme UDP ou TCP ne sont assez utiles pour répondre à nos besoins. On peut donc créer notre propre protocole en passant par des fichiers que l'on gère nous même, ou en passant par la mémoire de PHP directement (voir php://memory ou php://temp). On règle tout comme on veut, pas de problème. Mais ça nécessite encore une fois de sérialiser nos données. Et autre cas, si on sérialise une ressource, il y a très peu de chance qu'elle fonctionne encore une fois désérialisée dans un nouvel environnement d'exécution (on pense notamment une connexion vers les bases de données).

Oui mais :
Il faut voir la sérialisation comme un mode lecture-seule dans le pire des cas. Si on considère qu'on ne veut que lire les informations, alors ce n'est pas grave de sérialiser les données et un cilent-serveur fait l'affaire. Mais ce serait contraignant pour ce que je veux faire. Je préfère donc pour l'instant éviter et me rabattre sur cette solution si on ne trouve rien de mieux.

Sandbox

Je n'ai pas trouvé mieux comme moyen de résoudre mon problème : au lieu d'exécuter deux applications et de les faire se causer, on peut les exécuter l'une dans l'autre. L'idée est d'avoir B qui exécute A par exemple. B immite l'environnement d'exécution de A. On fait de la virtualisation en quelque sorte. Comme ça, plus besoin de les faire communiquer, elles partagent la mémoire et on peut retrouver toutes les données sans perdre de l'information.

Avantage :
Supprime tous les problèmes liés à la sérialisation.

Inconvénient :
On doit exécuter notre application depuis une sorte de machine virtuelle. C'est peut-être un brin contraignant pour les développeurs à utiliser, même si ça resterait très simple : une simple ligne de commande dans un terminal.
Toutefois, il existe des risques que certaines actions très particulières ne puissent être réalisées comme il se doit (d'où la difficulté de la virtualisation).



Donc voilà mon dilème. Je vous ai exposé mes quelques idées. Est-ce vous pouvez les commenter ou m'en soumettre de nouvelles ?
Merci :-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

31 juil. 2009, 23:36

gros
CMB
dilème
lème
l'extension existe partout mais n'est pas forcément compilée
S'il n'y a que cela ça se recompile… Il faut savoir quel type de public cela vise.
Démon ou socket
Lourd, très lourd.
Sandbox
C'est en version bêta, l'équipe de développement est inactive depuis 6 mois.

Que ce soit le client ou au serveur, les deux ont les mêmes problèmes de sécurité. Les deux, tu dois protéger l'accès. par exemple à coup de chiffrage RSA ou DSA. Et dans tous les cas, tu ne pourras faire rien de tout cela de base sur un hébergement. Pour les serveurs, je vois mal un hébergeur admettre de laisser la possibilité d'en créer.
Bref, la meilleure solution pour partager des données, c'est ce que l'on utilise depuis moult : des fichiers. Ca peut prendre plusieurs formes : Base de données lourde (MySQL, Orcacle), base de données dans des fichiers locaux (SQLite, BDB), voire même des fichiers gérés par toi. Tu lockes, tu lis, tu délockes. Tu lockes, tu écris, tu délockes. Pas de conflit. Avec un chiffrage derrière, là aussi c'est sécure.
Voilà, pour moi, si tu veux quelquechose de sécure et pas foireux, c'est plus par là qu'il faut aller…

ViPHP
ViPHP | 2287 Messages

31 juil. 2009, 23:59

Sékil++. Pas grand chose à ajouter...

Ah si une chose. Finalement dans tous les cas étudiés, le problème de la sérialisation des données reste entier, il ne faut donc pas que ça te bloque...
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 3300 Messages

01 août 2009, 20:36

webservice et serialize/unserialize mais on en a déja parlé sur irc :)
Fait du php depuis que ca existe ou presque :)

Mammouth du PHP | 991 Messages

02 août 2009, 01:18

Des données transitants par des flux xml ?

(Oui et alors si j'ai envie :))

Bye Hawk
DevOps, Symfony4, Hoa

ViPHP
ViPHP | 3300 Messages

02 août 2009, 03:10

Des données transitants par des flux xml ?

(Oui et alors si j'ai envie :))

Bye Hawk
xml capue

le soucis avec xml c'est que ca occasionne énormément de travail de parsing (bon ça à la limite c'est pas grave ca reste très performant quand meme), ca gonfle les données qui transitent et ca limite donc les quantités de données transmissibles (ca c'est en revanche beaucoup plus génant et m'a pénalisé un bon nombre de fois dans mes diverses expériences profesionelles), l'alternative light du moment c'est json, mais json est très faible quand il s'agit de garantir que les données envoyés après transmission soit structurellement (en terme de typage) identifuqes, les objets se transforment en tableau et inverssement, c'est moche. c'est pour ça que serialize/unserialize qui est un algo redoutablement simple en définitive s'avère etre le meilleur à mon avis, ca garranti les données, c'est portable dans la mesure ou on se casse les dents à coder ce qu'il faut dans un autre langage et c'est petit sur le réseau.
Fait du php depuis que ca existe ou presque :)

ViPHP
ViPHP | 4674 Messages

03 août 2009, 11:38

On ne s'est pas compris.

Ce ne sont pas deux applications sur des serveurs différents : ce sera forcément sur le même serveur avec la stricte même configuration.

L'idée c'est de lancer une appli' (A) qui va écouter ce que fait l'autre (B). Donc A émet des messages dans le vide, et on branche n'importe quelle appli' A, A', A'' etc. pour récupérer les messages.
Dans ces messages, il peut y avoir des données comme des objets etc.

Et quand je parlais de Sandbox Sékil', je ne parlais pas du module runkit mais de créer un bac à sable, soit une machine virtuelle quoi. Un endroit où l'appli' se lance. PHP lance du PHP en gros.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 217 Messages

03 août 2009, 12:46

Bonjour,
personnellement j'opterais pour memCache. De plus cette solution te permettra (le cas échéant) de faire migrer une application sur un autre serveur sans avoir à réécrire grand chose (dans l'absolu une ligne de code :) )

ViPHP
ViPHP | 5924 Messages

03 août 2009, 14:20

On ne s'est pas compris.

Ce ne sont pas deux applications sur des serveurs différents : ce sera forcément sur le même serveur avec la stricte même configuration.

L'idée c'est de lancer une appli' (A) qui va écouter ce que fait l'autre (B). Donc A émet des messages dans le vide, et on branche n'importe quelle appli' A, A', A'' etc. pour récupérer les messages.
Dans ces messages, il peut y avoir des données comme des objets etc.
C'est bien ce que j'avais compris. Je n'en démords pas, c'est lourd… :-/
Et quand je parlais de Sandbox Sékil', je ne parlais pas du module runkit mais de créer un bac à sable, soit une machine virtuelle quoi. Un endroit où l'appli' se lance. PHP lance du PHP en gros.
mmh. J'aimerais bien savoir techniquement comment tu envisages ça.

ViPHP
ViPHP | 4674 Messages

03 août 2009, 14:35

Encore aucune idée. T'en as une toi :-P ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

03 août 2009, 14:42

Ouais :)
Que ce soit le client ou au serveur, les deux ont les mêmes problèmes de sécurité. Les deux, tu dois protéger l'accès. par exemple à coup de chiffrage RSA ou DSA. Et dans tous les cas, tu ne pourras faire rien de tout cela de base sur un hébergement. Pour les serveurs, je vois mal un hébergeur admettre de laisser la possibilité d'en créer.
Bref, la meilleure solution pour partager des données, c'est ce que l'on utilise depuis moult : des fichiers. Ca peut prendre plusieurs formes : Base de données lourde (MySQL, Orcacle), base de données dans des fichiers locaux (SQLite, BDB), voire même des fichiers gérés par toi. Tu lockes, tu lis, tu délockes. Tu lockes, tu écris, tu délockes. Pas de conflit. Avec un chiffrage derrière, là aussi c'est sécure.
Voilà, pour moi, si tu veux quelquechose de sécure et pas foireux, c'est plus par là qu'il faut aller…

ViPHP
ViPHP | 4674 Messages

03 août 2009, 14:59

L'idée, ce serait de d'abord l'utiliser en développement, donc pas de problème avec les hébergeurs. C'est sur notre propre configuration.

En fait, on pourrait résumer le problème à : comment transmettre des ressources et des instances d'objets (avec références et tout le toutime) entre deux exécutions PHP.
L'idée de Memcache n'est pas bête, mais je demande si ça supporte les ressources. Je regarde pour réussir à gêler des objets (blague de geek : j'ai appelé ma classe Hoa_Serialize_Cryonicable :-P). Mais il me faudrait pouvoir faire des implémentations ou héritages dynamiques …
C'est pas super hackable PHP en fait …

Sinon, si je me rabas sur une serialisation toute bête, je tape sur le client/serveur. Et là : base de données ou fichiers (même si au final, tout est fichier … on évite les blagues hein ;-)) ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 1668 Messages

06 août 2009, 15:07

Je vais peut-être dire une bêtise, mais, je m'en suis jamais servit, quel est le soucis avec l'usage des webservice ? De mémoire c'est suffisamment soft pour ce que tu compte faire, je sais que Nagol l'a déjà dit mais ça me parait étrange que ça soit passé sous silence.

Pour ta dernière question, ça va dépendre du nombre de données que tu as, de la complexité des informations à faire passer et des performances que tu exige.
A et B ont-ils des points communs ?
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

ViPHP
ViPHP | 4674 Messages

06 août 2009, 15:30

Un Webservice c'est un client-serveur. Je ne veux pas remonter vers ces couches haut-niveaux, je veux rester au niveau de PHP, rester dans PHP.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

06 août 2009, 18:00

C'est un équivalent de JMS que tu veux en fait ?