SlideShare una empresa de Scribd logo
1 de 13
Descargar para leer sin conexión
Variables en PHPVariables en PHP
Cómo funcionan las variables internamente en PHP y el recolector de basura?Cómo funcionan las variables internamente en PHP y el recolector de basura?
IntroducciónIntroducción
En PHP las variables se representan con un signo de dólar seguido por el nombre de la variable.
El nombre de la variable es sensible a minúsculas y mayúsculas. El tipo de las variables es
decidido en tiempo de ejecución por PHP dependiendo del contexto en el que se emplea dicha
variable.
Estructura de una variable en PHPEstructura de una variable en PHP
Contenedores zval (ZendValue)
value: representa el valor de la variable
refcount: es un integer que indica cuántos símbolos
apuntan a este zval
type: indica el tipo de variable
_isref: es un integer que representa un valor booleano
si ha sido afectado por una referencia
struct _zval_struct {
zvalue_value value;
zend_uint refcount__gc;
zend_uchar type;
zend_uchar is_ref__gc;
};
El tipo de contenedor que se crea depende del contenido de la variable.
Ejemplos:
Esta salida se puede lograr con el comando xdebug_debug_zval
$test = ‘value'; test: (refcount=1, is_ref=0), string ‘value' (length=5)
$test = array(‘key1' => ‘value', 1); test: (refcount=1, is_ref=0), array (size=2)
'key1' => (refcount=1, is_ref=0),string ‘value' (length=5)
0 => (refcount=1, is_ref=0),int 1
class Test{
public $prop = 1;
private $prop1 = ‘val' ;
}
$obj = new Test();
obj: (refcount=1, is_ref=0), object(Test)[1]
public ‘prop' => (refcount=2, is_ref=0),int 1
private ‘prop1' => (refcount=2, is_ref=0), string ‘value'
(length=5)
Solo a los contenidos del arreglo se les crean zval.
Los array y los objetos son tratados como tipos compuestos.
Cómo PHP maneja las variablesCómo PHP maneja las variables
Que pasa si le asignamos el contenido de una variable a otra.
$var1 = 10;
$var2 = $var1;
El refcount aumenta en función del número de símbolos que apuntan a un contenedor,
en este caso 2, y es la clave para la administración de la memoria en las variables PHP.
var1: (refcount=2, is_ref=0),int 10
var2: (refcount=2, is_ref=0),int 10
Copia en escrituraCopia en escritura
Copy On Write (COW) en ingles es una forma de ahorrar memoria. El sistema (PHP) copia o
mueve a una nueva región de la memoria cuando modificas un símbolo que estaba apuntando
a un zval.
Veamos una serie de ejemplos.
$x = "vals";
$x1 = $x;
x: (refcount=2, is_ref=0),string ‘vals' (length=4)
x1: (refcount=2, is_ref=0),string 'vals' (length=4)
$x = 12; x: (refcount=1, is_ref=0),int 12
x1: (refcount=1, is_ref=0),string 'vals ' (length=4)
Si se vuelve a asignar el mismo valor a $x se crea un nuevo zval.
Los zval solo se reutilizan cuando se asigna una variable a otra.
$x = "vals"; x: (refcount=1, is_ref=0),string ‘vals' (length=4)
x1: (refcount=1, is_ref=0),string 'vals ' (length=4)
$x = array("s" => “a", 1=>2); x: (refcount=1, is_ref=0),
array (size=2)
's': (refcount=1, is_ref=0),string 'a' (length=1)
1: (refcount=1, is_ref=0),int 2
$x1 = $x["s"]; x: (refcount=1, is_ref=0),
array (size=2)
's': (refcount=2, is_ref=0),string 'a' (length=1)
1: (refcount=1, is_ref=0),int 2
'x1': (refcount=2, is_ref=0),string 'a' (length=1)
unset($x["s"]); x: (refcount=1, is_ref=0),
array (size=1)
1: (refcount=1, is_ref=0),int 2
'x1': (refcount=1, is_ref=0),string 'a' (length=1)
Los zval son libreados cuando el refcount llega a 0;
ReferenciasReferencias
Cuando adicionamos una variable por referencia & ocurre lo mismo (dos símbolos apuntando
al mismo zval) pero afecta la forma en que la copia en escritura se comporta.
$x = "s"; x: (refcount=1, is_ref=0),string 's' (length=1)
$x1 = &$x; x: (refcount=2, is_ref=1),string 's' (length=1)
x1: (refcount=2, is_ref=1),string 's' (length=1)
Se que cuando is_ref aumenta se ligan los contenedores y el valor se cambio en todos.
$x1 = "a"; x: (refcount=2, is_ref=1),string 'a' (length=1)
x1: (refcount=2, is_ref=1),string 'a' (length=1)
$x = "s"; x: (refcount=1, is_ref=0),string 's' (length=1)
$x1 = &$x; x: (refcount=2, is_ref=1),string 's' (length=1)
x1: (refcount=2, is_ref=1),string 's' (length=1)
Otro ejemplo es cuando se asigna una variable con referencia a otra que no, con el
mismo ejemplo anterior.
$x1 = "a"; x: (refcount=2, is_ref=1),string 'a' (length=1)
x1: (refcount=2, is_ref=1),string 'a' (length=1)
$x2 = $x1; x: (refcount=2, is_ref=1),string 'a' (length=1)
x1: (refcount=2, is_ref=1),string 'a' (length=1)
x2: (refcount=1, is_ref=0),string 'a' (length=1)
PHP tiene que asignarla en un nuevo bloque de memoria, y duplicar el string 'hola', debido a la
referencia anterior. Sin la referencia, sólo habría un contenedor zval, y el refcount sería de 3.
Por esto en ocasiones las referencias no ahorran memoria, es al contrario.
Recolector de BasuraRecolector de Basura
Es un mecanismo que rastrea el uso de objetos y libera la memoria si no se encuentran en
el ámbito actual o todavía no están siendo usados por el programador.
PHP ya empleaba este concepto desde el principio, pero hasta PHP 5.3 no liberaba la memoria
de forma automática. A partir de PHP 5.3 surgió Zend Garbage Collector, o Zend GC. Lo más
importante de esta nueva característica es el tratamiento de las referencias circulares.
Las referencias circulares aparecen con tipos compuestos, como arrays y objetos. Cuando dos tipos
compuestos contienen referencias el uno al otro o cuando un tipo compuesto tiene una referencia
a si mismo, se produce una referencia circular. Así la cosa se complica a la hora de liberar memoria,
y antes de PHP 5.3 no se liberaba correctamente.
Ahora PHP rastrea automáticamente referencias circulares y las libera de vez en cuando.
Si sabes que tu código tiene referencias circulares y quieres forzar a PHP a que las libere,
puedes utilizar la función gc_collect_cycles().
Ejemplo de referencia cíclica:
$x = array(‘a' => ‘val', ‘b' => 1);
$x['c'] = $x['a'];
xdebug_debug_zval('x');
********************************
x: (refcount=1, is_ref=0), array(
'a' => (refcount=2, is_ref=0), string 'val'
'b' => (refcount=1, is_ref=0), int 1
'c' => (refcount=2, is_ref=0), string 'val'
)
Aunque xdebug muestre dos contenedores zval de valor val, se refiere al mismo

Más contenido relacionado

La actualidad más candente

Introducción a C SHARP
Introducción a C SHARPIntroducción a C SHARP
Introducción a C SHARPinfobran
 
IntroduccióN A Visual C
IntroduccióN A Visual CIntroduccióN A Visual C
IntroduccióN A Visual Coswchavez
 
Introducción a Swift
Introducción a SwiftIntroducción a Swift
Introducción a Swiftbetabeers
 
Javascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSON
Javascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSONJavascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSON
Javascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSONDavid Zapateria Besteiro
 
Sesion1 Php Basico
Sesion1 Php BasicoSesion1 Php Basico
Sesion1 Php BasicoHugo Flores
 
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...David Zapateria Besteiro
 
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...David Zapateria Besteiro
 
Php, Variables y Constantes
Php, Variables y ConstantesPhp, Variables y Constantes
Php, Variables y Constantescarpe93
 
Mynor Alexander Hernandez Canuz
Mynor Alexander Hernandez CanuzMynor Alexander Hernandez Canuz
Mynor Alexander Hernandez Canuzguest79d55c9
 
Jyoc java-cap04 vectores (arrays)
Jyoc java-cap04 vectores (arrays)Jyoc java-cap04 vectores (arrays)
Jyoc java-cap04 vectores (arrays)Jyoc X
 

La actualidad más candente (19)

Introducción a C SHARP
Introducción a C SHARPIntroducción a C SHARP
Introducción a C SHARP
 
Tutorial de php
Tutorial de phpTutorial de php
Tutorial de php
 
IntroduccióN A Visual C
IntroduccióN A Visual CIntroduccióN A Visual C
IntroduccióN A Visual C
 
Introducción a Swift
Introducción a SwiftIntroducción a Swift
Introducción a Swift
 
01 el lenguaje Python
01 el lenguaje Python01 el lenguaje Python
01 el lenguaje Python
 
Lenguajec++
Lenguajec++Lenguajec++
Lenguajec++
 
Javascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSON
Javascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSONJavascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSON
Javascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSON
 
Semana 4 Javascript Estructura de Datos y ciclo FOR
Semana 4   Javascript Estructura de Datos y ciclo FORSemana 4   Javascript Estructura de Datos y ciclo FOR
Semana 4 Javascript Estructura de Datos y ciclo FOR
 
Php
PhpPhp
Php
 
Semana 1 Estructuras de Control en Java
Semana 1   Estructuras de Control en JavaSemana 1   Estructuras de Control en Java
Semana 1 Estructuras de Control en Java
 
Sesion1 Php Basico
Sesion1 Php BasicoSesion1 Php Basico
Sesion1 Php Basico
 
2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby
 
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...
 
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...
 
Php, Variables y Constantes
Php, Variables y ConstantesPhp, Variables y Constantes
Php, Variables y Constantes
 
C sharp intro0
C sharp intro0C sharp intro0
C sharp intro0
 
Mynor Alexander Hernandez Canuz
Mynor Alexander Hernandez CanuzMynor Alexander Hernandez Canuz
Mynor Alexander Hernandez Canuz
 
Semana 6 Módulos en Python Entrega 2
Semana 6   Módulos en Python Entrega 2Semana 6   Módulos en Python Entrega 2
Semana 6 Módulos en Python Entrega 2
 
Jyoc java-cap04 vectores (arrays)
Jyoc java-cap04 vectores (arrays)Jyoc java-cap04 vectores (arrays)
Jyoc java-cap04 vectores (arrays)
 

Destacado (13)

It’s Not About Sensor Making, it’s About Sense Making
It’s Not About Sensor Making, it’s About Sense MakingIt’s Not About Sensor Making, it’s About Sense Making
It’s Not About Sensor Making, it’s About Sense Making
 
Pchist 09março
Pchist 09marçoPchist 09março
Pchist 09março
 
Les cancers de l’endomètre : actualités 2016
Les cancers de l’endomètre : actualités 2016Les cancers de l’endomètre : actualités 2016
Les cancers de l’endomètre : actualités 2016
 
Fundamentos
FundamentosFundamentos
Fundamentos
 
la ofimatica y sus usos
la ofimatica y sus usos la ofimatica y sus usos
la ofimatica y sus usos
 
Guia 2 distribucion del agua en la tierra
Guia 2 distribucion del agua en la tierraGuia 2 distribucion del agua en la tierra
Guia 2 distribucion del agua en la tierra
 
Samad Oraee - Best Exercises for Chronic Pain Suffers
Samad Oraee - Best Exercises for Chronic Pain SuffersSamad Oraee - Best Exercises for Chronic Pain Suffers
Samad Oraee - Best Exercises for Chronic Pain Suffers
 
Consenco lgc
Consenco lgcConsenco lgc
Consenco lgc
 
Trabalho 1ª GM
Trabalho 1ª GMTrabalho 1ª GM
Trabalho 1ª GM
 
PAKA Custom Soccer Balls Catalog
PAKA Custom Soccer Balls CatalogPAKA Custom Soccer Balls Catalog
PAKA Custom Soccer Balls Catalog
 
Profesionales 3 d
Profesionales 3 dProfesionales 3 d
Profesionales 3 d
 
의료에서의 인공지능 정리 파일 김치원 V5
의료에서의 인공지능 정리 파일 김치원 V5의료에서의 인공지능 정리 파일 김치원 V5
의료에서의 인공지능 정리 파일 김치원 V5
 
Leadership
LeadershipLeadership
Leadership
 

Similar a Variables en php (20)

Taller completo
Taller completoTaller completo
Taller completo
 
Curso php y_mysql
Curso php y_mysqlCurso php y_mysql
Curso php y_mysql
 
Caracteristicas generales de PHP
Caracteristicas generales de PHPCaracteristicas generales de PHP
Caracteristicas generales de PHP
 
Curso php y_my_sql
Curso php y_my_sqlCurso php y_my_sql
Curso php y_my_sql
 
Php basico
Php basicoPhp basico
Php basico
 
Ensayo de php
Ensayo de phpEnsayo de php
Ensayo de php
 
Ensayo php
Ensayo phpEnsayo php
Ensayo php
 
19 Php. Utilizando Formularios
19 Php. Utilizando Formularios19 Php. Utilizando Formularios
19 Php. Utilizando Formularios
 
Php1
Php1Php1
Php1
 
Php1
Php1Php1
Php1
 
Php1 sesión 6
Php1 sesión 6Php1 sesión 6
Php1 sesión 6
 
PPH MySql - FIEI - UNFV Clase02
PPH MySql - FIEI - UNFV Clase02PPH MySql - FIEI - UNFV Clase02
PPH MySql - FIEI - UNFV Clase02
 
Perl (practical extraction and report language)
Perl (practical extraction and report language)Perl (practical extraction and report language)
Perl (practical extraction and report language)
 
PHP mode on
PHP mode onPHP mode on
PHP mode on
 
Manual basico de PHP
Manual basico de PHPManual basico de PHP
Manual basico de PHP
 
Script Linux
Script LinuxScript Linux
Script Linux
 
Php1
Php1Php1
Php1
 
Php1
Php1Php1
Php1
 
Php1
Php1Php1
Php1
 
Php1
Php1Php1
Php1
 

Último

Buscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webBuscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webDecaunlz
 
12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdfedwinmelgarschlink2
 
Institucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenaInstitucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenadanielaerazok
 
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfNUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfisrael garcia
 
institucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenainstitucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenajuniorcuellargomez
 
COMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfCOMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfOscarBlas6
 
Guia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdfGuia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdflauradbernals
 
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAINSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAdanielaerazok
 

Último (8)

Buscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webBuscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la web
 
12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf
 
Institucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenaInstitucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalena
 
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfNUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
 
institucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenainstitucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalena
 
COMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfCOMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdf
 
Guia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdfGuia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdf
 
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAINSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
 

Variables en php

  • 1. Variables en PHPVariables en PHP Cómo funcionan las variables internamente en PHP y el recolector de basura?Cómo funcionan las variables internamente en PHP y el recolector de basura?
  • 2. IntroducciónIntroducción En PHP las variables se representan con un signo de dólar seguido por el nombre de la variable. El nombre de la variable es sensible a minúsculas y mayúsculas. El tipo de las variables es decidido en tiempo de ejecución por PHP dependiendo del contexto en el que se emplea dicha variable.
  • 3. Estructura de una variable en PHPEstructura de una variable en PHP Contenedores zval (ZendValue) value: representa el valor de la variable refcount: es un integer que indica cuántos símbolos apuntan a este zval type: indica el tipo de variable _isref: es un integer que representa un valor booleano si ha sido afectado por una referencia struct _zval_struct { zvalue_value value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc; }; El tipo de contenedor que se crea depende del contenido de la variable.
  • 4. Ejemplos: Esta salida se puede lograr con el comando xdebug_debug_zval $test = ‘value'; test: (refcount=1, is_ref=0), string ‘value' (length=5) $test = array(‘key1' => ‘value', 1); test: (refcount=1, is_ref=0), array (size=2) 'key1' => (refcount=1, is_ref=0),string ‘value' (length=5) 0 => (refcount=1, is_ref=0),int 1 class Test{ public $prop = 1; private $prop1 = ‘val' ; } $obj = new Test(); obj: (refcount=1, is_ref=0), object(Test)[1] public ‘prop' => (refcount=2, is_ref=0),int 1 private ‘prop1' => (refcount=2, is_ref=0), string ‘value' (length=5) Solo a los contenidos del arreglo se les crean zval. Los array y los objetos son tratados como tipos compuestos.
  • 5. Cómo PHP maneja las variablesCómo PHP maneja las variables Que pasa si le asignamos el contenido de una variable a otra. $var1 = 10; $var2 = $var1; El refcount aumenta en función del número de símbolos que apuntan a un contenedor, en este caso 2, y es la clave para la administración de la memoria en las variables PHP. var1: (refcount=2, is_ref=0),int 10 var2: (refcount=2, is_ref=0),int 10
  • 6. Copia en escrituraCopia en escritura Copy On Write (COW) en ingles es una forma de ahorrar memoria. El sistema (PHP) copia o mueve a una nueva región de la memoria cuando modificas un símbolo que estaba apuntando a un zval. Veamos una serie de ejemplos.
  • 7. $x = "vals"; $x1 = $x; x: (refcount=2, is_ref=0),string ‘vals' (length=4) x1: (refcount=2, is_ref=0),string 'vals' (length=4) $x = 12; x: (refcount=1, is_ref=0),int 12 x1: (refcount=1, is_ref=0),string 'vals ' (length=4) Si se vuelve a asignar el mismo valor a $x se crea un nuevo zval. Los zval solo se reutilizan cuando se asigna una variable a otra. $x = "vals"; x: (refcount=1, is_ref=0),string ‘vals' (length=4) x1: (refcount=1, is_ref=0),string 'vals ' (length=4)
  • 8. $x = array("s" => “a", 1=>2); x: (refcount=1, is_ref=0), array (size=2) 's': (refcount=1, is_ref=0),string 'a' (length=1) 1: (refcount=1, is_ref=0),int 2 $x1 = $x["s"]; x: (refcount=1, is_ref=0), array (size=2) 's': (refcount=2, is_ref=0),string 'a' (length=1) 1: (refcount=1, is_ref=0),int 2 'x1': (refcount=2, is_ref=0),string 'a' (length=1) unset($x["s"]); x: (refcount=1, is_ref=0), array (size=1) 1: (refcount=1, is_ref=0),int 2 'x1': (refcount=1, is_ref=0),string 'a' (length=1) Los zval son libreados cuando el refcount llega a 0;
  • 9. ReferenciasReferencias Cuando adicionamos una variable por referencia & ocurre lo mismo (dos símbolos apuntando al mismo zval) pero afecta la forma en que la copia en escritura se comporta.
  • 10. $x = "s"; x: (refcount=1, is_ref=0),string 's' (length=1) $x1 = &$x; x: (refcount=2, is_ref=1),string 's' (length=1) x1: (refcount=2, is_ref=1),string 's' (length=1) Se que cuando is_ref aumenta se ligan los contenedores y el valor se cambio en todos. $x1 = "a"; x: (refcount=2, is_ref=1),string 'a' (length=1) x1: (refcount=2, is_ref=1),string 'a' (length=1)
  • 11. $x = "s"; x: (refcount=1, is_ref=0),string 's' (length=1) $x1 = &$x; x: (refcount=2, is_ref=1),string 's' (length=1) x1: (refcount=2, is_ref=1),string 's' (length=1) Otro ejemplo es cuando se asigna una variable con referencia a otra que no, con el mismo ejemplo anterior. $x1 = "a"; x: (refcount=2, is_ref=1),string 'a' (length=1) x1: (refcount=2, is_ref=1),string 'a' (length=1) $x2 = $x1; x: (refcount=2, is_ref=1),string 'a' (length=1) x1: (refcount=2, is_ref=1),string 'a' (length=1) x2: (refcount=1, is_ref=0),string 'a' (length=1) PHP tiene que asignarla en un nuevo bloque de memoria, y duplicar el string 'hola', debido a la referencia anterior. Sin la referencia, sólo habría un contenedor zval, y el refcount sería de 3. Por esto en ocasiones las referencias no ahorran memoria, es al contrario.
  • 12. Recolector de BasuraRecolector de Basura Es un mecanismo que rastrea el uso de objetos y libera la memoria si no se encuentran en el ámbito actual o todavía no están siendo usados por el programador. PHP ya empleaba este concepto desde el principio, pero hasta PHP 5.3 no liberaba la memoria de forma automática. A partir de PHP 5.3 surgió Zend Garbage Collector, o Zend GC. Lo más importante de esta nueva característica es el tratamiento de las referencias circulares. Las referencias circulares aparecen con tipos compuestos, como arrays y objetos. Cuando dos tipos compuestos contienen referencias el uno al otro o cuando un tipo compuesto tiene una referencia a si mismo, se produce una referencia circular. Así la cosa se complica a la hora de liberar memoria, y antes de PHP 5.3 no se liberaba correctamente. Ahora PHP rastrea automáticamente referencias circulares y las libera de vez en cuando. Si sabes que tu código tiene referencias circulares y quieres forzar a PHP a que las libere, puedes utilizar la función gc_collect_cycles().
  • 13. Ejemplo de referencia cíclica: $x = array(‘a' => ‘val', ‘b' => 1); $x['c'] = $x['a']; xdebug_debug_zval('x'); ******************************** x: (refcount=1, is_ref=0), array( 'a' => (refcount=2, is_ref=0), string 'val' 'b' => (refcount=1, is_ref=0), int 1 'c' => (refcount=2, is_ref=0), string 'val' ) Aunque xdebug muestre dos contenedores zval de valor val, se refiere al mismo