IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres éditeurs Discussion :

Interface C / PHP


Sujet :

Autres éditeurs

  1. #1
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut Interface C / PHP
    Bonjour,

    Je souhaite utiliser un programme écrit en C dans un script PHP.
    Je sais que je peux compiler le programme C en un exécutable et appeler cet exécutable directement dans le script php.
    Mais ce n'est pas très sécurisé et pour passer et récupérer des var, array et autres objets, ce n'est pas très facile.
    Je pourrais aussi réécrire le code C en une extension PHP, mais c'est assez complexe.

    L'autre option que j'ai trouvée, c'est d'utiliser Swig.
    Ca permet d'écrire une interface entre le langage C et d'autres langages, dont le Php, sans (presque) avoir à toucher au code C.
    J'ai fait pas mal de recherches, lu la doc Swig et fait des essais, mais n'étant pas un spécialiste du C, je coince.

    Je dois envoyer des données au programme C, qui me retourne d'autres données.
    Ca donne donc :
    PHP ==> C
    le code C attend des données sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    int,
    array[
         int,
         int,
         int,
         int
    ],
    int,
    array[
         int,
         int,
         int
    ],
    int,
    array[
         int,
         array[
              int,
              int,
              int,
              int],
         int,
         array[
              int,
              int,
              int,
              int]
    ]
    C ==> PHP
    Le code C renvoie une structure contenant un string, un entier et un tableau d'entiers.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {
    "toto";
    2;
    [50,4,100,8];
    }
    De quoi doit être constituée l'interface Swig pour passer et récupérer les données ?

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu veux utiliser un programme ou une bibliothèque?

    Un programme est maître de son exécution, et surtout autonome.
    Deux programmes ne peuvent pas communiquer ensemble s'ils ne font pas d'effort spécifique en ce sens. (à moins de passer par un système de donnée passif, comme un fichier ou une base de donnée)

    En l'occurence, php est un programme qui interprête les scripts qu'on lui donne.

    Quel besoin de passer par un programme (en C ou non, d'ailleurs)?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par ternel Voir le message
    Tu veux utiliser un programme ou une bibliothèque?
    J'ai le code source du programme C.
    Je dois écrire l'interface C / PHP avec SWIG.
    Je compile pour créer une bibliothèque.
    J'utilise la bibliothèque dans mon script php.

    Citation Envoyé par ternel Voir le message
    Quel besoin de passer par un programme (en C ou non, d'ailleurs)?
    Le PHP pour la partie présentation, le C pour la partie calculs.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Donc, ton premier besoin, c'est de faire une bibliothèque extérieure au programme, que le programme utilisera.
    Partant de là, il sera plus simple de créer une couche SWIG autour de ta bibliothèque, puisque tu auras déjà réfléchi à son interface.

    Et de là, ton script PHP utilisera la bibliothèque via SWIG.

    C'est assez différent d'utiliser le programme lui-même.

    Si tu veux une aide plus concrète, il faudrait que tu nous donnes surtout le code C des structures à manipuler (les différents typedef et struct)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par ternel Voir le message
    Donc, ton premier besoin, c'est de faire une bibliothèque extérieure au programme, que le programme utilisera.
    Partant de là, il sera plus simple de créer une couche SWIG autour de ta bibliothèque, puisque tu auras déjà réfléchi à son interface.

    Et de là, ton script PHP utilisera la bibliothèque via SWIG.

    C'est assez différent d'utiliser le programme lui-même.

    Si tu veux une aide plus concrète, il faudrait que tu nous donnes surtout le code C des structures à manipuler (les différents typedef et struct)

    Je vais essayer d'être plus précis.
    L'interface SWIG et le programme C sont compilés ensemble pour créer une bibliothèque.
    Les fonctions, constantes, etc. de cette bibliothèque peuvent ensuite être utilisées directement dans le script PHP.

    Mais avant de procéder à cette compilation, il faut que je traduises, par l'intermédiaire de SWIG justement, le format des données entre PHP et C :
    1. PHP récupère des données d'un formulaire Web
    2. données à mettre en forme sous forme d'une structure <== à déclarer dans l'interface SWIG
    3. le code C (qui est désormais dans la bibliothèque) calcule
    4. le code C renvoie le résultat sous forme d'une structure
    5. ce résultat doit être mis en forme pour PHP <== à déclarer dans l'interface SWIG
    6. PHP affiche le résultat


    Pour le point 3, c'est complexe je pense, car on a des tableaux de tableaux.
    Je ne sais pas comment déclarer la structure.
    Je donne un exemple de ce que ça peut donner côté PHP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    array[
         4,
         array[
              10,
              1,
              123,
              75
         ],
         3,
         array[
              54,
              98,
              12
         ],
         43,
         array[
              4,
              array[
                   47,
                   68,
                   35,
                   87],
              4,
              array[
                   57,
                   17,
                   69,
                   20]
         ]
    ]


    Pour le point 5, la structure serait sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct _mystruct
    {
    	char * name; // une chaîne de caractères
    	int quantity; // un entier
    	int * elements; // un tableau d'entiers
    } mystruct;

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu as des tableaux de tableaux d'entiers.
    Il te faut probablement ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct dyn_array {
        unsigned int size;
        unsigned int *data;
    };
     
    struct dyn_array_array {
        unsigned int size;
        struct dyn_array *data;
    };
    Par contre, pour la conversion en swig, je ne me souviens plus des détails. Retourne voir dans la documentation officielle.

    Cela dit, je déconseille vivement de créer une bibliothèque avec une fonction main. Elle serait inutilisable (ou presque) dans un programme C (ou C++)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par ternel Voir le message
    Tu as des tableaux de tableaux d'entiers.
    Il te faut probablement ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct dyn_array {
        unsigned int size;
        unsigned int *data;
    };
     
    struct dyn_array_array {
        unsigned int size;
        struct dyn_array *data;
    };
    Par contre, pour la conversion en swig, je ne me souviens plus des détails. Retourne voir dans la documentation officielle.
    Je vais faire des essais.

    Citation Envoyé par ternel Voir le message
    Cela dit, je déconseille vivement de créer une bibliothèque avec une fonction main. Elle serait inutilisable (ou presque) dans un programme C (ou C++)
    Effectivement, c'est ce que je prévois : je vais juste déclarer les fonctions, etc... dans le code C, sans le main.

Discussions similaires

  1. [POO] A quoi servent les interfaces en php ?
    Par eilijah dans le forum Langage
    Réponses: 6
    Dernier message: 07/11/2013, 12h16
  2. [POO] Interface en php
    Par lepotier dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2008, 13h25
  3. interface Joomla (php, Mysql) / SQL Server
    Par doeuf dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 03/12/2007, 14h53
  4. [LDAP] Chiffrement mot de passe LDAP pour interface en PHP
    Par sedannais dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 10/08/2007, 16h17
  5. [ODBC] Sécuriser une base de données Access via une interface en PHP
    Par maraly dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 07/08/2007, 08h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo