PHPTour-2011-PHP_Extensions

PHP Internals&extensions | PHPTour Lille 2011   1




Fonctionnement de PHP
           -
Internals et extensions
PHP Internals&extensions | PHPTour Lille 2011   2


             Hello, I'm Julien Pauli :)
@julienpauli
   http://julien-pauli.developpez.com



IRC Freenode, EFNet
   @jpauli

Software architect – PHP Guru
Working at Comuto
   http://www.covoiturage.fr

OSS Contributor
   PHP Contributor – http://doc.php.net/fr
   jpauli@php.net
PHP Internals&extensions | PHPTour Lille 2011   3

          PHP, internals & extensions
PHP vu de l'intérieur
   Les différents organes
   L'architecture interne

Présentation du système d'extensions
   Les types d'extensions
   Le mécanisme de compilation et de chargement

Exemples d'extensions
   pecl
   safe-made

Conclusion
PHP Internals&extensions | PHPTour Lille 2011   4


                    PHP : les organes
820.000 lignes de code C
  Conçues pour représenter des couches qui glissent l'une sur l'autre
PHP Internals&extensions | PHPTour Lille 2011   5


                      PHP : SAPI
Server Application Interface
   Point d'entrée vers le moteur PHP

CLI, CGI, FastCGI, APXS(Apache), Built-in-Server

Buts de la SAPI :
   gérer les en-têtes de la requête d'entrée ;
   gérer les données de la requête d'entrée : POST, COOKIE ;
   écrire sur la sortie, la SAPI est peu liée au système de
   tampon de PHP (ob) : elle écrit dans la couche basse,
   et permet de la vider (flush) ;
   démarrer/Arrêter le ZendEngine et le PHPCore.
PHP Internals&extensions | PHPTour Lille 2011   6


                            sapi_module_struct
struct _sapi_module_struct {
     char *name;
     char *pretty_name;

    int (*startup)(struct _sapi_module_struct *sapi_module); // fonction de démarrage
    int (*shutdown)(struct _sapi_module_struct *sapi_module); // fonction de de fermeture

    int (*activate)(TSRMLS_D); // fonction d'activation (environnement de requête)
    int (*deactivate)(TSRMLS_D); // fonction de désactivation (environnement de requête)

    int (*ub_write)(const char *str, unsigned int str_length TSRMLS_DC);
    void (*flush)(void *server_context);
    struct stat *(*get_stat)(TSRMLS_D);
    char *(*getenv)(char *name, size_t name_len TSRMLS_DC);

    void (*sapi_error)(int type, const char *error_msg, ...);

    int (*header_handler)(sapi_header_struct *sapi_header, sapi_header_op_enum op,
                         sapi_headers_struct *sapi_headers TSRMLS_DC);
    int (*send_headers)(sapi_headers_struct *sapi_headers TSRMLS_DC);
    void (*send_header)(sapi_header_struct *sapi_header, void *server_context TSRMLS_DC);

    int (*read_post)(char *buffer, uint count_bytes TSRMLS_DC);
PHP Internals&extensions | PHPTour Lille 2011   7


                    Exemple de SAPI Apache2
 http://lxr.php.net/xref/PHP_5_4/sapi/apache2handler/sapi_apache2.c

zend_first_try {
         // ...
         zend_file_handle zfd;

        zfd.type = ZEND_HANDLE_FILENAME;
        zfd.filename = (char *) r->filename;
        zfd.free_filename = 0;
        zfd.opened_path = NULL;

        if (!parent_req) {
              php_execute_script(&zfd TSRMLS_CC);
        } else {
              zend_execute_scripts(ZEND_INCLUDE TSRMLS_CC, NULL, 1, &zfd);
        }
        apr_table_set(r->notes, "mod_php_memory_usage",
              apr_psprintf(ctx->r->pool, "%zu", zend_memory_peak_usage(1 TSRMLS_CC)));
     }
} zend_end_try();
PHP Internals&extensions | PHPTour Lille 2011   8


                        PHP Core
Un genre de fourre-tout
   gestion du réseau via une API de flux (streams) ;
   algorithme de tri (MergeSort) ;
   lecture de la ligne de commandes (getopt()) ;
   open_basedir, safe_mode et parsing de chemins (fopen) ;
   buffer de sortie (ob_) ;
   ticks ;
   logos (php et zend) ;
   fonctions de lecture des données de la requête (passées à la
   SAPI comme fonctions par défaut) ;
   variables globales, parsing d'url, outils de traitement des
   chaines, gestion des erreurs ;
   "Tout ce qui n'est pas extension"
PHP Internals&extensions | PHPTour Lille 2011   9


                            PHPCore Globales
         Globales accessibles de                  struct _php_core_globals {
         partout                                     zend_bool magic_quotes_gpc;
                                                     zend_bool magic_quotes_runtime;
               macro PG()                            zend_bool magic_quotes_sybase;
                                                     zend_bool safe_mode;
                                                     zend_bool allow_call_time_pass_reference;
                                                     zend_bool implicit_flush;
                                                     long output_buffering;
if (PG(register_argc_argv)) {                        char *safe_mode_include_dir;
    php_build_argv(SG(request_info).query_string,    zend_bool safe_mode_gid;
      PG(http_globals)[TRACK_VARS_SERVER]);          zend_bool sql_safe_mode;
}                                                    zend_bool enable_dl;
                                                     char *output_handler;
                                                     char *unserialize_callback_func;
                                                     long serialize_precision;
                                                     char *safe_mode_exec_dir;
                                                     long memory_limit;
                                                     long max_input_time;
                                                  … ...
PHP Internals&extensions | PHPTour Lille 2011   10


             Zend Engine
Core
Tools
VirtualMachine
Thread Safety
Memory Manager
PHP Internals&extensions | PHPTour Lille 2011   11


                         Zend Engine
compilateur : analyseurs lexical/syntaxique (re2c/bison), syntaxe PHP
et syntaxe INI
exécuteur : la partie la plus importante, la machine virtuelle de PHP
gestionnaire de mémoire : Zend Memory Manager
définitions des concepts de "classe" et de "fonction" pour PHP
définitions et gestion des variables PHP : zval, références et types PHP
une partie de la gestion de la concurrence des threads (Thread
Safety : TS)
zend_gc : le ramasse-miettes (garbage collector) de PHP
gestion avancée du type flottant de C
moteur de gestion des erreurs et des exceptions
moteur d'extensions
hashtables (array PHP), algorithmes de tri, objets PHP et itérateurs
PHP Internals&extensions | PHPTour Lille 2011   12


Life Cycle
PHP Internals&extensions | PHPTour Lille 2011   13


Extensions
PHP Internals&extensions | PHPTour Lille 2011   14


     Une extension PHP, pourquoi ?
Code C
   Rapide, très rapide
Permet de rajouter à PHP :
   Des fonctions
   Des classes
   Des constantes
   Des paramètres dans php.ini
   Des gestionnaires de flux
   Des variables, globales (burk)
Permet aussi de lier PHP à une lib du système
   ext/simpleXML et ext/dom lient PHP à libxml
   ext/gd lie PHP à libpng et libjpeg
PHP Internals&extensions | PHPTour Lille 2011   15


PHP est lié à l'OS via ses extensions
julien@jpauli:~$ ldd $(which php)
      linux-vdso.so.1 => (0x00007fff5abff000)
      libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f8398338000)
      libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8398120000)
      libexslt.so.0 => /usr/lib/libexslt.so.0 (0x00007f8397f0a000)
      libtidy-0.99.so.0 => /usr/lib/libtidy-0.99.so.0 (0x00007f8397cad000)
      libedit.so.2 => /usr/lib/libedit.so.2 (0x00007f8397a86000)
      libncurses.so.5 => /lib/libncurses.so.5 (0x00007f8397841000)
      librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8397639000)
      libmcrypt.so.4 => /usr/lib/libmcrypt.so.4 (0x00007f8397406000)
      libltdl.so.7 => /usr/lib/libltdl.so.7 (0x00007f83971fb000)
      libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8396ff7000)
      libldap_r-2.4.so.2 => /usr/lib/libldap_r-2.4.so.2 (0x00007f8396dac000)
      liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2 (0x00007f8396b9d000)
      libpng12.so.0 => /usr/lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f8396976000)
      libbz2.so.1.0 => /lib/libbz2.so.1.0 (0x00007f8396766000)
      libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f83964e0000)
      libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f83962c6000)
      libssl.so.0.9.8 => /lib/libssl.so.0.9.8 (0x00007f8396073000)
      libcrypto.so.0.9.8 => /lib/libcrypto.so.0.9.8 (0x00007f8395ce3000)
      libcurl-gnutls.so.4 => /usr/lib/libcurl-gnutls.so.4 (0x00007f8395a8f000)
      libicui18n.so.44 => /usr/lib/libicui18n.so.44 (0x00007f83956d1000)
      libicuuc.so.44 => /usr/lib/libicuuc.so.44 (0x00007f8395388000)
      libicudata.so.44 => /usr/lib/libicudata.so.44 (0x00007f8394348000)
...
PHP Internals&extensions | PHPTour Lille 2011   16


                   Tout est extension
Dans PHP, tout ce qui n'est pas Core et ZendEngine est une
extension.
   Une extension n'est pas forcément un .so (.dll)
   Une extension peut être compilée et liée "statiquement", il n'y a
   donc pas de .so
   Une extension ajoute des fonctionnalités à PHP
Vocabulaire : une extension s'appelle ext/{something}

Le moteur est tellement extensible, que tout est extension :
   strings, array, numbers …
   regexp, dates
   SPL ...
PHP Internals&extensions | PHPTour Lille 2011   17


                      ext/standard




fonctions array_ ; fonctions str_ ; sérialisation PHP
tout ce qui concerne les urls, les caractères dans les chaines... ;
transtypages des variables, bases numériques, locale ;
crypt, base64, md5, assert, crc32, phpinfo... ;
gestion des fichiers et du système de fichiers ;
fonctions relatives au réseau, flux.
PHP Internals&extensions | PHPTour Lille 2011   18


                       ext/core




func_get_args(), gc_enable(), memory_get_usage(), zend_version()
PHP Internals&extensions | PHPTour Lille 2011   19


          Extensions obligatoires
Au minimum, PHP doit disposer de
  core
  date
  ereg
  pcre
  reflection
  SPL
  standard
Tout le reste est optionnel
Un PHP "minimal" consomme très très peu de mémoire
PHP Internals&extensions | PHPTour Lille 2011   20


             2 types d'extensions
Extensions
  Ok, on connait
  extension = myext.so (utilise extension_dir)
Zend Extensions
  Plus puissantes
  Peuvent remplacer des fonctions du ZendEngine
  non compatibles avec dl()
  zend_extension = full/path/to/myext.so

Mais les 2 se compilent de la même manière
  C'est du code C, point...
  Il a simplement des rôles différents
  Et une profondeur d’interaction dans PHP différente
PHP Internals&extensions | PHPTour Lille 2011   21


Structure d'une extension PHP
  struct _zend_module_entry {
       unsigned short size;
       unsigned int zend_api;
       unsigned char zend_debug;
       unsigned char zts;
       const struct _zend_ini_entry *ini_entry;
       const struct _zend_module_dep *deps;
       const char *name;
       const struct _zend_function_entry *functions;
       int (*module_startup_func)(INIT_FUNC_ARGS);
       int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS);
       int (*request_startup_func)(INIT_FUNC_ARGS);
       int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);
       void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS);
       const char *version;
       size_t globals_size;
       void* globals_ptr;
       void (*globals_ctor)(void *global TSRMLS_DC);
       void (*globals_dtor)(void *global TSRMLS_DC);
       int (*post_deactivate_func)(void);
       int module_started;
       unsigned char type;
       void *handle;
       int module_number;
       char *build_id;
  };
PHP Internals&extensions | PHPTour Lille 2011   22


Structure d'une Zend Extension
 struct _zend_extension {
      char *name;
      char *version;
      char *author;
      char *URL;
      char *copyright;
      startup_func_t startup;
      shutdown_func_t shutdown;
      activate_func_t activate;
      deactivate_func_t deactivate;
      message_handler_func_t message_handler;
      op_array_handler_func_t op_array_handler;
      statement_handler_func_t statement_handler;
      fcall_begin_handler_func_t fcall_begin_handler;
      fcall_end_handler_func_t fcall_end_handler;
      op_array_ctor_func_t op_array_ctor;
      op_array_dtor_func_t op_array_dtor;
      int (*api_no_check)(int api_no);
      int (*build_id_check)(const char* build_id);
      void *reserved3;
      void *reserved4;
      void *reserved5;
      void *reserved6;
      void *reserved7;
      void *reserved8;
      DL_HANDLE handle;
      int resource_number;
PHP Internals&extensions | PHPTour Lille 2011   23


         Introspecter une extension
                julien@jpauli:~$ php --re json
php --ri        Extension [ <persistent> extension #19 json version 1.2.1 ] {
php --re
                 - Constants [12] {
                   Constant [ integer JSON_HEX_TAG ] { 1 }
                   Constant [ integer JSON_HEX_AMP ] { 2 }
                   Constant [ integer JSON_HEX_APOS ] { 4 }
php -m            ...
                 }
                 - Functions {
                   Function [ <internal:json> function json_encode ] {
                      - Parameters [2] {
                        Parameter #0 [ <required> $value ]
                        Parameter #1 [ <optional> $options ]
                      }
                   }
                   Function [ <internal:json> function json_decode ] {
                      - Parameters [3] {
                        Parameter #0 [ <required> $json ]
                        Parameter #1 [ <optional> $assoc ]
                        Parameter #2 [ <optional> $depth ]
                      }
                   }
PHP Internals&extensions | PHPTour Lille 2011   24


Introspecter une extension
PHP Internals&extensions | PHPTour Lille 2011   25


               Lier une extension
Statiquement
  L'extension sera liée au binaire PHP
  Pratique lorsqu'on l'utilise souvent
  Alourdit l'empreinte mémoire de PHP en permanence

Dynamiquement
  L'extension sera sortie dans un .so
  Chargé via PHP.ini à chaque démarrage de PHP
  Permet de désactiver l'extension sans recompiler
  Démarrage de PHP plus lent
PHP Internals&extensions | PHPTour Lille 2011   26


                          Compiler une extension
'./configure' 
'--with-apxs2=/usr/local/apache2/bin/apxs' 
'--with-bz2' 
'--with-config-file-scan-dir=/usr/local/etc' 
'--with-curl' 
'--with-gd' 
'--with-gettext' 
'--with-ldap' 
'--with-mcrypt' 
'--with-mysqli=mysqlnd' 
'--with-mysql=mysqlnd' 
'--with-pdo-mysql=mysqlnd' 
'--with-openssl' 
'--with-libedit' 
'--with-tidy=shared' 
'--with-xsl' 
'--enable-bcmath'                                             make && make install
'--enable-gd-native-ttf' 
'--enable-intl' 
'--enable-mbstring' 
'--enable-pcntl' 
'--enable-sockets' 
'--enable-soap' 
'--enable-sqlite-utf8' 
'--enable-zip' 
'--disable-cgi'
PHP Internals&extensions | PHPTour Lille 2011   27


Outils nécessaire pour compiler une ext
 Outils de compilation (GCC)
    Paquet "build-essentials" sous Debian
 autoconf: 2.13 (2.59+ for PHP 5.4+)
 automake: 1.4+
 libtool: 1.4.x+ (except 1.4.2)


 PHP compilé en --debug
 Binaire "phpize"
 Script "php-config"
 script "ext_skel.sh"
    http://svn.php.net/viewvc/php/php-src/trunk/ext/skeleton/
PHP Internals&extensions | PHPTour Lille 2011   28


       Processus de développement
Outils utiles :
   Un éditeur de code
   gdb
   valgrind



     $ cd myext
     $ edit README, CREDITS, RELEASE-0.1.0
     $ edit config.m4 and config.w32
     $ phpize
     $ ./configure
     $ make
     $ php -n -dextension_dir=`pwd`/modules -dextension=myext.so myext.php
     $ edit myext.c to correct errors
     $ make
PHP Internals&extensions | PHPTour Lille 2011   29


                     Tout est dans le config.m4
         Fichier utilisé par autoconf
              Déclare les dépendances
              Déclare les switch
              Déclare les fichiers à compiler
dnl
dnl $Id: config.m4 282645 2009-06-23 13:09:34Z johannes $
dnl

PHP_ARG_ENABLE(json, whether to enable JavaScript Object Serialization support,
[ --disable-json Disable JavaScript Object Serialization support], yes)

if test "$PHP_JSON" != "no"; then
  AC_DEFINE([HAVE_JSON],1 ,[whether to enable JavaScript Object Serialization support])
  AC_HEADER_STDC

     PHP_NEW_EXTENSION(json, json.c utf8_to_utf16.c utf8_decode.c JSON_parser.c, $ext_shared)
     PHP_INSTALL_HEADERS([ext/json], [php_json.h])
     PHP_SUBST(JSON_SHARED_LIBADD)
fi
PHP Internals&extensions | PHPTour Lille 2011   30


                           Extension minimale
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_myext.h"

zend_module_entry myext_module_entry = {
   STANDARD_MODULE_HEADER,
   "myext",
   NULL, /* Function entries */
   NULL, /* Module init */
   NULL, /* Module shutdown */
   NULL, /* Request init */
   NULL, /* Request shutdown */
   NULL, /* Module information */
   "0.1", /* Replace with version number for your extension */
   STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_MYEXT
ZEND_GET_MODULE(myext)
#endif
PHP Internals&extensions | PHPTour Lille 2011   31


         Exemple concrêt (ext/json)

       #include "php.h"
       #include "php_ini.h"
       #include "ext/standard/info.h"
       #include "ext/standard/php_smart_str.h"
       #include "utf8_to_utf16.h"
       #include "JSON_parser.h"
       #include "php_json.h"

       static PHP_MINFO_FUNCTION(json);
       static PHP_FUNCTION(json_encode);
       static PHP_FUNCTION(json_decode);
       static PHP_FUNCTION(json_last_error);


static PHP_MINIT_FUNCTION(json)
{
      REGISTER_LONG_CONSTANT("JSON_HEX_TAG", PHP_JSON_HEX_TAG,
                                CONST_CS | CONST_PERSISTENT);
      REGISTER_LONG_CONSTANT("JSON_HEX_AMP", PHP_JSON_HEX_AMP,
                                CONST_CS | CONST_PERSISTENT);
      return SUCCESS;
}
PHP Internals&extensions | PHPTour Lille 2011   32


                   Exemple conrêt (ext/json)
PHP_JSON_API void php_json_encode(smart_str *buf, zval *val, int options TSRMLS_DC) /* {{{ */
{
   switch (Z_TYPE_P(val))
   {
        … ...
        case IS_DOUBLE:
              {
                 char *d = NULL;
                 int len;
                 double dbl = Z_DVAL_P(val);

                  if (!zend_isinf(dbl) && !zend_isnan(dbl)) {
                         len = spprintf(&d, 0, "%.*k", (int) EG(precision), dbl);
                         smart_str_appendl(buf, d, len);
                         efree(d);
                  } else {
                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "double %.9g does not
                                  conform to the JSON spec, encoded as 0", dbl);
                         smart_str_appendc(buf, '0');
                  }
              }
              break;
}
PHP Internals&extensions | PHPTour Lille 2011   33


Concrêtement, les extensions existantes
 http://pecl.php.net

    APC, MemCache

    bbcode, haru, yaml, docblock

    amfext, svn

    apm, xdebug, xhprof
PHP Internals&extensions | PHPTour Lille 2011   34


Veiller sur les extensions
PHP Internals&extensions | PHPTour Lille 2011   35


                     De l'aide ?
Extending and embedding PHP
   Attention, API de PHP5.1

http://julien-pauli.developpez.com

http://www.php.net/manual/fr/internals2.php

http://lxr.php.net

https://wiki.php.net/internals
PHP Internals&extensions | PHPTour Lille 2011   36


                    Merci !
Merci à vous !



Nous recrutons :)
   Passez me voir
PHP Internals&extensions | PHPTour Lille 2011   37


Questions ?
1 de 37

Recomendados

Cryptographie 101 Pour les programmeurs (PHP) por
Cryptographie 101 Pour les programmeurs (PHP)Cryptographie 101 Pour les programmeurs (PHP)
Cryptographie 101 Pour les programmeurs (PHP)Philippe Gamache
1K vistas82 diapositivas
Communications Réseaux et HTTP avec PHP por
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
2.9K vistas37 diapositivas
PHPTour 2011 - PHP5.4 por
PHPTour 2011 - PHP5.4PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4julien pauli
3.8K vistas48 diapositivas
Patterns and OOP in PHP por
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
1.6K vistas30 diapositivas
Formation python 3 por
Formation python 3Formation python 3
Formation python 3WajihBaghdadi1
341 vistas73 diapositivas
Interception de signal avec dump de la pile d'appel por
Interception de signal avec dump de la pile d'appelInterception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appelThierry Gayet
484 vistas8 diapositivas

Más contenido relacionado

La actualidad más candente

Java SE 7 por
Java SE 7Java SE 7
Java SE 7Lorraine JUG
868 vistas40 diapositivas
Nouveautés php 7 por
Nouveautés php 7Nouveautés php 7
Nouveautés php 7Cyrille Grandval
6.2K vistas29 diapositivas
Pratique de la programmation en go por
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en gokader15
577 vistas59 diapositivas
Presentation langage go_19022015 por
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
899 vistas29 diapositivas
Php seance1 por
Php seance1Php seance1
Php seance1Imen Arfaoui
670 vistas11 diapositivas
Formation python por
Formation pythonFormation python
Formation pythonThierry Gayet
933 vistas118 diapositivas

La actualidad más candente(19)

Pratique de la programmation en go por kader15
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
kader15577 vistas
2013 01-08-php-maturite por Rémi Alvado
2013 01-08-php-maturite2013 01-08-php-maturite
2013 01-08-php-maturite
Rémi Alvado418 vistas
Démons en PHP, de inetd à ZeroMQ por Amaury Bouchard
Démons en PHP, de inetd à ZeroMQDémons en PHP, de inetd à ZeroMQ
Démons en PHP, de inetd à ZeroMQ
Amaury Bouchard6.2K vistas
Reseau por gijo000
ReseauReseau
Reseau
gijo000141 vistas
StHack 2014 - Ninon Eyrolles Obfuscation 101 por StHack
StHack 2014 - Ninon Eyrolles Obfuscation 101StHack 2014 - Ninon Eyrolles Obfuscation 101
StHack 2014 - Ninon Eyrolles Obfuscation 101
StHack 1.2K vistas
Partie 14: Entrée/Sortie — Programmation orientée objet en C++ por Fabio Hernandez
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Fabio Hernandez2.2K vistas
Formation PHP por kemenaran
Formation PHPFormation PHP
Formation PHP
kemenaran16.5K vistas
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE por Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINEIntroduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Marouan OMEZZINE2.7K vistas
PHP & MYSQL #5 : fonctions por Jean Michel
PHP & MYSQL #5 :  fonctionsPHP & MYSQL #5 :  fonctions
PHP & MYSQL #5 : fonctions
Jean Michel807 vistas
Comment relire du code pourri sans se fatiguer por Damien Seguy
Comment relire du code pourri sans se fatiguerComment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguer
Damien Seguy506 vistas

Similar a PHPTour-2011-PHP_Extensions

hassclic270.ppt por
hassclic270.ppthassclic270.ppt
hassclic270.pptadiouf2
9 vistas106 diapositivas
Lp web tp3_idse por
Lp web tp3_idseLp web tp3_idse
Lp web tp3_idseKarim Amane
847 vistas22 diapositivas
Comment développer un serveur métier en python/C++ por
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++cppfrug
1.1K vistas29 diapositivas
php2 : formulaire-session-PDO por
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
1.9K vistas25 diapositivas
Node.js, le pavé dans la mare por
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mareValtech
2.9K vistas44 diapositivas
Présentation de PHP 5.4 [FR] por
Présentation de PHP 5.4 [FR]Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Wixiweb
1.2K vistas30 diapositivas

Similar a PHPTour-2011-PHP_Extensions(20)

hassclic270.ppt por adiouf2
hassclic270.ppthassclic270.ppt
hassclic270.ppt
adiouf29 vistas
Lp web tp3_idse por Karim Amane
Lp web tp3_idseLp web tp3_idse
Lp web tp3_idse
Karim Amane847 vistas
Comment développer un serveur métier en python/C++ por cppfrug
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
cppfrug1.1K vistas
php2 : formulaire-session-PDO por Abdoulaye Dieng
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
Abdoulaye Dieng1.9K vistas
Node.js, le pavé dans la mare por Valtech
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
Valtech2.9K vistas
Présentation de PHP 5.4 [FR] por Wixiweb
Présentation de PHP 5.4 [FR]Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]
Wixiweb1.2K vistas
Industrialiser le contrat dans un projet PHP por halleck45
Industrialiser le contrat dans un projet PHPIndustrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHP
halleck455.8K vistas
20100221 my phingtool - blog por PHPPRO
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blog
PHPPRO959 vistas
Utiliser le Zend Framework avec Symfony por Xavier Gorse
Utiliser le Zend Framework avec SymfonyUtiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec Symfony
Xavier Gorse6K vistas
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év... por Normandie Web Xperts
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Cours php -partie 1.pdf por ssuserc46a93
Cours php -partie 1.pdfCours php -partie 1.pdf
Cours php -partie 1.pdf
ssuserc46a9316 vistas
Monitoring d'applications/environnements PHP: APM et Pinba por Patrick Allaert
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et Pinba
Patrick Allaert2.5K vistas
Laravel yet another framework por LAHAXE Arnaud
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another framework
LAHAXE Arnaud4.2K vistas
PHP et Performances - AFUP 2005 por Eric D.
PHP et Performances - AFUP 2005PHP et Performances - AFUP 2005
PHP et Performances - AFUP 2005
Eric D.1.9K vistas
PHP 7 et Symfony 3 por Eddy RICHARD
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3
Eddy RICHARD3.1K vistas

Más de julien pauli

Doctrine with Symfony - SymfonyCon 2019 por
Doctrine with Symfony - SymfonyCon 2019Doctrine with Symfony - SymfonyCon 2019
Doctrine with Symfony - SymfonyCon 2019julien pauli
334 vistas77 diapositivas
Php engine por
Php enginePhp engine
Php enginejulien pauli
1.9K vistas34 diapositivas
PHP 7 OPCache extension review por
PHP 7 OPCache extension reviewPHP 7 OPCache extension review
PHP 7 OPCache extension reviewjulien pauli
53.2K vistas44 diapositivas
Dns por
DnsDns
Dnsjulien pauli
864 vistas68 diapositivas
PHP Internals and Virtual Machine por
PHP Internals and Virtual MachinePHP Internals and Virtual Machine
PHP Internals and Virtual Machinejulien pauli
645 vistas31 diapositivas
Basics of Cryptography - Stream ciphers and PRNG por
Basics of Cryptography - Stream ciphers and PRNGBasics of Cryptography - Stream ciphers and PRNG
Basics of Cryptography - Stream ciphers and PRNGjulien pauli
1.2K vistas73 diapositivas

Más de julien pauli(20)

Doctrine with Symfony - SymfonyCon 2019 por julien pauli
Doctrine with Symfony - SymfonyCon 2019Doctrine with Symfony - SymfonyCon 2019
Doctrine with Symfony - SymfonyCon 2019
julien pauli334 vistas
PHP 7 OPCache extension review por julien pauli
PHP 7 OPCache extension reviewPHP 7 OPCache extension review
PHP 7 OPCache extension review
julien pauli53.2K vistas
PHP Internals and Virtual Machine por julien pauli
PHP Internals and Virtual MachinePHP Internals and Virtual Machine
PHP Internals and Virtual Machine
julien pauli645 vistas
Basics of Cryptography - Stream ciphers and PRNG por julien pauli
Basics of Cryptography - Stream ciphers and PRNGBasics of Cryptography - Stream ciphers and PRNG
Basics of Cryptography - Stream ciphers and PRNG
julien pauli1.2K vistas
Mastering your home network - Do It Yourself por julien pauli
Mastering your home network - Do It YourselfMastering your home network - Do It Yourself
Mastering your home network - Do It Yourself
julien pauli1.9K vistas
SymfonyCon 2017 php7 performances por julien pauli
SymfonyCon 2017 php7 performancesSymfonyCon 2017 php7 performances
SymfonyCon 2017 php7 performances
julien pauli2.8K vistas
Php and threads ZTS por julien pauli
Php and threads ZTSPhp and threads ZTS
Php and threads ZTS
julien pauli8.1K vistas
Symfony live 2017_php7_performances por julien pauli
Symfony live 2017_php7_performancesSymfony live 2017_php7_performances
Symfony live 2017_php7_performances
julien pauli1.4K vistas
PHP 7 new engine por julien pauli
PHP 7 new enginePHP 7 new engine
PHP 7 new engine
julien pauli1.9K vistas
Php7 extensions workshop por julien pauli
Php7 extensions workshopPhp7 extensions workshop
Php7 extensions workshop
julien pauli3.8K vistas
Profiling php5 to php7 por julien pauli
Profiling php5 to php7Profiling php5 to php7
Profiling php5 to php7
julien pauli2.8K vistas
PHP 7 performances from PHP 5 por julien pauli
PHP 7 performances from PHP 5PHP 7 performances from PHP 5
PHP 7 performances from PHP 5
julien pauli3.3K vistas
Mysqlnd, an unknown powerful PHP extension por julien pauli
Mysqlnd, an unknown powerful PHP extensionMysqlnd, an unknown powerful PHP extension
Mysqlnd, an unknown powerful PHP extension
julien pauli6.8K vistas
Php extensions workshop por julien pauli
Php extensions workshopPhp extensions workshop
Php extensions workshop
julien pauli6.3K vistas
Understanding PHP objects por julien pauli
Understanding PHP objectsUnderstanding PHP objects
Understanding PHP objects
julien pauli13.8K vistas
PHP Tips for certification - OdW13 por julien pauli
PHP Tips for certification - OdW13PHP Tips for certification - OdW13
PHP Tips for certification - OdW13
julien pauli5.8K vistas

PHPTour-2011-PHP_Extensions

  • 1. PHP Internals&extensions | PHPTour Lille 2011 1 Fonctionnement de PHP - Internals et extensions
  • 2. PHP Internals&extensions | PHPTour Lille 2011 2 Hello, I'm Julien Pauli :) @julienpauli http://julien-pauli.developpez.com IRC Freenode, EFNet @jpauli Software architect – PHP Guru Working at Comuto http://www.covoiturage.fr OSS Contributor PHP Contributor – http://doc.php.net/fr jpauli@php.net
  • 3. PHP Internals&extensions | PHPTour Lille 2011 3 PHP, internals & extensions PHP vu de l'intérieur Les différents organes L'architecture interne Présentation du système d'extensions Les types d'extensions Le mécanisme de compilation et de chargement Exemples d'extensions pecl safe-made Conclusion
  • 4. PHP Internals&extensions | PHPTour Lille 2011 4 PHP : les organes 820.000 lignes de code C Conçues pour représenter des couches qui glissent l'une sur l'autre
  • 5. PHP Internals&extensions | PHPTour Lille 2011 5 PHP : SAPI Server Application Interface Point d'entrée vers le moteur PHP CLI, CGI, FastCGI, APXS(Apache), Built-in-Server Buts de la SAPI : gérer les en-têtes de la requête d'entrée ; gérer les données de la requête d'entrée : POST, COOKIE ; écrire sur la sortie, la SAPI est peu liée au système de tampon de PHP (ob) : elle écrit dans la couche basse, et permet de la vider (flush) ; démarrer/Arrêter le ZendEngine et le PHPCore.
  • 6. PHP Internals&extensions | PHPTour Lille 2011 6 sapi_module_struct struct _sapi_module_struct { char *name; char *pretty_name; int (*startup)(struct _sapi_module_struct *sapi_module); // fonction de démarrage int (*shutdown)(struct _sapi_module_struct *sapi_module); // fonction de de fermeture int (*activate)(TSRMLS_D); // fonction d'activation (environnement de requête) int (*deactivate)(TSRMLS_D); // fonction de désactivation (environnement de requête) int (*ub_write)(const char *str, unsigned int str_length TSRMLS_DC); void (*flush)(void *server_context); struct stat *(*get_stat)(TSRMLS_D); char *(*getenv)(char *name, size_t name_len TSRMLS_DC); void (*sapi_error)(int type, const char *error_msg, ...); int (*header_handler)(sapi_header_struct *sapi_header, sapi_header_op_enum op, sapi_headers_struct *sapi_headers TSRMLS_DC); int (*send_headers)(sapi_headers_struct *sapi_headers TSRMLS_DC); void (*send_header)(sapi_header_struct *sapi_header, void *server_context TSRMLS_DC); int (*read_post)(char *buffer, uint count_bytes TSRMLS_DC);
  • 7. PHP Internals&extensions | PHPTour Lille 2011 7 Exemple de SAPI Apache2 http://lxr.php.net/xref/PHP_5_4/sapi/apache2handler/sapi_apache2.c zend_first_try { // ... zend_file_handle zfd; zfd.type = ZEND_HANDLE_FILENAME; zfd.filename = (char *) r->filename; zfd.free_filename = 0; zfd.opened_path = NULL; if (!parent_req) { php_execute_script(&zfd TSRMLS_CC); } else { zend_execute_scripts(ZEND_INCLUDE TSRMLS_CC, NULL, 1, &zfd); } apr_table_set(r->notes, "mod_php_memory_usage", apr_psprintf(ctx->r->pool, "%zu", zend_memory_peak_usage(1 TSRMLS_CC))); } } zend_end_try();
  • 8. PHP Internals&extensions | PHPTour Lille 2011 8 PHP Core Un genre de fourre-tout gestion du réseau via une API de flux (streams) ; algorithme de tri (MergeSort) ; lecture de la ligne de commandes (getopt()) ; open_basedir, safe_mode et parsing de chemins (fopen) ; buffer de sortie (ob_) ; ticks ; logos (php et zend) ; fonctions de lecture des données de la requête (passées à la SAPI comme fonctions par défaut) ; variables globales, parsing d'url, outils de traitement des chaines, gestion des erreurs ; "Tout ce qui n'est pas extension"
  • 9. PHP Internals&extensions | PHPTour Lille 2011 9 PHPCore Globales Globales accessibles de struct _php_core_globals { partout zend_bool magic_quotes_gpc; zend_bool magic_quotes_runtime; macro PG() zend_bool magic_quotes_sybase; zend_bool safe_mode; zend_bool allow_call_time_pass_reference; zend_bool implicit_flush; long output_buffering; if (PG(register_argc_argv)) { char *safe_mode_include_dir; php_build_argv(SG(request_info).query_string, zend_bool safe_mode_gid; PG(http_globals)[TRACK_VARS_SERVER]); zend_bool sql_safe_mode; } zend_bool enable_dl; char *output_handler; char *unserialize_callback_func; long serialize_precision; char *safe_mode_exec_dir; long memory_limit; long max_input_time; … ...
  • 10. PHP Internals&extensions | PHPTour Lille 2011 10 Zend Engine Core Tools VirtualMachine Thread Safety Memory Manager
  • 11. PHP Internals&extensions | PHPTour Lille 2011 11 Zend Engine compilateur : analyseurs lexical/syntaxique (re2c/bison), syntaxe PHP et syntaxe INI exécuteur : la partie la plus importante, la machine virtuelle de PHP gestionnaire de mémoire : Zend Memory Manager définitions des concepts de "classe" et de "fonction" pour PHP définitions et gestion des variables PHP : zval, références et types PHP une partie de la gestion de la concurrence des threads (Thread Safety : TS) zend_gc : le ramasse-miettes (garbage collector) de PHP gestion avancée du type flottant de C moteur de gestion des erreurs et des exceptions moteur d'extensions hashtables (array PHP), algorithmes de tri, objets PHP et itérateurs
  • 12. PHP Internals&extensions | PHPTour Lille 2011 12 Life Cycle
  • 13. PHP Internals&extensions | PHPTour Lille 2011 13 Extensions
  • 14. PHP Internals&extensions | PHPTour Lille 2011 14 Une extension PHP, pourquoi ? Code C Rapide, très rapide Permet de rajouter à PHP : Des fonctions Des classes Des constantes Des paramètres dans php.ini Des gestionnaires de flux Des variables, globales (burk) Permet aussi de lier PHP à une lib du système ext/simpleXML et ext/dom lient PHP à libxml ext/gd lie PHP à libpng et libjpeg
  • 15. PHP Internals&extensions | PHPTour Lille 2011 15 PHP est lié à l'OS via ses extensions julien@jpauli:~$ ldd $(which php) linux-vdso.so.1 => (0x00007fff5abff000) libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f8398338000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8398120000) libexslt.so.0 => /usr/lib/libexslt.so.0 (0x00007f8397f0a000) libtidy-0.99.so.0 => /usr/lib/libtidy-0.99.so.0 (0x00007f8397cad000) libedit.so.2 => /usr/lib/libedit.so.2 (0x00007f8397a86000) libncurses.so.5 => /lib/libncurses.so.5 (0x00007f8397841000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8397639000) libmcrypt.so.4 => /usr/lib/libmcrypt.so.4 (0x00007f8397406000) libltdl.so.7 => /usr/lib/libltdl.so.7 (0x00007f83971fb000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8396ff7000) libldap_r-2.4.so.2 => /usr/lib/libldap_r-2.4.so.2 (0x00007f8396dac000) liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2 (0x00007f8396b9d000) libpng12.so.0 => /usr/lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f8396976000) libbz2.so.1.0 => /lib/libbz2.so.1.0 (0x00007f8396766000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f83964e0000) libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f83962c6000) libssl.so.0.9.8 => /lib/libssl.so.0.9.8 (0x00007f8396073000) libcrypto.so.0.9.8 => /lib/libcrypto.so.0.9.8 (0x00007f8395ce3000) libcurl-gnutls.so.4 => /usr/lib/libcurl-gnutls.so.4 (0x00007f8395a8f000) libicui18n.so.44 => /usr/lib/libicui18n.so.44 (0x00007f83956d1000) libicuuc.so.44 => /usr/lib/libicuuc.so.44 (0x00007f8395388000) libicudata.so.44 => /usr/lib/libicudata.so.44 (0x00007f8394348000) ...
  • 16. PHP Internals&extensions | PHPTour Lille 2011 16 Tout est extension Dans PHP, tout ce qui n'est pas Core et ZendEngine est une extension. Une extension n'est pas forcément un .so (.dll) Une extension peut être compilée et liée "statiquement", il n'y a donc pas de .so Une extension ajoute des fonctionnalités à PHP Vocabulaire : une extension s'appelle ext/{something} Le moteur est tellement extensible, que tout est extension : strings, array, numbers … regexp, dates SPL ...
  • 17. PHP Internals&extensions | PHPTour Lille 2011 17 ext/standard fonctions array_ ; fonctions str_ ; sérialisation PHP tout ce qui concerne les urls, les caractères dans les chaines... ; transtypages des variables, bases numériques, locale ; crypt, base64, md5, assert, crc32, phpinfo... ; gestion des fichiers et du système de fichiers ; fonctions relatives au réseau, flux.
  • 18. PHP Internals&extensions | PHPTour Lille 2011 18 ext/core func_get_args(), gc_enable(), memory_get_usage(), zend_version()
  • 19. PHP Internals&extensions | PHPTour Lille 2011 19 Extensions obligatoires Au minimum, PHP doit disposer de core date ereg pcre reflection SPL standard Tout le reste est optionnel Un PHP "minimal" consomme très très peu de mémoire
  • 20. PHP Internals&extensions | PHPTour Lille 2011 20 2 types d'extensions Extensions Ok, on connait extension = myext.so (utilise extension_dir) Zend Extensions Plus puissantes Peuvent remplacer des fonctions du ZendEngine non compatibles avec dl() zend_extension = full/path/to/myext.so Mais les 2 se compilent de la même manière C'est du code C, point... Il a simplement des rôles différents Et une profondeur d’interaction dans PHP différente
  • 21. PHP Internals&extensions | PHPTour Lille 2011 21 Structure d'une extension PHP struct _zend_module_entry { unsigned short size; unsigned int zend_api; unsigned char zend_debug; unsigned char zts; const struct _zend_ini_entry *ini_entry; const struct _zend_module_dep *deps; const char *name; const struct _zend_function_entry *functions; int (*module_startup_func)(INIT_FUNC_ARGS); int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); int (*request_startup_func)(INIT_FUNC_ARGS); int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); const char *version; size_t globals_size; void* globals_ptr; void (*globals_ctor)(void *global TSRMLS_DC); void (*globals_dtor)(void *global TSRMLS_DC); int (*post_deactivate_func)(void); int module_started; unsigned char type; void *handle; int module_number; char *build_id; };
  • 22. PHP Internals&extensions | PHPTour Lille 2011 22 Structure d'une Zend Extension struct _zend_extension { char *name; char *version; char *author; char *URL; char *copyright; startup_func_t startup; shutdown_func_t shutdown; activate_func_t activate; deactivate_func_t deactivate; message_handler_func_t message_handler; op_array_handler_func_t op_array_handler; statement_handler_func_t statement_handler; fcall_begin_handler_func_t fcall_begin_handler; fcall_end_handler_func_t fcall_end_handler; op_array_ctor_func_t op_array_ctor; op_array_dtor_func_t op_array_dtor; int (*api_no_check)(int api_no); int (*build_id_check)(const char* build_id); void *reserved3; void *reserved4; void *reserved5; void *reserved6; void *reserved7; void *reserved8; DL_HANDLE handle; int resource_number;
  • 23. PHP Internals&extensions | PHPTour Lille 2011 23 Introspecter une extension julien@jpauli:~$ php --re json php --ri Extension [ <persistent> extension #19 json version 1.2.1 ] { php --re - Constants [12] { Constant [ integer JSON_HEX_TAG ] { 1 } Constant [ integer JSON_HEX_AMP ] { 2 } Constant [ integer JSON_HEX_APOS ] { 4 } php -m ... } - Functions { Function [ <internal:json> function json_encode ] { - Parameters [2] { Parameter #0 [ <required> $value ] Parameter #1 [ <optional> $options ] } } Function [ <internal:json> function json_decode ] { - Parameters [3] { Parameter #0 [ <required> $json ] Parameter #1 [ <optional> $assoc ] Parameter #2 [ <optional> $depth ] } }
  • 24. PHP Internals&extensions | PHPTour Lille 2011 24 Introspecter une extension
  • 25. PHP Internals&extensions | PHPTour Lille 2011 25 Lier une extension Statiquement L'extension sera liée au binaire PHP Pratique lorsqu'on l'utilise souvent Alourdit l'empreinte mémoire de PHP en permanence Dynamiquement L'extension sera sortie dans un .so Chargé via PHP.ini à chaque démarrage de PHP Permet de désactiver l'extension sans recompiler Démarrage de PHP plus lent
  • 26. PHP Internals&extensions | PHPTour Lille 2011 26 Compiler une extension './configure' '--with-apxs2=/usr/local/apache2/bin/apxs' '--with-bz2' '--with-config-file-scan-dir=/usr/local/etc' '--with-curl' '--with-gd' '--with-gettext' '--with-ldap' '--with-mcrypt' '--with-mysqli=mysqlnd' '--with-mysql=mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-openssl' '--with-libedit' '--with-tidy=shared' '--with-xsl' '--enable-bcmath' make && make install '--enable-gd-native-ttf' '--enable-intl' '--enable-mbstring' '--enable-pcntl' '--enable-sockets' '--enable-soap' '--enable-sqlite-utf8' '--enable-zip' '--disable-cgi'
  • 27. PHP Internals&extensions | PHPTour Lille 2011 27 Outils nécessaire pour compiler une ext Outils de compilation (GCC) Paquet "build-essentials" sous Debian autoconf: 2.13 (2.59+ for PHP 5.4+) automake: 1.4+ libtool: 1.4.x+ (except 1.4.2) PHP compilé en --debug Binaire "phpize" Script "php-config" script "ext_skel.sh" http://svn.php.net/viewvc/php/php-src/trunk/ext/skeleton/
  • 28. PHP Internals&extensions | PHPTour Lille 2011 28 Processus de développement Outils utiles : Un éditeur de code gdb valgrind $ cd myext $ edit README, CREDITS, RELEASE-0.1.0 $ edit config.m4 and config.w32 $ phpize $ ./configure $ make $ php -n -dextension_dir=`pwd`/modules -dextension=myext.so myext.php $ edit myext.c to correct errors $ make
  • 29. PHP Internals&extensions | PHPTour Lille 2011 29 Tout est dans le config.m4 Fichier utilisé par autoconf Déclare les dépendances Déclare les switch Déclare les fichiers à compiler dnl dnl $Id: config.m4 282645 2009-06-23 13:09:34Z johannes $ dnl PHP_ARG_ENABLE(json, whether to enable JavaScript Object Serialization support, [ --disable-json Disable JavaScript Object Serialization support], yes) if test "$PHP_JSON" != "no"; then AC_DEFINE([HAVE_JSON],1 ,[whether to enable JavaScript Object Serialization support]) AC_HEADER_STDC PHP_NEW_EXTENSION(json, json.c utf8_to_utf16.c utf8_decode.c JSON_parser.c, $ext_shared) PHP_INSTALL_HEADERS([ext/json], [php_json.h]) PHP_SUBST(JSON_SHARED_LIBADD) fi
  • 30. PHP Internals&extensions | PHPTour Lille 2011 30 Extension minimale #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "php_myext.h" zend_module_entry myext_module_entry = { STANDARD_MODULE_HEADER, "myext", NULL, /* Function entries */ NULL, /* Module init */ NULL, /* Module shutdown */ NULL, /* Request init */ NULL, /* Request shutdown */ NULL, /* Module information */ "0.1", /* Replace with version number for your extension */ STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_MYEXT ZEND_GET_MODULE(myext) #endif
  • 31. PHP Internals&extensions | PHPTour Lille 2011 31 Exemple concrêt (ext/json) #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "ext/standard/php_smart_str.h" #include "utf8_to_utf16.h" #include "JSON_parser.h" #include "php_json.h" static PHP_MINFO_FUNCTION(json); static PHP_FUNCTION(json_encode); static PHP_FUNCTION(json_decode); static PHP_FUNCTION(json_last_error); static PHP_MINIT_FUNCTION(json) { REGISTER_LONG_CONSTANT("JSON_HEX_TAG", PHP_JSON_HEX_TAG, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("JSON_HEX_AMP", PHP_JSON_HEX_AMP, CONST_CS | CONST_PERSISTENT); return SUCCESS; }
  • 32. PHP Internals&extensions | PHPTour Lille 2011 32 Exemple conrêt (ext/json) PHP_JSON_API void php_json_encode(smart_str *buf, zval *val, int options TSRMLS_DC) /* {{{ */ { switch (Z_TYPE_P(val)) { … ... case IS_DOUBLE: { char *d = NULL; int len; double dbl = Z_DVAL_P(val); if (!zend_isinf(dbl) && !zend_isnan(dbl)) { len = spprintf(&d, 0, "%.*k", (int) EG(precision), dbl); smart_str_appendl(buf, d, len); efree(d); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "double %.9g does not conform to the JSON spec, encoded as 0", dbl); smart_str_appendc(buf, '0'); } } break; }
  • 33. PHP Internals&extensions | PHPTour Lille 2011 33 Concrêtement, les extensions existantes http://pecl.php.net APC, MemCache bbcode, haru, yaml, docblock amfext, svn apm, xdebug, xhprof
  • 34. PHP Internals&extensions | PHPTour Lille 2011 34 Veiller sur les extensions
  • 35. PHP Internals&extensions | PHPTour Lille 2011 35 De l'aide ? Extending and embedding PHP Attention, API de PHP5.1 http://julien-pauli.developpez.com http://www.php.net/manual/fr/internals2.php http://lxr.php.net https://wiki.php.net/internals
  • 36. PHP Internals&extensions | PHPTour Lille 2011 36 Merci ! Merci à vous ! Nous recrutons :) Passez me voir
  • 37. PHP Internals&extensions | PHPTour Lille 2011 37 Questions ?