Beruflich Dokumente
Kultur Dokumente
Hello World
- php, pear, pecl, linux, plesk, puppet... - pecl.php.net/augeas - spamassassin php api - api api api api api api api api - wordpress
pecl
- php extension community library - dizem que se l pickle - ou no brasil: p (ou ) c le
- performance - esconder o cdigo do cliente - acessar funes de uma biblioteca C - modificar o comportamento do PHP
"It is a glue language that glues the web server to all the interesting backend libraries available out there." * Rasmus Lerdorf
* http://www.urgig.com/int/0107_rl_a_int.html
zend extensions
- trabalham na camada da ZendEngine - bytecode compiler - opcode handlers - exemplos: xdebug, test_handlers, ZendGuardLoader
zend extensions
php extensions
- php.net/downloads - 5.3.3 - extraia p/ algum diretrio - em windows, no use caminhos que contenham espaos - cd php-src/ext
$ $ $ $ $
extension=minhaextensao.so no php.ini
- to chato que foi preciso criar um script pra isso - php-src/ext/ext_skel - php-src/ext/ext_skel_win32.php
* precisa de CygWin instalado * gera o arquivo .dsp do VisualStudio
minhaextensao.c module entry essa estrutura vai armazenar todas as informaes sobre sua extenso
minhaextensao.c - functions
Sim, a ltima linha tem sempre que ser {NULL, NULL, NULL}, isso indica para a Zend Engine que a lista de funes acabou. Internamente, confirm_minha_extensao_compiled ser chamada de zif_confirm_minhaextensao_compiled. (zif = zend internal function)
minhaextensao.c - functions
E essa a funo!
php_minhaextensao.h
#ifdef ZTS #include "TSRM.h" #endif
config.m4
config.m4
Se a sua extenso usa alguma biblioteca externa
config.m4
config.m4
smbolos de uma biblioteca so todos os elementos visveis ao seu usurio, podem ser classes, funes, estruturas de dados, etc...
phpinfo(); - PHP_MINFO_FUNCTION
phpinfo(); - PHP_MINFO_FUNCTION
phpinfo(); - PHP_MINFO_FUNCTION
void void void void void void void void void ...
php_info_print_table_start(void) php_info_print_table_end(void) php_info_print_table_header(int cols, ...) php_info_print_table_colspan_header(int cols, char *header) php_info_print_table_row(int cols, ...) php_info_print_table_row_ex(int cols, char *class, ...) php_info_print_box_start(int flag) php_info_print_box_end() php_info_print_hr(void)
no abuse da criatividade
PHP_MINIT_FUNCTION
- executado uma vez para cada processo - cli/cgi/multithread sapi => executa apenas uma vez (apache2-worker) - sempre que houver fork(); inicia novamente o ambiente (mod_php no apache2-prefork) - registrar classes, constantes, configuraes php.ini...
PHP_MINIT_FUNCTION
PHP_RINIT_FUNCTION
- executado a cada requisio feita ao script - evite inicializar muita coisa aqui, economize memria
.ini settings
- primeiro voc declara as configs - inicializa em PHP_MINIT_FUNCTION - destri em PHP_MINIT_SHUTDOWN - exibe em PHP_MINFO_FUNCTION
/* VALORES ORIGINAIS const char *strval = long lval = double dval = zend_bool bval =
/* VALORES ATUAIS */ long lval = INI_INT("minhaextensao.config_int"); double dval = INI_FLT("minhaextensao.config_float"); zend_bool bval = INI_BOOL("minhaextensao.config_bool");
prazer, ZVAL.
struct { union { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; } value; zend_uint refcount; zend_uchar type; zend_uchar is_ref; } zval;
arrays
function minhaextensao_me_da_um_array() { $meu_primeiro_array = array(); $retorno = array(); $meu_primeiro_array[] = null; $meu_primeiro_array[] = ueeeba!!; $retorno[] = $meu_primeiro_array; } return $retorno;
$ php -r 'var_dump(minhaextensao_me_da_um_array());' array(1) { [0]=> array(2) { [0]=> NULL [1]=> string(8) "ueeeba!!" } }
Fonte: http://devzone.zend.com/node/view/id/1022#Heading5
zval *meuzval; ZVAL_NULL(meuzval); ZVAL_LONG(meuzval, 1408); /* bool usa o mesmo espao de long */ ZVAL_BOOL(meuzval, 1); ZVAL_STRING(meuzval, tchananan, 0);
- j vimos que existe um tal de return_value em algum lugar - podemos manipular seu valor e deixar que o php o retorne - ou podemos usar alguns atalhos
RETURN_NULL(); RETURN_STRING(bola, 0); RETURN_TRUE; RETURN_FALSE; RETURN_DOUBLE(3.14); RETURN_LONG(1408); e assim por diante...
zend_parse_parameters
Fonte: http://devzone.zend.com/node/view/id/1022
resources
resources
- permite lidar com estruturas mais complexas em C e pass-las de um lado para o outro; - inicializados em PHP_MINIT_FUNCTION; - usado em extenses procedurais;
resources inicializao/destruio
/* isso est no topo do minhaextensao.c */ static int le_minhaextensao; static void php_minhaextensao_resource_destrutor( zend_rsrc_list_entry *rsrc TSRMLS_DC) { FILE *fp = (FILE *) rsrc->ptr; fclose(fp); } PHP_MINIT_FUNCTION(minhaextensao) { le_minhaextensao = zend_register_list_destructors_ex( php_minhaextensao_resource_destrutor, NULL, "Resource da Minha Extensao", module_number); } return SUCCESS;
$resource = curl_init(); $result = minhaextensao_resource_check($resource); var_dump($result); // PHP Warning: minhaextensao_resource_check(): supplied resource is not a valid Resource da Minha Extensao resource
orientao a objetos
PHP_MINIT_FUNCTION(augeas) { zend_class_entry ce; /* Register Augeas class */ INIT_CLASS_ENTRY(ce, "Augeas", augeas_methods); augeas_ce_Augeas = zend_register_internal_class(&ce TSRMLS_CC); return SUCCESS; }
/* Register AugeasException class (inherits Exception) */ INIT_CLASS_ENTRY(ce, "AugeasException", NULL); augeas_ce_AugeasException = zend_register_internal_class_ex( &ce_exception, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_DC);
mas... e os mtodos?
estamos de volta
dvidas?
obrigado =)