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

Langage PHP Discussion :

Extension PHP instable


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 9
    Par défaut Extension PHP instable
    Bonjour à tous,
    je suis en train de créer une application qui doit s'insérer en tant qu'extension pour PHP.
    L'application, elle, est en Haskell.
    Quand je génère un .so et que je l'importe en C, le programme fonctionne bien.
    Quand je génère une extension PHP à partir d'un code C contenant l'application, mon site devient instable.
    En effet, PHP semble planter de façon totalement aléatoire (je suppose une seg fault) et à l'affichage j'ai une page blanche.
    Pour exemple, voici le fichier qui s'occupe de convertir l'application en extension 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
    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
     
    #include "parser.h"
    #include <stdio.h>
    #include <dlfcn.h>
     
    void * handle;
     
    PHP_FUNCTION(parserInit) {
        handle = dlopen ("./libparser.so", RTLD_LAZY);
    }
     
    PHP_FUNCTION(parserKill) {
        dlclose (handle);
    }
     
    PHP_FUNCTION(Parse) {
        char *str = NULL;
        char *result;
        int str_len;
     
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
            return;
        }
        char * (* parse) (char *) = dlsym (handle, "parse");
        result = (* parse)(str);
        RETURN_STRING(result,1);
    } 
     
     
    static function_entry php_sample_functions[] = {  
         PHP_FE(Parse,NULL)  
         PHP_FE(parserInit,NULL)  
         PHP_FE(parserKill,NULL)  
         {NULL,NULL,NULL}  
    };   
     
    zend_module_entry parser_module_entry = {  
       #if ZEND_MODULE_API_NO >= 20010901  
         STANDARD_MODULE_HEADER,        // Roughly means if PHP Version > 4.2.0  
       #endif  
         PHP_PARSER_EXTNAME,        // Define PHP extension name  
         php_sample_functions,        /* Functions */  
         NULL,        /* MINIT */  
         NULL,        /* MSHUTDOWN */  
         NULL,        /* RINIT */  
         NULL,        /* RSHUTDOWN */  
         NULL,        /* MINFO */  
       #if ZEND_MODULE_API_NO >= 20010901  
         PHP_PARSER_EXTVER,        // Roughly means if PHP Version > 4.2.0  
       #endif  
         STANDARD_MODULE_PROPERTIES  
     };  
     #ifdef COMPILE_DL_PARSER
       ZEND_GET_MODULE(parser)      // Common for all PHP extensions which are build as shared modules  
     #endif
    En l'occurence, c'est la fonction Parse qui, une fois dans PHP, plante sans raison apparente.
    Je ne sais pas trop comment faire, vu que je ne trouve aucun log tenant compte de ces événements...

  2. #2
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Comment est compilé php : thread safe ?

    Tu ne peux pas avoir de variables globales comme tu l'as fait. Il faut prendre des précautions. A ajouter:
    Dans le .h :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ZEND_BEGIN_MODULE_GLOBALS(parser)
    void* handle;
    ZEND_END_MODULE_GLOBALS(parser)
     
    #ifdef ZTS
    #define PARSER_G(v) TSRMG(parser_globals_id, zend_parser_globals*, v)
    #else
    #define PARSER_G(v) (parser_globals.v)
    #endif

    Dans le .c :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ZEND_DECLARE_MODULE_GLOBALS(parser);
     
    /* module init : a déclarer aussi dans ton parser_module_entry */
    PHP_MINIT_FUNCTION(parser) {
    #ifdef ZTS
      ZEND_INIT_MODULE_GLOBALS(parser, NULL, NULL);
    #endif
    }

    Ensuite, chaque appel à handle doit être fait au travers de PARSER_G(handle)
    Ex:

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    PARSER_G(handle) = dlopen ("./libparser.so", RTLD_LAZY);

    Alors sinon, je n'ai pas trop regardé le reste, je ne dis pas que ça va résoudre tous tes problèmes. Toujours est-il qu'il faut tenir compte que php est potentiellement compilé en thread-safe et que tout code doit faire avec (donc bien penser aussi aux TSRMLS_DC etc qui vont bien)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 9
    Par défaut
    Merci, je vais essayer tout ça et je repasse dans le coin.
    Normalement, il n'y a pas d'erreurs connus avec la partie Haskell, vu que toute erreur dans le parsage renvoie un message valide.
    Donc effectivement ça doit venir de ce fichier

Discussions similaires

  1. [phpMyAdmin] Extension PHP mbstring
    Par Doberman dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 07/12/2007, 08h46
  2. Réponses: 14
    Dernier message: 24/08/2006, 18h12
  3. Réponses: 4
    Dernier message: 23/01/2006, 18h26
  4. [EasyPHP] installation extensions php 5
    Par forward11 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 23/01/2006, 15h30
  5. Réponses: 9
    Dernier message: 29/10/2005, 20h11

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