[PHP] Desarrollo de
extensiones en c/c++
CODEMOTION Madrid 2013
Un poquito de SPAM
Un poquito de SPAM
Daniel González
@desarrolla2
Un poquito de SPAM

@phpmad
Objetivo
Objetivo
Introducción
teórica
Desarrollo de extensiones en C/C++
¿Que es PHP?
“PHP is a serverside scripting
language designed
for web
development but
also used as a
general-purpose
programming
language”.
-wikipedia
¿Que es una extensión?
“An extension in PHP is in
fact a module providing
some functionality to the
PHP Engine.” - Shahar
Evron
¿Para que extender PHP?
¿Para que extender PHP?
¿Para que extender PHP?
¿Por que no hacerlo?
¿Por que no hacerlo?

“spaPHPetti code”
¿Por que no hacerlo?
¿Por que no hacerlo?
¿Por que no hacerlo?
¿Por que no hacerlo?
strtoupper
PHP_FUNCTION(strtoupper)
{
char *arg;
int arglen;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg,
&arglen) == FAILURE) {
return;
}
arg = estrndup(arg, arglen);
php_strtoupper(arg, arglen);
RETURN_STRINGL(arg, arglen, 0);
}
strtoupper
PHPAPI char *php_strtoupper(char *s, size_t len)
{
unsigned char *c, *e;
c = (unsigned char *)s;
e = (unsigned char *)c+len;
while (c < e) {
*c = toupper(*c);
c++;
}
return s;
}
strtoupper
<?php
echo "Testing strtoupper: ";
$test = "abCdEfg";
$upper = strtoupper($test);
if ($upper == "ABCDEFG") {
echo("passedn");
} else {
echo("failed!n");
}
?>
strtoupper
--TEST-Test strtoupper on non-ASCII characters
--SKIPIF-<?php
if (!setlocale(LC_CTYPE, "de_DE", "de", "german", "ge", "de_DE.ISO8859-1", "ISO8859-1")) {
die("skip locale needed for this test is not supported on this platform");
}
?>
--FILE-<?php
$chars = "�";
// Not sure which is most portable. BSD's answer to this one. A small array based on PHP_OS
should
// cover a majority of systems and makes the problem of locales transparent for the end user.
setlocale(LC_CTYPE, "de_DE", "de", "german", "ge", "de_DE.ISO8859-1", "ISO8859-1");
echo strtoupper($chars)."n";
?>
--EXPECT--
¿Por que no hacerlo?
github.com/php/php-src
repositorio git desde 1999
140 committers
50,000 commits
~ 10 committers / año
¿Por que no hacerlo?
github.com/symfony/symfony
repositorio git desde 2010
770 committers
15,000 commits
~ 250 committers / año
¿Por que no hacerlo?
¿Que necesito?
código fuente de php
entorno de compilación
conocimientos de c/c++
conocimientos de php ( bajo el capó )
Bajo el capó
Application ( apache, cli, nginx, php-fpm )

SAPI

PHP API
PHP Core
Extensions

Zend API

Zend Extension API

Zend Engine
PHP Architecture
Bajo el capó
SAPI Startup

PHP Startup

Engine
Init

Module Initialization and configuration

MINIT
Signals

Sandboxing

Fork

Child

Exit

Fork

Child

Exit

RINIT
Signals

RSHUTD
OWN
Bajo el capó

PHP Code

LEXER

Expressions

PARSER /
COMPILER

OP Code
Ejemplos
prácticos
Desarrollo de extensiones en C/C++
RelaxingCup();
Desarrollo de extensiones en C/C++
PrimeNumbers
->factorize(1000,10000);
Desarrollo de extensiones en C/C++
afile_put_contents();
Desarrollo de extensiones en C/C++
afile_put_contents
Module Initialization and configuration

Child

Exit

MINIT
Signals

fopen

RINIT
Signals

RSHUTD
OWN

fwrite
fclose
Para terminar ...
Desarrollo de extensiones en C/C++
Conclusiones
Referencias

https://wiki.php.net/internals/references
¿Preguntas?
Desarrollo de extensiones en C/C++
¡Gracias!
Desarrollo de extensiones en C/C++

Codemotion Madrid 2013 - [PHP] desarrollo de extensiones en c c++