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

C Discussion :

executer php depuis c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 148
    Par défaut executer php depuis c
    bonjour,

    ca ce fait mais comment ??
    je cherche a exécuter php depuis c et récupérer le résultat dans c.

    j'ai programmé un serveur web en c, et je souhaite maintenant l'articuler avec du php.

    1- quand un client demande un fichier html, en c je retourne le fichier dans le socket client, ca je sais le faire et bien.
    maintenant je souhaite pouvoir exécuter du php.
    le client demande un fichier php -> j'envoie le fichier dans une sorte de socket vers php puis récupérer le résultat depuis php pour écrire le résultat vers le client.

    quelqu'un sait comment ou dans quel direction je dois regarder.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour,

    La bonne manière de faire est de laisser le serveur web appeler lui-même l'interpréteur PHP et répondre à l'utilisateur. C'est à cela que le PHP sert.

    Si toutefois tu veux intercepter le résultat du pré-traitement PHP avant de le renvoyer ou si ton programme C est précisément un serveur web, alors le PHP doit s'invoquer tel que tu le ferais en ligne de commande, c'est-à-dire soit en passant le nom du fichier PHP en argument, soit surtout en envoyant son contenu sur l'entrée standard.

    Pour cela, il faut donc exécuter l'interpréteur PHP en utilisant deux descripteurs de fichiers qui seront associés à l'entrée et la sortie standard du processus. De là, soit tu t'en sors avec un seul descripteur (la sortie du processus) si tu as utilisé l'argument et tu peux passer par popen() pour faire le travail en une fois, soit tu as besoin des deux descripteurs et là, il faudra le faire toi-même de façon académique avec fork(), pipe(), dup(), dup2(), execv(), close(), etc.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 148
    Par défaut
    la derniere fois que j'ai touché au c, ca date de 15 ans pour developper un serveur web qui tourne en production depuis sans probleme.
    c'est un serveur web qui sert des fichiers statiques.

    voici mon main :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    /*-------------------------------------------------------------------------*/
     
    main(int argc, char *argv[]){
     
     
       /* Tranformation en demon et creation d'une session */
       if (fork()!=0){ exit(0); }
       setsid();
       printf("serveur de pid %d lance\n", (int)getpid() );
     
     
       action.sa_handler = finFils;
       sigaction(SIGCHLD, &action, NULL);
     
     
       /* creation et attachement de la socket d'ecoute */
       ecoute=creerSocket(SOCK_STREAM, port, &adr);
       if (ecoute == -1){ fprintf(stderr, "creation de la socket d'ecoute impossible\n"); exit(2); }
     
       /* declaration d'ouverture de service */
       if (listen(ecoute,150) == -1) { perror("listen"); exit(2); }
     
     
     
       while(TRUE) {       //boucle d'attente de connexion
          if (itrt > 1000000000){itrt=0;}
     
          waitpid(-1,NULL,WNOHANG); // recupere un fils zombie
          waitpid(-1,NULL,WNOHANG); // recupere un fils zombie
     
          connexion = accept(ecoute, (struct sockaddr *)&adr, &lg_adr);
     
          if (connexion == -1 && errno == EINTR) {continue;}  //probalement interrompu par SIGCHLD, sinon ...
          if (connexion == -1 && errno != EINTR) {perror("accept"); exit(2);}    
     
          NBREQa++; if (NBREQa > 999999) {NBREQa=0; NBREQb++;}// avant fork
          if (fork() == 0) {  // un processus pour la nouvelle connexion
     
             demmarertimer();
             dup2(connexion, qcon); 
             close(connexion); close(ecoute);
             int lolo=servirconnexion();
             close (qcon);
            exit(2);
     
          }
     
          close(connexion);
          itrt=itrt+1;
       }
     
     
     
    } 
    /*-----------------------------------------------------------------------*/
    actuellement je souhaite servir des pages dynamiques et manipuler des tables ( MySQL).
    donc il me faut trouver le moyen d'executer du php ou perl depuis mon mon programme c

    1- je recupere la requete du client
    2- je verifie l'extension du fichier
    3- si extension = .php
    4- j'envoie le nom du fichier au php pour traiter le fichier puis recuperer le resultat sous forme de string
    5- envoyer le resultat au client
    6- fermer le socket client

    c'est le numero 4 que je dois developper.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour,

    Citation Envoyé par mteirek_m Voir le message
    la derniere fois que j'ai touché au c, ca date de 15 ans pour developper un serveur web qui tourne en production depuis sans probleme.
    c'est un serveur web qui sert des fichiers statiques.
    On ne change pas quelque chose qui marche mais tu serais tout de même bien inspiré d'installer un vrai serveur. Il y a des chances qu'il soit directement packagé pour le système que tu utilises, avec PHP et MySQL directement configurés. Sur la durée, ça te simplifierait largement les choses, mais soit.

    voici mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main(int argc, char *argv[]){
     
     
       /* Tranformation en demon et creation d'une session */
       if (fork()!=0){ exit(0); }
    Cette ligne-là est beaucoup trop expéditive : elle ne fonctionne que parce que le fils nouvellement créé prend la main et a le temps de créer sa session avant que le père ne se termine mais si jamais le scheduler fait passer le père en premier, alors le fils va recevoir un signal et sera forcé de se terminer avant d'avoir eu le temps de s'émanciper. Il en résultera des « plantages » au démarrage, rares et aléatoires. Spécialement sur des machines multi-cœur.

    actuellement je souhaite servir des pages dynamiques et manipuler des tables ( MySQL).
    donc il me faut trouver le moyen d'executer du php ou perl depuis mon mon programme c
    Tu peux aussi appeler le serveur MySQL directement depuis le langage C si tu n'as pas envie de passer par un programme distinct. Il faut faire un peu de gymnastique avec la déclaration des types de données associés mais les requêtes SQL, elles, sont rigoureusement identiques.

    1- je recupere la requete du client
    2- je verifie l'extension du fichier
    3- si extension = .php
    4- j'envoie le nom du fichier au php pour traiter le fichier puis recuperer le resultat sous forme de string
    5- envoyer le resultat au client
    6- fermer le socket client

    c'est le numero 4 que je dois developper.
    C'est ce que je dis au dessus : soit tu utilises f = popen("/usr/bin/php tonprogramme.php","r"); et pclose() à la fin, soit tu fais le même traitement qu'entre tes lignes 30 et 40 si tu as besoin d'exploiter à la fois l'entrée et la sortie standard de ton processus.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 148
    Par défaut
    1- je n'ai pas voulu installer lamp initialement car je n'avais pas le temps necessaire pour le gerer.
    une architecture lamp est hyperconnu , et pour moi il était plus facile de programmer un serveur web que de maintenir une architecture lamp fonctionnelle et secure sur des annees.

    2- avec mon delphi sur en 1 clique :
    je me connecte ssh - sftp, -> upload mon fichier source -> gcc -> ./monprogramme -> close (ssh-sftp). et le tour est joué en < 1minute
    en 15 ans 2 fois mon serveur etait down ( c'était la carte mere qui a laché une fois, et la deuxieme c'était le dd -> ovh s'en est occupé rapidement).

    je n'ai jamais était hacker, c'est normal, mon serveur web est inconnu des hackers.

    3- j'ai un deuxieme daemon qui tourne en tache de fond et qui scrute toute les 2 minutes si mon webserver est bien up, sinon il le redemarre automatiquement



    avec f = popen("/usr/bin/php tonprogramme.php","r"); et pclose(), je peux maintenant rajouter toute la richesse du php ( ou perl qui est déjà pré-installé ).

    merci pour tes conseils.

    encore une question , connais tu bon editeur c (leger) pour faire du remote compiling depuis mon portable Windows 7. (je code dans Windows et je compile sur ma linux).


    edit :
    et comment récupérer les variables get et post dans php ? hmm il faut creuser coté php a suivre

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 148
    Par défaut
    j'ai fait quelques test avec perl-embed, python-embed, c'est un peu compliqué, et ne compile pas du premier coup.
    je regarde du coté lua.
    a suivre

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Citation Envoyé par mteirek_m Voir le message
    et comment récupérer les variables get et post dans php ? hmm il faut creuser coté php a suivre
    J'imagine que PHP doit s'appuyer sur les variables spécifiées par CGI BIN. Il s'agit de variables d'environnement ordinaires mais si c'est toi qui a écrit le serveur, alors il faudra que tu parses la requête client et que tu renseignes manuellement ces variables avant d'appeler PHP. Ensuite, côté programme PHP proprement dit, elles s'exploitent à travers $_GET[] et $_POST[], qui sont des tableaux associatifs.

    C'est d'ailleurs une raison supplémentaire pour envisager de passer à un vrai serveur web : non pas que ce soit infaisable, c'est même très intéressant en soi, mais il va finir par devenir très compliqué de gérer toutes les subtilités du protocole dans ton serveur et, surtout, de prendre correctement en charge toutes les variantes possibles des requêtes qu'un client pourra t'envoyer. Rien que faire un filtre pour gérer les POST en multipart par exemple, c'est beaucoup de travail pour pas grand chose, étant donné que c'est tellement fréquent par ailleurs que tu es pratiquement sûr que les solutions web habituelles les gèrent forcément déjà et ce, sans avoir à installer de package particulier.

    À cela, ajoute le fait qu'installer les packages serveur et PHP (en une seule commande depuis le gestionnaire de package d'une distribution Linux par exemple) fait que tu obtiendras directement une suite pré-configurée qui fonctionnera pratiquement « out of the box », comme on le dit.

    En ce qui concerne le watchdog (le programme chargé de surveiller ton application principale et de la relancer le cas échéant), c'est une préoccupation classique également et en principe, elle est à la charge du système. Soit c'est un « service » Windows et il dispose déjà des mécanismes pour être automatiquement relancé, soit c'est sous Unix et c'est à la charge du système d'init de gérer cela, et là encore soit via des scripts si tu utilises le SysVInit classique, soit avec un paramétrage similaire à Windows si tu es sous SystemD.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Executer gimp depuis un programme en php
    Par m11abc dans le forum Linux
    Réponses: 8
    Dernier message: 24/10/2014, 17h25
  2. Execution script PHP depuis script shell
    Par TangoZoulou dans le forum Langage
    Réponses: 5
    Dernier message: 18/02/2010, 16h32
  3. [PHP-JS] exécuter un script php depuis un autre
    Par walid0577 dans le forum Langage
    Réponses: 1
    Dernier message: 05/06/2007, 21h08
  4. Réponses: 6
    Dernier message: 23/05/2005, 08h33
  5. executer dos depuis requete sql
    Par DaxTaz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/11/2004, 14h15

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