SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
1ª PHP UnConference Brasil

    Desenvolvimento de
      extensões PECL
     Erick Belluci Tedeschi - @ericktedeschi




                        
Agenda

­ PHP LifeCycle
­ Estrutura ZVAL
­ Ambiente de Desenvolvimento (*nix)
­ ext_skel (Esqueleto de uma extensão)
­ API Zend
­ Aceitando parâmetros
­ Exemplo: Função recebendo parâmetro e retornando 
valor

* Live DEMO :­D



                            
PHP Page Life Cycle


     Ciclo de vida de uma requisição de página (script) PHP originada de um WebServer:



Processo do Apache                           Inicia WebServer
 LoadModule php5_module                      Carrega módulo do PHP
     mysql,sockets,curl,curses,etc...        PHP Carrega suas extensões (built­in e php.ini)

                  MINIT                      Carrega constantes, ini entries, resources, etc...

                   RINIT                     Inicializa autoglobals, symbol table, log, etc...

              Script Execution

               RSHUTDOWN                     Libera memória...

             MSHUTDOWN                       Libera memória... (ini entries, resources, etc...)


                                              
Estrutura ZVAL

typedef struct _zval_struct {   typedef union _zvalue_value {
    zvalue_value value;             long lval;   // Long,Bool,Resource
    zend_uint refcont;              double dval; // Double
    zend_uchar type;                struct {
    zend_uchar is_ref;                  char *val;
} zval;                                 long length;
                                    } str; // String
                                    HashTable *ht; // Array
                                    zend_object_value obj; // Object
                                } zvalue_value;
       IS_NULL
       IS_BOOL
       IS_LONG
       IS_DOUBLE
       IS_STRING
       IS_ARRAY
       IS_OBJECT
       IS_RESOURCE

                                    
Ambiente de Desenvolvimento (*nix)


 Requisitos necessários para compilar extensões:

 Ubuntu: m4 e build­essential

 ­ autoconf 2.13 (http://ftp.gnu.org/gnu/autoconf)

 ­ automake 1.4 (http://ftp.gnu.org/gnu/automake)

 ­ libtool 1.4.x+ (except 1.4.2) (http://ftp.gnu.org/gnu/libtool)

 ­ bison 1.28 (http://ftp.gnu.org/gnu/bison)

 ­ flex 2.5.4 (http://prdownloads.sourceforge.net/flex/flex­2.5.4a.tar.gz?download)

 ­ re2c 0.13.4+ (http://re2c.org)

 * Caso a extensão faça uso de alguma bilioteca externa, a mesma deve ser instalada:
 Libcurses­dev, libxml­dev, etc...
                                                    
Esqueleto da Extensão

Arquivos básicos que compõe a extensão:

Obrigatórios:

­ config.m4     ­ Arquivo de configuração *unix
­ config.w32   ­ Arquivo de configuração Windows
­ php_EXTNAME.h  ­ Cabeçalho (includes, structs, protótipo de funções, macros, etc...)
­ EXTNAME.c – Esqueleto da extensão e implementação das funções/classes

Opcionais:

­ CREDITS   ­ 1ª linha Nome da Extensão 2ª linha em diante nome dos colaboradores
­ EXPERIMENTAL  ­ Não estável
­ EXTNAME.php – Teste básico da extensão
­ tests – Diretório onde ficam os casos de teste escritos para a extensão

Obs.: EXTNAME é o nome da extensão criada


                                               
Esqueleto da Extensão


 Estrutura interna do código fonte de uma extensão:


     cabeçalho        Licença, Créditos, Descrição, etc...
     includes         API e bibliotecas externas
     funções          Funções existentes na extensão
     MINFO            Informações do módulo (phpinfo())
     MINIT            Tarefas a serem executadas ao carregar a extensão
     MSHUTDOWN        Libera memórias das tarefas executadas no MINIT
     RINIT            Tarefas a serem executadas na requisição do script PHP
     RSUTDOWN         Libera memória das tarefas executadas no RINIT
     function_entry   Registra as funções para a extensão
     module_entry     Entrada do módulo no PHP


                                                
Esqueleto da Extensão - Cabeçalho



/*
  +----------------------------------------------------------------------+
  | PHP Version 5                                                        |
  +----------------------------------------------------------------------+
  | Copyright (c) 1997-2008 The PHP Group                                |
  +----------------------------------------------------------------------+
  | This source file is subject to version 3.01 of the PHP license,      |
  | that is bundled with this package in the file LICENSE, and is        |
  | available through the world-wide-web at the following url:           |
  | http://www.php.net/license/3_01.txt                                  |
  | If you did not receive a copy of the PHP license and are unable to   |
  | obtain it through the world-wide-web, please send a note to          |
  | license@php.net so we can mail you a copy immediately.               |
  +----------------------------------------------------------------------+
  | Author: Fulano de Tal < fulano at tal dot com >                      |
  +----------------------------------------------------------------------+
*/

/* $Id: header 252479 2008-02-07 19:39:50Z iliaa $ */



                                             
Esqueleto da Extensão - Includes




        /* Créditos … */

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

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




                                
Esqueleto da Extensão - Funções

// Exemplo de funções definidas para o “user space”.
PHP_FUNCTION(mysql_connect)
{
    /* código da função */
}

PHP_FUNCTION(mysql_close)
{
    /* código da função */
}

// Exemplo da implementação de classes para o “user space”.
PHP_METHOD(Cachorro, __construct)
{
    /* código do construtor */
}

PHP_METHOD(Cachorro, latir)
{
    /* código do método */
}                                 
Esqueleto da Extensão - MINFO


static PHP_MINFO_FUNCTION(libxml)
{
    php_info_print_table_start();
    php_info_print_table_row(2, "libXML   support", "active");
    php_info_print_table_row(2, "libXML   Compiled Version", LIBXML_DOTTED_VERSION);
    php_info_print_table_row(2, "libXML   Loaded Version", (char *)xmlParserVersion);
    php_info_print_table_row(2, "libXML   streams", "enabled");
    php_info_print_table_end();
}




                                            
Esqueleto da Extensão -                MINIT/MSHUTDOWN




 PHP_MINIT_FUNCTION(extname)
 {
    REGISTER_INI_ENTRIES();
    return SUCCESS;
 }

 PHP_MSHUTDOWN_FUNCTION(extname)
 {
    UNREGISTER_INI_ENTRIES();
    return SUCCESS;
 }




                                    
Esqueleto da Extensão -            RINIT/RSHUTDOWN




         PHP_RINIT_FUNCTION(extname)
         {
            return SUCCESS;
         }


         PHP_RSHUTDOWN_FUNCTION(extname)
         {

             return SUCCESS;
         }




                                
Esqueleto da Extensão –                    Function Entry




const zend_function_entry extname_functions[] = {
    PHP_FE(extname_abrir, NULL)
    PHP_FE(extname_colar, NULL)
    PHP_FE(extname_recortar, NULL)
    {NULL, NULL, NULL} /* Must be the last line in extname_functions[] */
};




                                        
Esqueleto da Extensão –               Module Entry




zend_module_entry extname_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
   STANDARD_MODULE_HEADER,
#endif
   "extname",
   extname_functions,
   PHP_MINIT(extname),
   PHP_MSHUTDOWN(extname),
   PHP_RINIT(extname),
   PHP_RSHUTDOWN(extname),
   PHP_MINFO(extname),
#if ZEND_MODULE_API_NO >= 20010901
   "0.1", /* Replace with version number for your extension */
#endif
   STANDARD_MODULE_PROPERTIES
};

                                   
API ZEND – Manipulação ZVAL

Macros para manipulação de ZVAL

ZVAL_RESOURCE(zval, 234)
ZVAL_NULL(zval)
ZVAL_BOOL(zval, 1)
ZVAL_LONG(zval, 1234)
ZVAL_DOUBLE(zval, 34.5);
ZVAL_STRING(zval, “Fulano”, 0)
ZVAL_EMPTY_STRING(zval)
ZVAL_FALSE(zval) // = ZVAL_BOOL(zval, 0);
ZVAL_TRUE(zval) // = ZVAL_BOOL(zval, 1);

Macros para manipulação do valor de retorno da função

RETVAL_RESOURCE(234) // ZVAL_RESOURCE(return_value, 234)
RETVAL_BOOL(1) // = ZVAL_BOOL(return_value, 1)
RETVAL_NULL() // = ZVAL_NULL(return_value)
RETVAL_LONG(1234) // = ZVAL_LONG(return_value, 1234)
RETVAL_DOUBLE(34.5) // = ZVAL_DOUBLE(return_value, 34.5)
RETVAL_STRING(“Fulano”, 0) // = ZVAL_STRING(return_value, “Fulano”, 0)
RETVAL_FALSE
RETVAL_TRUE
                                    
etc...
API ZEND – Manipulação Arrays

PHP_FUNCTION(retorna_array)
{
   array_init(return_value);
   add_assoc_long(return_value, “Numero”, 1234);
   add_assoc_bool(return_value, “Verdade”, 1);
   add_assoc_double(return_value, “Peso”, 27.4);
}

<?php print_r(retorna_array()); ?>
Resultado
{
    [Numero] => 1234
    [Verdade] => 1
    [Peso] => 27.4
}


int add_assoc_long(zval *arg, char *key, long n);
int add_assoc_null(zval *arg, char *key);
int add_assoc_bool(zval *arg, char *key, int b);
int add_assoc_resource(zval *arg, char *key, int r);
int add_assoc_double(zval *arg, char *key, double d);
int add_assoc_string(zval *arg, char *key, char *str, int dup);
int add_assoc_stringl(zval *arg, char *key, char *str, uint len, int dup);
int   add_assoc_zval(zval *arg, char *key,   zval *value);
API ZEND – Manipulação Arrays


Adiciona com um número de índice específico

int   add_index_long(zval *arg, uint idx, long n);
int   add_index_null(zval *arg, uint idx);
int   add_index_bool(zval *arg, uint idx, int b);
int   add_index_resource(zval *arg, uint idx, int r);
int   add_index_double(zval *arg, uint idx, double d);
int   add_index_string(zval *arg, uint idx, char *str, int duplicate);
int   add_index_stringl(zval *arg, uint idx, char *str, uint length, int duplicate);
int   add_index_zval(zval *arg, uint idx, zval *value);

Adiciona no próximo índice

int   add_next_index_long(zval *arg, long n);
int   add_next_index_null(zval *arg);
int   add_next_index_bool(zval *arg, int b);
int   add_next_index_resource(zval *arg, int r);
int   add_next_index_double(zval *arg, double d);
int   add_next_index_string(zval *arg, char *str, int duplicate);
int   add_next_index_stringl(zval *arg, char *str, uint length, int duplicate);
int   add_next_index_zval(zval *arg, zval *value);

                                           
Aceitando Parâmetros

           Syntax: zend_parse_parameters(num_args, “format args”, &arg1, &arg2, ...)




l       Long       long *
d       double     double *
b       Boolean    zend_bool *
a       array      zval **
o       Object     zval **
O       Object     zval **, zend_class_Entry *
                   Força ser da classe/tipo determinada
s       String     char **, int *
                   Sempre recebe string e tamanho
r       resource   zval **
z       zval       zval **
Z       zval-ref   zval ***


|       Restante (parte direita) são opcionais
!       Proximo parametro retorna NULL se o tipo é IS_NULL
                                                
Aceitando Parâmetros – Exemplo 1



PHP_FUNCTION(exemplo1)
{
    /* Definição das variáveis */
    char *nome;
    int nome_len;

        /* Pegando os parâmetros */
        if (zend_parse_parameters(1 TSRMLS_CC, “s”, &nome, &nome_len) == FAILURE)
        {
            return;
        }

        /* Código da função... */
        php_printf(“Nome: %s”, nome);

        /* Retorno de valor */
        RETVAL_NULL;
}


                                           
Aceitando Parâmetros – Exemplo 2

PHP_FUNCTION(tipovar)
{
    /* Declaração das variáveis */
    zval *variavel;
    /* Recebendo parâmetros */
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &variavel)
                    == FAILURE) {
        return;
    }
    /* Código da função */
    switch (Z_TYPE_P(variavel)) {
         case IS_LONG:
             php_printf("Inteiron");
             break;
         case IS_ARRAY:
             php_printf("Matrizn");
             break;
         default:
             php_printf("Tipo desconhecidon");
             break;
    }

    /* Retorno de valor */
}                                        
Retornando Valor – Exemplo 3




           PHP_FUNCTION(numeroCao)
           {
               /* Declaração das variáveis */

               /* Recebendo parâmetros */

               /* Código da função */

               /* Retorno de valor */
               RETVAL_LONG(666);
           }




                               
Live DEMO




             
die()




        Erick Belluci Tedeschi ­ @ericktedeschi

        htp://itatux.blogspot.com
        http://oerick.com
        http://www.linkedin.com/in/ericktedeschi
                                  

Más contenido relacionado

La actualidad más candente

Introdução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPIntrodução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPOtávio Calaça Xavier
 
O Que é Shell (bash)
O Que é Shell (bash)O Que é Shell (bash)
O Que é Shell (bash)Sérgio Silva
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Técnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em djangoTécnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em djangoMario Chaves
 
Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFutureHelder da Rocha
 
PL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLPL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLJuliano Atanazio
 
Introdução a ruby
Introdução a rubyIntrodução a ruby
Introdução a rubyWende Mendes
 
Cherrypy - um framework para desenvolvimento rápido de aplicações web
Cherrypy - um framework para desenvolvimento rápido de aplicações webCherrypy - um framework para desenvolvimento rápido de aplicações web
Cherrypy - um framework para desenvolvimento rápido de aplicações webAlvaro Oliveira
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: SincronizadoresHelder da Rocha
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentesHelder da Rocha
 
Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Hugo Maia Vieira
 

La actualidad más candente (20)

Introdução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPIntrodução às Redes Neurais com PHP
Introdução às Redes Neurais com PHP
 
Sapo Sessions PHP
Sapo Sessions PHPSapo Sessions PHP
Sapo Sessions PHP
 
O Que é Shell (bash)
O Que é Shell (bash)O Que é Shell (bash)
O Que é Shell (bash)
 
Stack based overflow
Stack based overflowStack based overflow
Stack based overflow
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Linux shell
Linux shellLinux shell
Linux shell
 
Postgresql +python
Postgresql +pythonPostgresql +python
Postgresql +python
 
Técnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em djangoTécnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em django
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFuture
 
PL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLPL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQL
 
Redes Neurais com PHP
Redes Neurais com PHPRedes Neurais com PHP
Redes Neurais com PHP
 
Introdução a ruby
Introdução a rubyIntrodução a ruby
Introdução a ruby
 
Cherrypy - um framework para desenvolvimento rápido de aplicações web
Cherrypy - um framework para desenvolvimento rápido de aplicações webCherrypy - um framework para desenvolvimento rápido de aplicações web
Cherrypy - um framework para desenvolvimento rápido de aplicações web
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: Sincronizadores
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentes
 
Acessando o MySql com o Python
Acessando o MySql com o PythonAcessando o MySql com o Python
Acessando o MySql com o Python
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)
 

Destacado

PHP Conference Brasil 2011 - Desenvolvendo Seguro (do rascunho ao deploy)
PHP Conference Brasil 2011 - Desenvolvendo Seguro (do rascunho ao deploy)PHP Conference Brasil 2011 - Desenvolvendo Seguro (do rascunho ao deploy)
PHP Conference Brasil 2011 - Desenvolvendo Seguro (do rascunho ao deploy)Erick Belluci Tedeschi
 
iMasters Intercon Dev WordPress - Segurança em WordPress
iMasters Intercon Dev WordPress - Segurança em WordPressiMasters Intercon Dev WordPress - Segurança em WordPress
iMasters Intercon Dev WordPress - Segurança em WordPressErick Belluci Tedeschi
 
Applying Security Controls on REST APIs
Applying Security Controls on REST APIsApplying Security Controls on REST APIs
Applying Security Controls on REST APIsErick Belluci Tedeschi
 
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEBFIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEBErick Belluci Tedeschi
 

Destacado (6)

7Masters - Two Step Verification
7Masters - Two Step Verification7Masters - Two Step Verification
7Masters - Two Step Verification
 
"Hacking+PHP"
"Hacking+PHP""Hacking+PHP"
"Hacking+PHP"
 
PHP Conference Brasil 2011 - Desenvolvendo Seguro (do rascunho ao deploy)
PHP Conference Brasil 2011 - Desenvolvendo Seguro (do rascunho ao deploy)PHP Conference Brasil 2011 - Desenvolvendo Seguro (do rascunho ao deploy)
PHP Conference Brasil 2011 - Desenvolvendo Seguro (do rascunho ao deploy)
 
iMasters Intercon Dev WordPress - Segurança em WordPress
iMasters Intercon Dev WordPress - Segurança em WordPressiMasters Intercon Dev WordPress - Segurança em WordPress
iMasters Intercon Dev WordPress - Segurança em WordPress
 
Applying Security Controls on REST APIs
Applying Security Controls on REST APIsApplying Security Controls on REST APIs
Applying Security Controls on REST APIs
 
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEBFIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
 

Similar a Desenvolvimento de Extensões PECL

Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias WebRildo Pragana
 
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla Furquim
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla FurquimDesenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla Furquim
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla FurquimTchelinux
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3Flávio Lisboa
 
Possibilidades com python
Possibilidades com pythonPossibilidades com python
Possibilidades com pythonUFPA
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Israel Messias
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Jaime Neto
 
Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxThiago Paes
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPelliando dias
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIComunidade NetPonto
 
Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009silva.edgar
 

Similar a Desenvolvimento de Extensões PECL (20)

Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias Web
 
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla Furquim
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla FurquimDesenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla Furquim
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla Furquim
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Doctrine for dummies
Doctrine for dummiesDoctrine for dummies
Doctrine for dummies
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
Palestra2009
Palestra2009Palestra2009
Palestra2009
 
Possibilidades com python
Possibilidades com pythonPossibilidades com python
Possibilidades com python
 
Consegi 2011: Puppet
Consegi 2011: PuppetConsegi 2011: Puppet
Consegi 2011: Puppet
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
 
Zephir
ZephirZephir
Zephir
 
Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com Nginx
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHP
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web API
 
Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009
 

Desenvolvimento de Extensões PECL

  • 1. 1ª PHP UnConference Brasil Desenvolvimento de extensões PECL Erick Belluci Tedeschi - @ericktedeschi    
  • 3. PHP Page Life Cycle Ciclo de vida de uma requisição de página (script) PHP originada de um WebServer: Processo do Apache Inicia WebServer LoadModule php5_module Carrega módulo do PHP mysql,sockets,curl,curses,etc... PHP Carrega suas extensões (built­in e php.ini) MINIT Carrega constantes, ini entries, resources, etc... RINIT Inicializa autoglobals, symbol table, log, etc... Script Execution RSHUTDOWN Libera memória... MSHUTDOWN Libera memória... (ini entries, resources, etc...)    
  • 4. Estrutura ZVAL typedef struct _zval_struct { typedef union _zvalue_value { zvalue_value value; long lval; // Long,Bool,Resource zend_uint refcont; double dval; // Double zend_uchar type; struct { zend_uchar is_ref; char *val; } zval; long length; } str; // String HashTable *ht; // Array zend_object_value obj; // Object } zvalue_value; IS_NULL IS_BOOL IS_LONG IS_DOUBLE IS_STRING IS_ARRAY IS_OBJECT IS_RESOURCE    
  • 5. Ambiente de Desenvolvimento (*nix) Requisitos necessários para compilar extensões: Ubuntu: m4 e build­essential ­ autoconf 2.13 (http://ftp.gnu.org/gnu/autoconf) ­ automake 1.4 (http://ftp.gnu.org/gnu/automake) ­ libtool 1.4.x+ (except 1.4.2) (http://ftp.gnu.org/gnu/libtool) ­ bison 1.28 (http://ftp.gnu.org/gnu/bison) ­ flex 2.5.4 (http://prdownloads.sourceforge.net/flex/flex­2.5.4a.tar.gz?download) ­ re2c 0.13.4+ (http://re2c.org) * Caso a extensão faça uso de alguma bilioteca externa, a mesma deve ser instalada: Libcurses­dev, libxml­dev, etc...    
  • 7. Esqueleto da Extensão Estrutura interna do código fonte de uma extensão: cabeçalho Licença, Créditos, Descrição, etc... includes API e bibliotecas externas funções Funções existentes na extensão MINFO Informações do módulo (phpinfo()) MINIT Tarefas a serem executadas ao carregar a extensão MSHUTDOWN Libera memórias das tarefas executadas no MINIT RINIT Tarefas a serem executadas na requisição do script PHP RSUTDOWN Libera memória das tarefas executadas no RINIT function_entry Registra as funções para a extensão module_entry Entrada do módulo no PHP    
  • 8. Esqueleto da Extensão - Cabeçalho /* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2008 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Fulano de Tal < fulano at tal dot com > | +----------------------------------------------------------------------+ */ /* $Id: header 252479 2008-02-07 19:39:50Z iliaa $ */    
  • 9. Esqueleto da Extensão - Includes /* Créditos … */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "php_ssp.h"    
  • 10. Esqueleto da Extensão - Funções // Exemplo de funções definidas para o “user space”. PHP_FUNCTION(mysql_connect) { /* código da função */ } PHP_FUNCTION(mysql_close) { /* código da função */ } // Exemplo da implementação de classes para o “user space”. PHP_METHOD(Cachorro, __construct) { /* código do construtor */ } PHP_METHOD(Cachorro, latir) { /* código do método */ }   
  • 11. Esqueleto da Extensão - MINFO static PHP_MINFO_FUNCTION(libxml) { php_info_print_table_start(); php_info_print_table_row(2, "libXML support", "active"); php_info_print_table_row(2, "libXML Compiled Version", LIBXML_DOTTED_VERSION); php_info_print_table_row(2, "libXML Loaded Version", (char *)xmlParserVersion); php_info_print_table_row(2, "libXML streams", "enabled"); php_info_print_table_end(); }    
  • 12. Esqueleto da Extensão - MINIT/MSHUTDOWN PHP_MINIT_FUNCTION(extname) { REGISTER_INI_ENTRIES(); return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(extname) { UNREGISTER_INI_ENTRIES(); return SUCCESS; }    
  • 13. Esqueleto da Extensão - RINIT/RSHUTDOWN PHP_RINIT_FUNCTION(extname) { return SUCCESS; } PHP_RSHUTDOWN_FUNCTION(extname) { return SUCCESS; }    
  • 14. Esqueleto da Extensão – Function Entry const zend_function_entry extname_functions[] = { PHP_FE(extname_abrir, NULL) PHP_FE(extname_colar, NULL) PHP_FE(extname_recortar, NULL) {NULL, NULL, NULL} /* Must be the last line in extname_functions[] */ };    
  • 15. Esqueleto da Extensão – Module Entry zend_module_entry extname_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif "extname", extname_functions, PHP_MINIT(extname), PHP_MSHUTDOWN(extname), PHP_RINIT(extname), PHP_RSHUTDOWN(extname), PHP_MINFO(extname), #if ZEND_MODULE_API_NO >= 20010901 "0.1", /* Replace with version number for your extension */ #endif STANDARD_MODULE_PROPERTIES };    
  • 16. API ZEND – Manipulação ZVAL Macros para manipulação de ZVAL ZVAL_RESOURCE(zval, 234) ZVAL_NULL(zval) ZVAL_BOOL(zval, 1) ZVAL_LONG(zval, 1234) ZVAL_DOUBLE(zval, 34.5); ZVAL_STRING(zval, “Fulano”, 0) ZVAL_EMPTY_STRING(zval) ZVAL_FALSE(zval) // = ZVAL_BOOL(zval, 0); ZVAL_TRUE(zval) // = ZVAL_BOOL(zval, 1); Macros para manipulação do valor de retorno da função RETVAL_RESOURCE(234) // ZVAL_RESOURCE(return_value, 234) RETVAL_BOOL(1) // = ZVAL_BOOL(return_value, 1) RETVAL_NULL() // = ZVAL_NULL(return_value) RETVAL_LONG(1234) // = ZVAL_LONG(return_value, 1234) RETVAL_DOUBLE(34.5) // = ZVAL_DOUBLE(return_value, 34.5) RETVAL_STRING(“Fulano”, 0) // = ZVAL_STRING(return_value, “Fulano”, 0) RETVAL_FALSE RETVAL_TRUE     etc...
  • 17. API ZEND – Manipulação Arrays PHP_FUNCTION(retorna_array) { array_init(return_value); add_assoc_long(return_value, “Numero”, 1234); add_assoc_bool(return_value, “Verdade”, 1); add_assoc_double(return_value, “Peso”, 27.4); } <?php print_r(retorna_array()); ?> Resultado { [Numero] => 1234 [Verdade] => 1 [Peso] => 27.4 } int add_assoc_long(zval *arg, char *key, long n); int add_assoc_null(zval *arg, char *key); int add_assoc_bool(zval *arg, char *key, int b); int add_assoc_resource(zval *arg, char *key, int r); int add_assoc_double(zval *arg, char *key, double d); int add_assoc_string(zval *arg, char *key, char *str, int dup); int add_assoc_stringl(zval *arg, char *key, char *str, uint len, int dup); int   add_assoc_zval(zval *arg, char *key,   zval *value);
  • 18. API ZEND – Manipulação Arrays Adiciona com um número de índice específico int add_index_long(zval *arg, uint idx, long n); int add_index_null(zval *arg, uint idx); int add_index_bool(zval *arg, uint idx, int b); int add_index_resource(zval *arg, uint idx, int r); int add_index_double(zval *arg, uint idx, double d); int add_index_string(zval *arg, uint idx, char *str, int duplicate); int add_index_stringl(zval *arg, uint idx, char *str, uint length, int duplicate); int add_index_zval(zval *arg, uint idx, zval *value); Adiciona no próximo índice int add_next_index_long(zval *arg, long n); int add_next_index_null(zval *arg); int add_next_index_bool(zval *arg, int b); int add_next_index_resource(zval *arg, int r); int add_next_index_double(zval *arg, double d); int add_next_index_string(zval *arg, char *str, int duplicate); int add_next_index_stringl(zval *arg, char *str, uint length, int duplicate); int add_next_index_zval(zval *arg, zval *value);    
  • 19. Aceitando Parâmetros Syntax: zend_parse_parameters(num_args, “format args”, &arg1, &arg2, ...) l Long long * d double double * b Boolean zend_bool * a array zval ** o Object zval ** O Object zval **, zend_class_Entry * Força ser da classe/tipo determinada s String char **, int * Sempre recebe string e tamanho r resource zval ** z zval zval ** Z zval-ref zval *** | Restante (parte direita) são opcionais ! Proximo parametro retorna NULL se o tipo é IS_NULL    
  • 20. Aceitando Parâmetros – Exemplo 1 PHP_FUNCTION(exemplo1) { /* Definição das variáveis */ char *nome; int nome_len; /* Pegando os parâmetros */ if (zend_parse_parameters(1 TSRMLS_CC, “s”, &nome, &nome_len) == FAILURE) { return; } /* Código da função... */ php_printf(“Nome: %s”, nome); /* Retorno de valor */ RETVAL_NULL; }    
  • 21. Aceitando Parâmetros – Exemplo 2 PHP_FUNCTION(tipovar) { /* Declaração das variáveis */ zval *variavel; /* Recebendo parâmetros */ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &variavel) == FAILURE) { return; } /* Código da função */ switch (Z_TYPE_P(variavel)) { case IS_LONG: php_printf("Inteiron"); break; case IS_ARRAY: php_printf("Matrizn"); break; default: php_printf("Tipo desconhecidon"); break; } /* Retorno de valor */ }    
  • 22. Retornando Valor – Exemplo 3 PHP_FUNCTION(numeroCao) { /* Declaração das variáveis */ /* Recebendo parâmetros */ /* Código da função */ /* Retorno de valor */ RETVAL_LONG(666); }    
  • 24. die() Erick Belluci Tedeschi ­ @ericktedeschi htp://itatux.blogspot.com http://oerick.com http://www.linkedin.com/in/ericktedeschi