1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-23 23:12:09 +01:00

update revision EN misc (#219)

This commit is contained in:
Philippe DELENTE
2025-05-03 21:11:42 +02:00
committed by GitHub
parent aa5fa89dac
commit 0742bdd75b
41 changed files with 5277 additions and 5036 deletions

View File

@@ -1,22 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 38f1ef412f5670f46cad5e601c74792b72fc91dc Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 4642b715f374b4220884fa110b6529ac948799b5 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="migration74.deprecated">
<title>Características obsoletas</title>
<title>Funcionalidades obsoletas</title>
<sect2 xml:id="migration74.deprecated.core">
<title>Núcleo PHP</title>
<title>Núcleo de PHP</title>
<sect3 xml:id="migration74.deprecated.core.nested-ternary">
<title>Operadores ternarios anidados sin paréntesis explícitos</title>
<para>
Las operaciones ternarias anidadas deben utilizar explícitamente paréntesis
para dictar el orden de las operaciones. Anteriormente, cuando se usaba
sin paréntesis, la asociatividad izquierda no resultaría
en el comportamiento esperado en la mayoría de los casos.
Los operadores ternarios anidados deben utilizar explícitamente paréntesis para dictar el orden de las operaciones. Anteriormente, cuando se utilizaba sin paréntesis, la asociatividad a la izquierda no resultaba en el comportamiento esperado para la mayoría de los casos.
<informalexample>
<programlisting role="php">
<![CDATA[
@@ -25,6 +22,16 @@
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Los paréntesis no son <emphasis>necesarios</emphasis> al anidar en el operando del medio ya que esto siempre es sin ambigüedad y no se ve afectado por la asociatividad:
<informalexample>
<programlisting role="php">
<![CDATA[
1 ? 2 ? 3 : 4 : 5 // ok
]]>
</programlisting>
</informalexample>
@@ -32,45 +39,37 @@
</sect3>
<sect3 xml:id="migration74.deprecated.core.array-string-access-curly-brace">
<title>Acceso al desplazamiento de Array y string usando llaves</title>
<title>Acceso a la posición de array y string utilizando llaves</title>
<para>
La sintaxis de acceso de desplazamiento en array y string con llaves es
obsoleta. Use <literal>$var[$idx]</literal> en vez de
<literal>$var{$idx}</literal>.
La sintaxis para acceder a la posición de &array; y &string; con llaves es obsoleta. Utilizar <literal>$var[$idx]</literal> en lugar de <literal>$var{$idx}</literal>.
</para>
</sect3>
<sect3 xml:id="migration74.deprecated.core.real">
<title>La llamada (real) y la función <function>is_real</function></title>
<title>El transtipado (real) y la función <function>is_real</function></title>
<para>
La llamada <literal>(real)</literal> es obsoleta,
use <literal>(float)</literal> en su lugar.
El transtipado <literal>(real)</literal> es obsoleto, utilizar <literal>(float)</literal> en su lugar.
</para>
<para>
La función <function>is_real</function> es también obsoleta,
use <function>is_float</function> en su lugar.
La función <function>is_real</function> también es obsoleta, utilizar <function>is_float</function> en su lugar.
</para>
</sect3>
<sect3 xml:id="migration74.deprecated.core.unbind-this">
<title>Desencadenando <literal>$this</literal> cuando <literal>$this</literal> es usado</title>
<title>Desligar <literal>$this</literal> cuando <literal>$this</literal> es utilizado</title>
<para>
Desencadenando <literal>$this</literal> de un cierre no estático
que use <literal>$this</literal> es obsoleto.
Desligar <literal>$this</literal> de una clausura no estática que utiliza <literal>$this</literal> es obsoleto.
</para>
</sect3>
<sect3 xml:id="migration74.deprecated.core.parent">
<title>palabra clave <literal>parent</literal> sin clase de padre</title>
<title>Palabra clave <literal>parent</literal> sin clase padre</title>
<para>
Usar <literal>parent</literal> dentro de una clase sin un padre
es obsoleto, y lanzará un error de compilación en el futuro.
Actualmente sólo se generará un error si/cuando el padre es
accedido en tiempo de ejecución.
El uso de <literal>parent</literal> dentro de una clase sin padre es obsoleto, y emitirá un error en la compilación en el futuro. Actualmente, solo se generará un error si/cuando un padre es accedido durante la ejecución.
</para>
</sect3>
@@ -78,9 +77,7 @@
<title>Opción INI allow_url_include</title>
<para>
La directiva ini <link linkend="ini.allow-url-include">allow_url_include</link>
es obsoleta. Habilitar esta generará
un aviso de depreciación en el arranque.
La directiva INI <link linkend="ini.allow-url-include">allow_url_include</link> es obsoleta. Activarla generará un aviso de obsolescencia al inicio.
</para>
</sect3>
@@ -88,21 +85,15 @@
<title>Caracteres inválidos en las funciones de conversión de base</title>
<para>
Pasar caracteres inválidos a <function>base_convert</function>,
<function>bindec</function>, <function>octdec</function> y
<function>hexdec</function> generará ahora un aviso de depreciación.
El resultado se seguirá calculando como si los caracteres inválidos no existieran.
Liderando y siguiendo el espacio blanco, así como prefijos de tipo 0x (dependiendo de la base)
siguen estando permitidos.
Pasar caracteres inválidos a <function>base_convert</function>, <function>bindec</function>, <function>octdec</function> y <function>hexdec</function> generará ahora un aviso de obsolescencia. El resultado siempre se calculará como si los caracteres inválidos no existieran. Los caracteres de espaciado en blanco, así como los prefijos de tipo 0x (en función de la base) continúan siendo aceptados.
</para>
</sect3>
<sect3 xml:id="migration74.deprecated.core.array-key-exists-objects">
<title>Usar <function>array_key_exists</function> en objetos</title>
<title>El uso de <function>array_key_exists</function> en objetos</title>
<para>
Usar <function>array_key_exists</function> en objetos es obsoleto.
En lugar de eso, debe usar <function>isset</function> o <function>property_exists</function>.
El uso de <function>array_key_exists</function> en objetos es obsoleto. En su lugar, <function>isset</function> o <function>property_exists</function> deberían ser utilizados.
</para>
</sect3>
@@ -110,42 +101,36 @@
<title>Funciones de comillas mágicas</title>
<para>
Las funciones <function>get_magic_quotes_gpc</function> y <function>get_magic_quotes_runtime</function>
son obsoletas. Estas siempre devolverán &false;.
Las funciones <function>get_magic_quotes_gpc</function> y <function>get_magic_quotes_runtime</function> son obsoletas. Siempre devuelven &false;.
</para>
</sect3>
<sect3 xml:id="migration74.deprecated.core.hebrevc">
<title>función <function>hebrevc</function></title>
<title>Función <function>hebrevc</function></title>
<para>
La función <function>hebrevc</function> es obsoleta.
Esta puede ser reemplazada con <literal>nl2br(hebrev($str))</literal> o,
preferiblemente, el uso del soporte RTL de Unicode.
La función <function>hebrevc</function> es obsoleta. Puede ser reemplazada por <literal>nl2br(hebrev($str))</literal> o, preferiblemente, utilizando el soporte Unicode RTL (Derecha a Izquierda).
</para>
</sect3>
<sect3 xml:id="migration74.deprecated.core.convert-cyr-string">
<title>función <function>convert_cyr_string</function></title>
<title>Función <function>convert_cyr_string</function></title>
<para>
La función <function>convert_cyr_string</function> es obsoleta.
Esta puede ser reemplazada con <function>mb_convert_string</function>,
<function>iconv</function> o <classname>UConverter</classname>.
La función <function>convert_cyr_string</function> es obsoleta. Puede ser reemplazada por una de <function>mb_convert_string</function>, <function>iconv</function> o <classname>UConverter</classname>.
</para>
</sect3>
<sect3 xml:id="migration74.deprecated.core.money-format">
<title>función <function>money_format</function></title>
<title>Función <function>money_format</function></title>
<para>
La función <function>money_format</function> es obsoleta.
Esta puede ser reemplazada con la funcionalidad intl <classname>NumberFormatter</classname>.
La función <function>money_format</function> es obsoleta. Puede ser reemplazada por la funcionalidad intl <classname>NumberFormatter</classname>.
</para>
</sect3>
<sect3 xml:id="migration74.deprecated.core.ezmlm-hash">
<title>función <function>ezmlm_hash</function></title>
<title>Función <function>ezmlm_hash</function></title>
<para>
La función <function>ezmlm_hash</function> es obsoleta.
@@ -153,21 +138,18 @@
</sect3>
<sect3 xml:id="migration74.deprecated.core.restore-include-path">
<title>función <function>restore_include_path</function></title>
<title>Función <function>restore_include_path</function></title>
<para>
La función <function>restore_include_path</function> es obsoleta.
Esta puede ser reemplazada con <literal>ini_restore('include_path')</literal>.
La función <function>restore_include_path</function> es obsoleta. Puede ser reemplazada por <literal>ini_restore('include_path')</literal>.
</para>
</sect3>
<sect3 xml:id="migration74.deprecated.core.implode-reverse-parameters">
<title>Implode con el orden de los parámetros históricos</title>
<title>Implode con el orden de parámetros histórico</title>
<para>
Pasar parámetros a <function>implode</function> en orden inverso
es obsoleto, use <literal>implode($glue, $parts)</literal>
en vez de <literal>implode($parts, $glue)</literal>.
Pasar los parámetros a <function>implode</function> en el orden inverso es obsoleto, utilizar <literal>implode($glue, $parts)</literal> en lugar de <literal>implode($parts, $glue)</literal>.
</para>
</sect3>
@@ -177,43 +159,34 @@
<title>COM</title>
<para>
La importación de bibliotecas de tipos con registro constante que no distingue entre mayúsculas y
y minúsculas es obsoleta.
La importación de bibliotecas de tipo con el registro de constantes no sensibles a mayúsculas y minúsculas ha sido declarada obsoleta.
</para>
</sect2>
<sect2 xml:id="migration74.deprecated.filter">
<title>Filter</title>
<title>Filtro</title>
<para>
<constant>FILTER_SANITIZE_MAGIC_QUOTES</constant> es obsoleto,
use <constant>FILTER_SANITIZE_ADD_SLASHES</constant> en su lugar.
<constant>FILTER_SANITIZE_MAGIC_QUOTES</constant> es obsoleto, utilizar <constant>FILTER_SANITIZE_ADD_SLASHES</constant> en su lugar.
</para>
</sect2>
<sect2 xml:id="migration74.deprecated.mbstring">
<title>Multibyte String</title>
<title>Cadenas Multi-octetos</title>
<para>
Pasar un patrón sin string a <function>mb_ereg_replace</function>
es obsoleto. Actualmente, los patrones sin string se interpretan como
puntos de código ASCII. En PHP 8, el patrón será interpretado como
un string en su lugar.
Pasar un patrón que no es una &string; a <function>mb_ereg_replace</function> es obsoleto. Actualmente, los patrones que no son &string; son interpretados como punto de código ASCII. En PHP 8, el patrón será interpretado como una &string; en su lugar.
</para>
<para>
Pasar la codificación como tercer parámetro a <function>mb_strrpos</function>
es obsoleto. En su lugar, pasar un offset de 0, y codificar como cuarto parámetro.
Pasar la codificación como tercer parámetro a <function>mb_strrpos</function> es obsoleto. En su lugar, pasar una posición de 0, y la codificación como cuarto parámetro.
</para>
</sect2>
<sect2 xml:id="migration74.deprecated.ldap">
<title>Protocolo ligero de acceso a directorios</title>
<title>Protocolo Ligero de Acceso a Directorios (LDAP)</title>
<para>
<function>ldap_control_paged_result_response</function> y
<function>ldap_control_paged_result</function> son obsoletas.
Los controles de paginación pueden ser enviados junto con
<function>ldap_search</function> en su lugar.
<function>ldap_control_paged_result_response</function> y <function>ldap_control_paged_result</function> son obsoletos. Los controles de paginación pueden ser enviados con <function>ldap_search</function> en su lugar.
</para>
</sect2>
@@ -221,23 +194,18 @@
<title>Reflection</title>
<para>
Llamar a <methodname>ReflectionType::__toString</methodname> ahora generará
un aviso de depreciación. Este método ha sido desaprobado en favor de
<methodname>ReflectionNamedType::getName</methodname> en la documentación
desde PHP 7.1, pero no lanzó un aviso de depreciación por razones técnicas.
La llamada a <methodname>ReflectionType::__toString</methodname> genera ahora un aviso de obsolescencia. Este método fue deprecado en favor de <methodname>ReflectionNamedType::getName</methodname> en la documentación a partir de PHP 7.1, pero no lanzaba un aviso de obsolescencia por razones técnicas.
</para>
<para>
Los métodos <literal>export()</literal> en todas las clases <classname>Reflection</classname>
están obsoletos. Contruir un objeto <classname>Reflection</classname> y
convertir este a string en su lugar:
Los métodos <literal>export()</literal> en todas las clases <classname>Reflection</classname> son obsoletos. Crear un objeto <classname>Reflection</classname> y convertirlo en &string; en su lugar:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// ReflectionClass::export(Foo::class, false) is:
// ReflectionClass::export(Foo::class, false) es:
echo new ReflectionClass(Foo::class), "\n";
// $str = ReflectionClass::export(Foo::class, true) is:
// $str = ReflectionClass::export(Foo::class, true) es:
$str = (string) new ReflectionClass(Foo::class);
?>
]]>
@@ -250,10 +218,7 @@ $str = (string) new ReflectionClass(Foo::class);
<title>Socket</title>
<para>
Las flags <constant>AI_IDN_ALLOW_UNASSIGNED</constant> y
<constant>AI_IDN_USE_STD3_ASCII_RULES</constant> para
<function>socket_addrinfo_lookup</function> son obsoletas,
debido a una depreciación ascendente en el glibc.
Los flags <constant>AI_IDN_ALLOW_UNASSIGNED</constant> y <constant>AI_IDN_USE_STD3_ASCII_RULES</constant> para <function>socket_addrinfo_lookup</function> son obsoletos, debido a una deprecación en glibc.
</para>
</sect2>

View File

@@ -1,19 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 216c1d34f9c4de575cf7115107a40f90f45b21c3 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: e150cc645a17588282e5e6b5e43e600a2f345549 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="migration74.new-features" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Nuevas características</title>
<title>Nuevas funcionalidades</title>
<sect2 xml:id="migration74.new-features.core">
<title>PHP Core</title>
<title>Núcleo de PHP</title>
<sect3 xml:id="migration74.new-features.core.typed-properties">
<title>Typed properties</title>
<title>Propiedades tipadas</title>
<para>
Las propiedades de clase ahora admiten declaraciones de tipo.
Las propiedades de las clases ahora soportan la declaración de tipos.
<informalexample>
<programlisting role="php">
<![CDATA[
@@ -26,19 +25,19 @@ class User {
]]>
</programlisting>
</informalexample>
El ejemplo anterior garantiza que <literal>$user->id</literal> solo puede
asignarse valores de tipo <type>int</type> y <literal>$user->name</literal> solo puede
asignarse valores de tipo <type>string</type>.
El ejemplo anterior asegura que <literal>$user->id</literal> solo puede
recibir valores de tipo &integer; y
<literal>$user->name</literal> solo puede recibir valores de tipo
&string;.
</para>
</sect3>
<sect3 xml:id="migration74.new-features.core.arrow-functions">
<title>Arrow functions</title>
<title>Funciones flecha</title>
<para>
<link linkend="functions.arrow">Arrow functions</link> proporciona
una sintaxis abreviada para definir funciones
con ligadura de ámbito implícita por valor.
Las <link linkend="functions.arrow">funciones flecha</link> proporcionan
una sintaxis corta para definir funciones que enlazan el ámbito por valor de manera implícita.
<informalexample>
<programlisting role="php">
@@ -55,7 +54,7 @@ $nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
</sect3>
<sect3 xml:id="migration74.new-features.core.type-variance">
<title>Covarianza limitada del tipo de retorno y contravarianza del tipo de argumento</title>
<title>Tipo de retorno covariante y tipo de argumento contravariante limitado</title>
<para>
El siguiente código ahora funcionará:
@@ -76,14 +75,39 @@ class ChildProducer extends Producer {
]]>
</programlisting>
</informalexample>
El soporte completo de varianza solo está disponible si se utiliza la carga automática. Dentro de un
solo fichero solo son posibles referencias de tipo no cíclicas, porque todas
las clases deben estar disponibles antes de ser referenciadas.
El soporte de varianza total solo está disponible cuando se utiliza la carga automática. En un único fichero solo son posibles referencias de tipos no cíclicos, ya que todas las clases deben estar disponibles antes de ser referenciadas.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
/**
* Estas clases satisfacen los requisitos del LSP, ya que C es un subtipo de A.
* Sin embargo, en el momento en que se declara la clase B, la clase C aún no está disponible
*/
class A
{
public function method(): A {}
}
class B extends A
{
// Error fatal: No se puede verificar la compatibilidad entre B::method():C y
// A::method(): A, ya que la clase C no está disponible
public function method(): С {}
}
class C extends B {}
?>
]]>
</programlisting>
</informalexample>
</para>
</sect3>
<sect3 xml:id="migration74.new-features.core.null-coalescing-assignment-operator">
<title>Operador de asignación de fusión nula</title>
<title>Operador de asignación de fusión Null</title>
<para>
<informalexample>
@@ -103,7 +127,7 @@ if (!isset($array['key'])) {
</sect3>
<sect3 xml:id="migration74.new-features.core.unpack-inside-array">
<title>Desempaquetado dentro de arrays</title>
<title>Desempaquetado en los arrays</title>
<para>
<informalexample>
@@ -121,10 +145,11 @@ $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
</sect3>
<sect3 xml:id="migration74.new-features.core.numeric-literal-separator">
<title>Separador de literales numéricos</title>
<title>Separador numérico literal</title>
<para>
Los literales numéricos pueden contener guiones bajos entre dígitos.
Los números literales pueden contener un carácter de subrayado entre
los dígitos.
<informalexample>
<programlisting role="php">
<![CDATA[
@@ -144,18 +169,19 @@ $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
<title>Referencias débiles</title>
<para>
Las referencias débiles permiten al programador retener una referencia a un objeto
que no impide que el objeto sea destruido.
Las <link linkend="class.weakreference">referencias débiles</link> permiten al desarrollador retener una referencia
a un objeto que no impide que el objeto sea destruido.
</para>
</sect3>
<sect3 xml:id="migration74.new-features.core.tostring-exceptions">
<title>Permitir excepciones desde __toString()</title>
<title>Permitir Excepciones desde __toString()</title>
<para>
Lanzar excepciones desde <link linkend="object.tostring">__toString()</link>
ahora está permitido. Anteriormente esto resultaba en un error fatal. Los errores fatales recuperables existentes en las conversiones de string han sido convertidos a
excepciones de tipo <classname>Error</classname>.
ahora está permitido. Anteriormente, esto resultaba en un error fatal.
Los errores fatales recuperables en las conversiones de &string; han sido
convertidos en excepciones <classname>Error</classname>.
</para>
</sect3>
@@ -165,18 +191,19 @@ $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
<title>CURL</title>
<para>
<classname>CURLFile</classname> ahora admite envolturas de flujo además
de nombres de fichero simples, si la extensión ha sido construida contra libcurl &gt;= 7.56.0.
<classname>CURLFile</classname> ahora soporta las envolturas de flujo
además de los nombres de ficheros brutos, si la extensión ha sido compilada con libcurl
&gt;= 7.56.0.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.filter">
<title>Filter</title>
<title>Filtro</title>
<para>
El filtro <constant>FILTER_VALIDATE_FLOAT</constant> ahora admite las
El filtro <constant>FILTER_VALIDATE_FLOAT</constant> ahora soporta las
opciones <literal>min_range</literal> y <literal>max_range</literal>,
con la misma semántica que <constant>FILTER_VALIDATE_INT</constant>.
con la misma sémantica que <constant>FILTER_VALIDATE_INT</constant>.
</para>
</sect2>
@@ -184,9 +211,9 @@ $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
<title>FFI</title>
<para>
FFI es una nueva extensión, que proporciona una forma sencilla de llamar
a funciones nativas, acceder a variables nativas y crear/acceder
a estructuras de datos definidas en bibliotecas C.
FFI es una nueva extensión, que proporciona una manera sencilla de llamar
a las funciones nativas, acceso nativo a las variables, y la creación/acceso a
estructuras de datos definidas en bibliotecas C.
</para>
</sect2>
@@ -204,18 +231,17 @@ $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
<para>
Se ha añadido el hash <literal>crc32c</literal> utilizando el polinomio de Castagnoli.
Esta variante de CRC32 es utilizada por sistemas de almacenamiento, como
Esta variante de CRC32 es utilizada por sistemas de almacenamiento, tales como
iSCSI, SCTP, Btrfs y ext4.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.mbstring">
<title>Multibyte String</title>
<title>Cadenas multioctetos</title>
<para>
Se ha añadido la función <function>mb_str_split</function>, que proporciona
la misma funcionalidad que <function>str_split</function>, pero operando
sobre puntos de código en lugar de bytes.
Se ha añadido la función <function>mb_str_split</function>, que proporciona la misma
funcionalidad que <function>str_split</function>, pero opera sobre puntos de código en lugar de octetos.
</para>
</sect2>
@@ -223,18 +249,20 @@ $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
<title>OPcache</title>
<para>
Se ha añadido <link linkend="opcache.preloading">soporte para la precarga de código</link>.
<link linkend="opcache.preloading">El soporte para la precarga de código</link> ha sido añadido.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.pcre">
<title>Regular Expressions (Perl-Compatible)</title>
<title>Expresiones Regulares (Compatible Perl)</title>
<para>
Las funciones <function>preg_replace_callback</function> y <function>preg_replace_callback_array</function>
ahora aceptan un argumento adicional <parameter>flags</parameter>, con soporte para las
banderas <constant>PREG_OFFSET_CAPTURE</constant> y <constant>PREG_UNMATCHED_AS_NULL</constant>.
Esto influye en el formato del array de coincidencias pasado a la función de retrollamada.
Las funciones <function>preg_replace_callback</function> y
<function>preg_replace_callback_array</function> ahora aceptan un
argumento <parameter>flags</parameter> adicional, con soporte para los
flags <constant>PREG_OFFSET_CAPTURE</constant> y
<constant>PREG_UNMATCHED_AS_NULL</constant>.
Esto influye en el formato del &array; de coincidencias pasado a la función de retrollamada.
</para>
</sect2>
@@ -242,14 +270,17 @@ $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
<title>PDO</title>
<para>
El nombre de usuario y la contraseña ahora pueden especificarse como parte del DSN de PDO para
los controladores mysql, mssql, sybase, dblib, firebird y oci. Anteriormente esto solo era admitido por el controlador pgsql. Si un nombre de usuario/contraseña se especifica
tanto en el constructor como en el DSN, el constructor tiene prioridad.
El nombre de usuario y la contraseña ahora pueden ser especificados como
parte del DSN PDO para los controladores mysql, mssql, sybase, dblib, firebird
y oci. Anteriormente, esto solo era soportado para el controlador pgsql.
Si un nombre de usuario/contraseña es definido tanto en el
constructor como en el DSN, el constructor tiene precedencia.
</para>
<para>
Ahora es posible escapar los signos de interrogación en las consultas SQL para evitar que se interpreten como marcadores de posición de parámetros. Escribir <literal>??</literal>
permite enviar un solo signo de interrogación a la base de datos y, por ejemplo, utilizar el
operador de existencia de clave JSON de PostgreSQL (<literal>?</literal>).
Ahora es posible escapar los signos de interrogación en las consultas SQL para evitar que sean interpretados como parámetro ficticio.
Escribir <literal>??</literal> permite enviar un solo signo de interrogación
a la base de datos y, por ejemplo, utilizar el operador PostgreSQL JSON
para saber si una clave existe (<literal>?</literal>).
</para>
</sect2>
@@ -266,13 +297,14 @@ $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
<para>
<literal>PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)</literal>
permite verificar si la sentencia es de solo lectura, es decir, si no modifica
la base de datos.
permite verificar si la declaración es de solo lectura, es decir, si no
modifica la base de datos.
</para>
<para>
<literal>PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true)</literal>
habilita el uso de códigos de resultado extendidos de SQLite3 en <function>PDO::errorInfo</function>
y <function>PDOStatement::errorInfo</function>.
activa el uso de códigos de resultados extendidos en
<function>PDO::errorInfo</function> y
<function>PDOStatement::errorInfo</function>.
</para>
</sect2>
@@ -281,68 +313,71 @@ $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
<para>
Se ha añadido <methodname>SQLite3::lastExtendedErrorCode</methodname>
para obtener el último código de resultado extendido.
para recuperar el último código extendido del resultado.
</para>
<para>
Se ha añadido <literal>SQLite3::enableExtendedResultCodes($enable = true)</literal>,
que hará que <methodname>SQLite3::lastErrorCode</methodname>
devuelva códigos de resultado extendidos.
que hará que <methodname>SQLite3::lastErrorCode</methodname> devuelva códigos de resultados extendidos.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.standard">
<title>Standard</title>
<title>Estándar</title>
<sect3 xml:id="migration74.new-features.standard.strip-tags">
<title>strip_tags() con array de nombres de etiquetas</title>
<title>strip_tags() con un array de nombres de tag</title>
<para>
<function>strip_tags</function> ahora también acepta un array de etiquetas permitidas:
en lugar de <literal>strip_tags($str, '&lt;a&gt;&lt;p&gt;')</literal>
ahora se puede escribir <literal>strip_tags($str, ['a', 'p'])</literal>.
<function>strip_tags</function> ahora acepta un &array; de tags
permitidos: en lugar de
<literal>strip_tags($str, '&lt;a&gt;&lt;p&gt;')</literal> ahora es posible escribir <literal>strip_tags($str, ['a', 'p'])</literal>.
</para>
</sect3>
<sect3 xml:id="migration74.new-features.standard.magic-serialize">
<title>Serialización personalizada de objetos</title>
<para>
Se ha añadido un nuevo mecanismo para la serialización personalizada de objetos, que
utiliza dos nuevos métodos mágicos: <literal>__serialize</literal>
y <literal>__unserialize</literal>.
Se ha añadido un nuevo mecanismo de serialización personalizada de objetos,
que utiliza dos nuevas métodos mágicos:
<literal>__serialize</literal> y <literal>__unserialize</literal>.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Devuelve un array que contiene todo el estado necesario del objeto.
public function __serialize(): array;
public function __serialize(): array
{
}
// Restaura el estado del objeto a partir del array de datos dado.
public function __unserialize(array $data): void;
// Restaura el estado de un objeto desde el array de datos proporcionado.
public function __unserialize(array $data): void
{
}
?>
]]>
</programlisting>
</informalexample>
El nuevo mecanismo de serialización sustituye a la
interfaz <interfacename>Serializable</interfacename>,
que será deprecada en el futuro.
El nuevo mecanismo de serialización sucederá a la interfaz
<interfacename>Serializable</interfacename>, que será obsoleto en el futuro.
</para>
</sect3>
<sect3 xml:id="migration74.new-features.standard.array-merge-no-args">
<title>Funciones de combinación de arrays sin argumentos</title>
<title>Las funciones array merge sin argumentos</title>
<para>
<function>array_merge</function> y <function>array_merge_recursive</function>
ahora pueden ser llamadas sin ningún argumento, en cuyo caso devolverán un array vacío.
Esto es útil en combinación con el operador de dispersión, por ejemplo, <literal>array_merge(...$arrays)</literal>.
ahora pueden ser llamadas sin argumentos, en cuyo caso
devolverán un &array; vacío. Esto es útil en conjunción con el operador
de descomposición, por ejemplo <literal>array_merge(...$arrays)</literal>.
</para>
</sect3>
<sect3 xml:id="migration74.new-features.standard.proc-open">
<title>Función <function>proc_open</function></title>
<title>La función <function>proc_open</function></title>
<para>
<function>proc_open</function> ahora acepta un array en lugar de un
string para el comando. En este caso, el proceso se abrirá
directamente (sin pasar por una shell) y PHP se encargará de
cualquier escape necesario de los argumentos.
<function>proc_open</function> ahora acepta un &array; en lugar de una
&string; para la comanda. En este caso, el proceso se abre directamente
(sin pasar a través de un shell) y PHP se encargará de escapar los argumentos
cuando sea necesario.
<informalexample>
<programlisting role="php">
<![CDATA[
@@ -354,15 +389,15 @@ proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes);
</informalexample>
</para>
<para>
<function>proc_open</function> ahora admite
descriptores <literal>redirect</literal> y <literal>null</literal>.
<function>proc_open</function> ahora soporta los descriptores
<literal>redirect</literal> y <literal>null</literal>.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Como 2>&1 en la shell
// Como 2>&1 en el shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);
// Como 2>/dev/null o 2>nul en la shell
// Como 2>/dev/null o 2>nul en el shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
?>
]]>
@@ -374,8 +409,8 @@ proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
<sect3 xml:id="migration74.new-features.standard.sodium-argon-hash">
<title>argon2i(d) sin libargon</title>
<para>
<function>password_hash</function> ahora tiene las implementaciones argon2i y argon2id
de la extensión sodium cuando PHP se construye sin libargon.
<function>password_hash</function> ahora tiene las implementaciones de
argon2i y argon2id de la extensión sodium cuando PHP es compilado sin libargon.
</para>
</sect3>

View File

@@ -1,13 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 426c6dd57d0a9bad98c27dfce61ee0abdc2869cd Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: aef53758a648dff702757a25dc865317b0cb4d06 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="migration74.new-functions">
<title>Nuevas funciones</title>
<sect2 xml:id="migration74.new-functions.core">
<title>Núcleo PHP</title>
<title>PHP Core</title>
<itemizedlist>
<listitem>
@@ -40,6 +38,18 @@
</itemizedlist>
</sect2>
<sect2 xml:id="migration74.new-functions.mbstring">
<title>Cadenas Multi-octetos</title>
<itemizedlist>
<listitem>
<simpara>
<function>mb_str_split</function>
</simpara>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration74.new-functions.openssl">
<title>OpenSSL</title>
@@ -53,7 +63,7 @@
</sect2>
<sect2 xml:id="migration74.new-functions.pcntl">
<title>Process Control</title>
<title>Control de Procesos</title>
<itemizedlist>
<listitem>
@@ -82,7 +92,6 @@
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml

View File

@@ -1,72 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: c517cdf9196d0b6374b1112af979768c7cb391e9 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: eee245cdbd89dc2fd908285f588e3b9e055924e5 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="migration74.windows-support" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Soporte para Windows</title>
<title>Gestión de Windows</title>
<sect2 xml:id="migration74.windows-support.configure">
<title><command>configure</command> flags</title>
<title>Flags <command>configure</command></title>
<para>
<command>configure</command> ahora considera a los conjuntos adicionales como <literal>CFLAGS</literal> y <literal>LDFLAGS</literal>
variables de entorno.
<command>configure</command> soporta las variables de entorno <literal>CFLAGS</literal> y <literal>LDFLAGS</literal>.
</para>
</sect2>
<sect2 xml:id="migration74.windows-support.other">
<title>Manejo de CTRL</title>
<title>Manejo CTRL</title>
<para>
CTRL+C y CTRL+BREAK en la consola pueden ser capturados mediante la configuración de una función de manejo
con <function>sapi_windows_set_ctrl_handler</function>.
<keycombo action='simul'>
<keycap>CTRL</keycap>
<keycap>C</keycap>
</keycombo>
y
<keycombo action='simul'>
<keycap>CTRL</keycap>
<keycap>BREAK</keycap>
</keycombo>
en la consola pueden ser definidos estableciendo un manejador con la función <function>sapi_windows_set_ctrl_handler</function>.
</para>
<para>
<function>proc_open</function> en Windows se puede pasar una
opción "create_process_group". Se requiere si el proceso del hijo
se supone que maneja eventos CTRL.
La opción "create_process_group" puede ser pasada a <function>proc_open</function>
en Windows. Es necesaria si el proceso hijo está destinado a manejar los eventos CTRL.
</para>
</sect2>
<sect2 xml:id="migration74.windows-support.opcache">
<title>OPcache</title>
<para>
OPcache ahora soporta un número arbitrario de cachés separados por usuario
a través de la directiva INI <literal>opcache.cache_id</literal>.
Todos los procesos con el mismo ID de caché y el usuario comparten una instancia OPcache.
OPcache ahora soporta un número arbitrario de caches separados por usuario a través de la directiva INI <literal>opcache.cache-id</literal>. Todos los procesos con el mismo identificador de cache y el mismo usuario comparten una instancia OPcache.
</para>
</sect2>
<sect2 xml:id="migration74.windows-support.stat">
<title>stat</title>
<para>
La implementación de la estadística se ha refactorizado.
La implementación de stat ha sido refactorizada.
</para>
<itemizedlist>
<listitem>
<simpara>
Un número inode
An inode number se entregado y se basa en el índice de archivos NTFS.
Un número de inode es proporcionado y se basa en el índice de fichero NTFS.
</simpara>
</listitem>
<listitem>
<simpara>
El número del dispositivo se basa ahora en el número de serie del volumen.
El número del dispositivo ahora se basa en el número de serie del volumen.
</simpara>
</listitem>
</itemizedlist>
<para>
Obsérvese que ambos valores se derivan del sistema y se proporcionan tal cual en los sistemas de
64 bits. En sistemas de 32 bits, estos valores podrían desbordar el entero de 32 bits en
PHP, así que son falsos.
Tenga en cuenta que ambos valores son derivados del sistema y proporcionados tal cual en sistemas de 64 bits. En sistemas de 32 bits, estos valores pueden exceder el integer de 32 bits en PHP, por lo que son falsos.
</para>
</sect2>
<sect2 xml:id="migration74.windows-support.sqlite3">
<title>libsqlite3</title>
<para>
libsqlite3 ya no está compilada estáticamente en <filename>php_sqlite3.dll</filename>
y <filename>php_pdo_sqlite.dll</filename>, pero más bien disponible como <filename>libsqlite3.dll</filename>.
Consulte las instrucciones de instalación para <link linkend="sqlite3.installation">SQLite3</link> y
libsqlite3 ya no se compila estáticamente en
<filename>php_sqlite3.dll</filename> y <filename>php_pdo_sqlite.dll</filename>,
sino que está disponible como <filename>libsqlite3.dll</filename>. Referirse a las instrucciones de instalación de
<link linkend="sqlite3.installation">SQLite3</link> y
<link linkend="ref.pdo-sqlite.installation">PDO_SQLITE</link>, respectivamente.
</para>
</sect2>

View File

@@ -1,15 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: d343dda81958034673651e2ccbda2bf139173f3d Maintainer: yago Status: ready -->
<sect1 xml:id="install.cloud.azure" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Microsoft Azure</title>
<para>
PHP instalará el Azure cloud platform. <!-- Removed link to fix the build ~sobak 12/06/2016 -->
<!-- EN-Revision: e8ac70bf549a723cb36465667a6109d9933b8619 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes Maintainer: PhilDaiguille -->
<sect1 xml:id="install.cloud.azure" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Azure App services</title>
<para>
PHP es frecuentemente utilizado en Azure App Services (alias Microsoft Azure,
Windows Azure, Azure Web Apps).
</para>
<para>
Azure App Services gestiona los pools de servidores Web Windows para alojar
su aplicación Web, como alternativa a la gestión de su propio
servidor Web en sus propias VM de cálculo Azure u otros servidores.
</para>
<para>
PHP ya está activado para su sitio web automático Azure App Services. En
el portal de Azure, seleccione su sitio Web, y puede elegir la
versión de PHP a utilizar. Es posible que desee elegir una versión más
reciente que la predeterminada.
</para>
<para>
Ver acerca de Azure SDK para PHP. <!-- Removed link to fix the build ~sobak 12/06/2016 -->
Como tal, PHP y las extensiones se ejecutan en Azure App Services
de la misma manera que lo harían en otros servidores Windows.
Sin embargo, la interfaz de gestión para Azure app services es diferente:
</para>
</sect1>
<itemizedlist spacing="compact">
<listitem>
<para>
Portal de Azure: crear, modificar y eliminar los sitios Web. <link xlink:href="&url.azure.portal;">Portal de Azure</link>
</para>
</listitem>
<listitem>
<para>
Tablero de Kudu: si el sitio Web tiene la URL
<literal><replaceable>nombre_del_sitio</replaceable>.azurewebsites.net</literal>,
el tablero de Kudu es
<literal>https://<replaceable>nombre_del_sitio</replaceable>.scm.azurewebsites.net/</literal>.
El tablero ofrece acceso a las funcionalidades de depuración, a la gestión
de los ficheros y a las extensiones del sitio.
Las extensiones de sitio son un mecanismo de Azure para agregar programas
adicionales, como versiones preliminares de PHP, a un sitio Web.
</para>
</listitem>
<listitem>
<para>
No se puede utilizar el gestor de servicios de Internet,
el gestor de servidor o RDP.
</para>
</listitem>
</itemizedlist>
<para>
También existe un SDK PHP, que permitirá utilizar los numerosos servicios de Azure desde su código PHP.
Ver <link xlink:href="&url.azure.php.sdk;">Azure SDK para PHP</link>.
</para>
<para>
Para más información, ver <link xlink:href="&url.azure.php;">Centro de desarrolladores de PHP de Azure</link>
</para>
<sect2>
<title>WinCache</title>
<para>WinCache está activado por omisión en Azure App Services y se recomienda dejarlo activado.
Si instala su propia versión de PHP, debe activar
WinCache.
</para>
</sect2>
<sect2>
<title>Build personalizada de PHP</title>
<para>
Puede cargar su propia versión de PHP en su D:\Home (C:\
no es accesible en escritura). Luego, en el portal de Azure,
defina SCRIPT_PROCESSOR para .php en la ruta de acceso absoluta al
fichero php-cgi.exe en su build personalizada.
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:

File diff suppressed because it is too large Load Diff

View File

@@ -1,76 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 07821cd88ca3eba45a5a7a230c6fe61bb457b968 Maintainer: agarzon Status: ready -->
<!-- EN-Revision: 04210d535db52aed64b82572817f059059ddfebc Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes Maintainer: PhilDaiguille -->
<chapter xml:id="install.fpm" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Manejador de Procesos FastCGI (FPM)</title>
<title>FastCGI Process Manager (FPM)</title>
&fpm.intro;
<para>
FPM (FastCGI Process Manager) es una implementación alternativa al PHP FastCGI
con algunas características adicionales (la mayoría) útiles para sitios web con mucho tráfico.
</para>
<para>
Estas características incluyen:
Estas funcionalidades incluyen :
<itemizedlist>
<listitem>
<para>
Manejo avanzado para detener/arrancar procesos de forma fácil;
Gestión avanzada de procesos con parada/arranque suave (graceful) ;
</para>
</listitem>
<listitem>
<para>
Posibilidad de iniciar hilos de procesos con diferentes uid/gid/chroot/environment,
escuchar en diferentes puertos y usar distintos php.ini (remplazando);
safe_mode
Pools que permiten iniciar trabajadores con diferentes uid/gid/chroot/entorno,
escuchando en diferentes puertos y utilizando diferentes php.ini (reemplaza el modo seguro) ;
</para>
</listitem>
<listitem>
<para>
Registro stdout y stderr;
Registro configurable stdout y stderr ;
</para>
</listitem>
<listitem>
<para>
Reinicio de emergencia en caso de destrucción accidental del caché opcode;
Reinicio de emergencia en caso de destrucción accidental del caché opcode ;
</para>
</listitem>
<listitem>
<para>
Soporte acelerado de subidas;
Soporte de carga acelerada ;
</para>
</listitem>
<listitem>
<para>
"slowlog" - scripts de registro de procesos (no sólo sus nombres, sin sus backtraces también,
usando ptrace y similares para leer procesos execute_data remotos) que son inusualmente lentos;
"slowlog" - registro de scripts (no solo sus nombres, sino también su backtrace PHP,
utilizando ptrace o equivalente para leer el proceso remoto) que se ejecutan anormalmente lento ;
</para>
</listitem>
<listitem>
<para>
<function>fastcgi_finish_request</function> - Función especial para detener y descargar todos los datos mientras
continua haciendo algún proceso más largo (conversión de vídeos, procesamiento de estadísticas, etc.);
<function>fastcgi_finish_request</function> - función especial para terminar la petición y volcar todas las datos
mientras se continúa ejecutando una tarea consumidora (conversión de video por ejemplo) ;
</para>
</listitem>
<listitem>
<para>
Creación dinámico/estático de hilos;
Nacimiento de procesos hijos dinámicos/bajo demanda/estáticos ;
</para>
</listitem>
<listitem>
<para>
Información básica del status SAPI (similar al mod_status de Apache);
Información de estado básica y extendida (similar a mod_status de Apache)
con diferentes formatos soportados como json, xml y openmetrics ;
</para>
</listitem>
<listitem>
<para>
Basado en archivos de configuración php.ini
Fichero de configuración basado en php.ini
</para>
</listitem>
</itemizedlist>
</para>
&install.fpm.install;
&install.fpm.configuration;
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml

View File

@@ -1,43 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: bde46b0386f6e20adaa003b7c2c88dd91dfa0192 Maintainer: chuso Status: ready -->
<!-- Reviewed: yes Maintainer: seros -->
<!-- EN-Revision: b536040d12c05c041e13028202e90d8e24fe3bf9 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no Maintainer: PhilDaiguille -->
<sect1 xml:id="install.fpm.install" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Instalación</title>
<sect2 xml:id="install.fpm.install.compiling">
<title>Compilación desde el código fuente</title>
<title>Compilar desde las fuentes</title>
<para>
Para habilitar FPM en la construcción de PHP, debe añadirse <literal>--enable-fpm</literal>
Para activar FPM en la construcción de PHP es necesario añadir la línea <literal>--enable-fpm</literal>
a la línea de configuración.
</para>
<para>
Hay otras opciones de configuración específicas de FPM (todas ellas optativas):
Existen múltiples opciones de configuración para FPM (todas opcionales):
</para>
<itemizedlist>
<listitem>
<para>
<literal>--with-fpm-user</literal> - Establecer el usuario de FPM (por omisión: nobody).
<literal>--with-fpm-user</literal> - el usuario FPM (por omisión - nobody).
</para>
</listitem>
<listitem>
<para>
<literal>--with-fpm-group</literal> - Establecer el grupo de FPM (por omisión: nobody).
<literal>--with-fpm-group</literal> - el grupo FPM (por omisión - nobody).
</para>
</listitem>
<listitem>
<para>
<literal>--with-fpm-systemd</literal> - Activar la integración del sistema (por omisión: no).
<literal>--with-fpm-systemd</literal> - Activa la integración de systemd (por omisión - no).
</para>
</listitem>
<listitem>
<para>
<literal>--with-fpm-acl</literal> - Utilizar las listas de control de acceso de POSIX (por omisión: no). Desde 5.6.5
<literal>--with-fpm-acl</literal> - Utilizar POSIX Access Control Lists (por omisión - no).
</para>
</listitem>
<listitem>
<para>
<literal>--with-fpm-apparmor</literal> - Activa la integración de AppArmor (por omisión - no).
</para>
</listitem>
<listitem>
<para>
<literal>--with-fpm-selinux</literal> - Activa la integración SELinux (por omisión - no).
</para>
</listitem>
</itemizedlist>
</sect2>
</sect1>
<sect2 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.2.0</entry>
<entry>
La opción <literal>--with-fpm-selinux</literal> ha sido añadida.
</entry>
</row>
<row>
<entry>8.0.0</entry>
<entry>
La opción <literal>--with-fpm-apparmor</literal> ha sido añadida.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml

View File

@@ -1,130 +1,141 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: e443388d4249fea383d6ec2d1a338be220cf95ee Maintainer: seros Status: ready -->
<!-- Reviewed: no Maintainer: seros -->
<chapter xml:id="configuration" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- EN-Revision: 9ab074d32484672f93e5d822f42fb94ae9088207 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="configuration" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Configuración en tiempo de ejecución</title>
<sect1 xml:id="configuration.file">
<title>El fichero de configuración</title>
<simpara>
El fichero de configuración (&php.ini;)
es leído al arrancar PHP. En las versiones en que PHP funciona como módulo de servidor,
esto sucede únicamente cuando se inicia el servidor. En las versiones
<acronym>CGI</acronym> y <acronym>CLI</acronym>, esto ocurre en
cada ejecución.
El fichero de configuración (&php.ini;) es leído por PHP al inicio. Si se ha compilado PHP como módulo, el fichero solo se lee una vez, al inicio del servidor web. Para las versiones
<acronym>CGI</acronym> y <acronym>CLI</acronym> el fichero es leído en cada invocación.
</simpara>
<para>
El fichero &php.ini; se busca en las siguientes ubicaciones (en orden):
El &php.ini; se busca en estos lugares (y en este orden) :
<itemizedlist>
<listitem>
<simpara>
La ubicación específica de módulo SAPI (directiva <literal>PHPIniDir</literal>
en Apache 2, opción de línea de comandos <literal>-c</literal> en CGI y CLI,
parámetro <literal>php_ini</literal> en NSAPI,
variable de entorno <literal>PHP_INI_PATH</literal> en THTTPD)
El lugar específico del módulo SAPI (la directiva <literal>PHPIniDir</literal>
de Apache 2, la opción de la línea de comandos <literal>-c</literal> en CGI y en CLI)
</simpara>
</listitem>
<listitem>
<simpara>
La variable de entorno <varname>PHPRC</varname>. Antes de PHP 5.2.0,
esta ubicación se comprobaba después de la clave de registro mencionada más abajo.
La variable de entorno <varname>PHPRC</varname>.
</simpara>
</listitem>
<listitem>
<simpara>
A partir de PHP 5.2.0, se puede establecer la ubicación del fichero
<literal>php.ini</literal> para diferentes versiones de PHP. Se examinan
en orden las siguientes claves de registro:
El lugar donde se encuentra el fichero <literal>php.ini</literal>
puede ser definido para diferentes versiones de PHP.
La raíz de las claves de registro depende de la arquitectura de 32 o 64 bits del SO y de PHP.
Para un SO y PHP de 32 bits o un SO y PHP de 64 bits, utilizar
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]</literal> para PHP de 32 bits
en un SO de 64 bits, utilizar
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]</literal>
en su lugar.
Para una instalación con la misma arquitectura, las siguientes claves de registro se buscan en este orden :
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z]</literal>,
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y]</literal> y
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]</literal>, donde
'x', 'y' y 'z' significan la versión mayor, menor, y de edición de PHP. Si existiera
un valor para <literal>IniFilePath</literal> en cualquiera de estas claves, la primera en
ser encontrada se utilizaría como ubicación del fichero <literal>php.ini</literal>
(solo en Windows).
x, y y z significan las versiones mayores, menores y normales.
Para una arquitectura de 32 bits de PHP en un SO de 64 bits, las siguientes claves de
registro se buscan en este orden :
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z]</literal>,
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y]</literal> y
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x]</literal>, donde
x, y y z significan las versiones mayores, menores y normales.
Si hay un valor para <literal>IniFilePath</literal> en estas claves,
el primero encontrado será utilizado como el lugar donde se encuentra el fichero
<literal>php.ini</literal> (solo en Windows).
</simpara>
</listitem>
<listitem>
<simpara>
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]</literal>, valor de
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]</literal> o
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]</literal>, valor de
<literal>IniFilePath</literal> (solo en Windows).
</simpara>
</listitem>
<listitem>
<simpara>
El directorio actual de trabajo (excepto CLI)
El directorio de trabajo actual (excepto para CLI)
</simpara>
</listitem>
<listitem>
<simpara>
El directorio del servidor web (para módulos SAPI), o el directorio de PHP
(excepto en Windows)
El directorio del servidor web (para los módulos SAPI), o el directorio que contiene PHP
(de otro modo en Windows)
</simpara>
</listitem>
<listitem>
<simpara>
El directorio de Windows (<filename class="directory">C:\windows</filename>
o <filename class="directory">C:\winnt</filename>) (para Windows), o la opción
en tiempo de compilación <literal>--with-config-file-path</literal>.
El directorio Windows (<filename class="directory">C:\windows</filename>
o <filename class="directory">C:\winnt</filename>) (para Windows), o
la opción de compilación <literal>--with-config-file-path</literal> durante la compilación
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Si existiera el fichero <filename>php-SAPI.ini</filename> (donde SAPI es la SAPI en uso,
por ejemplo, <filename>php-cli.ini</filename> o
<filename>php-apache.ini</filename>), se usaría éste en lugar de &php.ini;.
Se puede determinar el nombre de la SAPI usando <function>php_sapi_name</function>.
Si el fichero <filename>php-SAPI.ini</filename> existe (donde SAPI utiliza SAPI, por lo que
el nombre del fichero es e.g. <filename>php-cli.ini</filename> o
<filename>php-apache.ini</filename>), se utilizará en lugar de &php.ini;.
El nombre SAPI puede ser determinado utilizando la función <function>php_sapi_name</function>.
</para>
<note>
<para>
El servidor web Apache cambia el directorio al raíz al arrancar, haciendo
que PHP intente leer &php.ini; desde el sistema de ficheros raíz si existiera.
El servidor web Apache cambia este directorio al directorio root al inicio, lo que hace
que PHP intente leer &php.ini; desde el sistema de ficheros raíz si existe.
</para>
</note>
<para>
Las variables de entorno se pueden usar en &php.ini; como se muestra abajo.
</para>
<para>
<example>
<title>Variables de entorno de &php.ini;</title>
<programlisting role="ini">
<simpara>
Las variables de entorno pueden ser referenciadas en los valores
de configuración de &php.ini; como se ilustra a continuación. A partir de PHP 8.3.0,
un valor de repliegue puede ser especificado, que será utilizado cuando la variable
referenciada no esté definida.
</simpara>
<example>
<title>Variables de entorno en &php.ini;</title>
<programlisting role="ini">
<![CDATA[
; PHP_MEMORY_LIMIT se toma del entorno
; PHP_MEMORY_LIMIT se toma desde el entorno
memory_limit = ${PHP_MEMORY_LIMIT}
; Si PHP_MAX_EXECUTION_TIME no está definido, tomará el valor de repliegue 30.
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
]]>
</programlisting>
</example>
</para>
</programlisting>
</example>
<para>
Las directivas de &php.ini; manejadas por extensiones están documentadas
en la propia página de cada extensión. Hay una <link linkend="ini">lista de
directivas del núcleo</link> disponible en el apéndice. Es posible que no todas
las directivas de PHP estén documentadas en el manual: para consultar una lista completa
de las directivas disponibles en su versión de PHP, por favor, lea los comentarios del
fichero &php.ini;. Adicionalmente, puede encontrar útil
<link xlink:href="&url.php.git.phpini;">el último &php.ini;</link>
desde Git.
Las directivas &php.ini; están directamente documentadas, por extensiones,
en las páginas respectivas del manual de estas extensiones. La
<link linkend="ini">lista de directivas internas</link> está disponible
en el anexo. Es probable que no todas las directivas PHP estén documentadas
en el manual. Para una lista completa de las directivas disponibles en su versión de PHP,
lea los comentarios de su propio fichero &php.ini;.
También se puede encontrar la
<link xlink:href="&url.php.git.phpini;">última versión del &php.ini;</link>
en Git.
</para>
<para>
<example>
<title>Ejemplo de &php.ini;</title>
<title>Extracto del &php.ini;</title>
<programlisting role="ini">
<![CDATA[
; todo texto en una línea tras un punto y coma sin comillas (;) será ignorado
[php] ; los marcadores de sección (textos entre corchetes) también se ignoran
; Los valores de tipo boolean puede establecerse a:
; todo texto en una línea, situado después de un punto y coma ";" es ignorado
[php] ; los marcadores de sección (texto entre corchetes) también son ignorados
; Los valores booleanos pueden ser especificados así :
; true, on, yes
; o false, off, no, none
; o false, off, no, none
register_globals = off
track_errors = yes
; se pueden encerrar los strings entre comillas dobles
; se pueden colocar las cadenas de caracteres entre comillas
include_path = ".:/usr/local/lib/php"
; las barras invertidas reciben el mismo tratamiento que el resto de caracteres
; Las barras invertidas se tratan como cualquier carácter
include_path = ".;c:\php\lib"
]]>
</programlisting>
@@ -132,233 +143,215 @@ include_path = ".;c:\php\lib"
</example>
</para>
<para>
A partir de PHP 5.1.0, es posible hacer referencia a variables .ini ya existentes desde
el propio fichero .ini. Ejemplo: <literal>open_basedir = ${open_basedir}
Es posible referirse a variables .ini
desde ficheros .ini. Por ejemplo : <literal>open_basedir = ${open_basedir}
":/new/dir"</literal>.
</para>
<sect2 xml:id="configuration.file.scan">
<title>Directorios de búsqueda</title>
<sect2 xml:id="configuration.file.scan">
<title>Leer un directorio</title>
<para>
Es posible configurar PHP para que busque ficheros .ini en un directorio
después de leer &php.ini;. Esto se puede realizar durante la compilación estableciento la
opción <option role="configure">--with-config-file-scan-dir</option>. En
PHP 5.2.0 y posteriores, el directorio de búsqueda puede ser sobrescrito durante la ejecución
estableciendo la vairable de entorno <varname>PHP_INI_SCAN_DIR</varname>.
Es posible configurar PHP para leer los ficheros .ini presentes en un directorio.
después de la lectura de &php.ini;. Esto se ajusta durante la compilación con el argumento
<option role="configure">--with-config-file-scan-dir</option>.
El directorio a leer puede ser modificado durante la ejecución
por la definición de la variable de entorno <varname>PHP_INI_SCAN_DIR</varname>.
</para>
<para>
Es posible buscar en varios directorios separándolos con el
separador de rutas específico de cada plataforma (<literal>;</literal> en Windows, NetWare
y RISC OS; <literal>:</literal> en las demás plataformas; el valor que PHP
emplea está disponible como la constante <constant>PATH_SEPARATOR</constant>).
Si se proporciona a <varname>PHP_INI_SCAN_DIR</varname> un directorio en blanco, PHP
también buscará en el directorio dado durante la compilación mediante
Es posible leer varios directorios separándolos con un
separador de ruta específico de la plataforma (<literal>;</literal> para Windows, NetWare
y RISC OS; <literal>:</literal> para todas las otras plataformas; el valor utilizado por PHP es
disponible en la constante <constant>PATH_SEPARATOR</constant>).
Si se proporciona un directorio vacío en
<varname>PHP_INI_SCAN_DIR</varname>, PHP
también leerá el directorio proporcionado durante la compilación a través de
<option role="configure">--with-config-file-scan-dir</option>.
</para>
<para>
PHP buscará dentro de cada directorio todos los ficheros que finalicen en
<literal>.ini</literal> en orden alfabético. Se puede obtener una lista
de los ficheros cargados, y en qué orden, llamando a
<function>php_ini_scanned_files</function>, o ejecutando PHP con la
opción <option>--ini</option>.
En cada directorio, PHP leerá todos los ficheros que terminen por
<literal>.ini</literal> en orden alfabético. Una lista de los ficheros que
han sido cargados y en qué orden está disponible llamando a la función
<function>php_ini_scanned_files</function>, o ejecutando PHP con la opción
<option>--ini</option>.
</para>
<informalexample>
<screen>
<![CDATA[
Se asumen que PHP está configurado con --with-config-file-scan-dir=/etc/php.d,
y que el separador de rutas es :...
Suponiendo que PHP está configurado con --with-config-file-scan-dir=/etc/php.d,
y que el separador de ruta es :...
$ php
PHP cargará todos los ficheros de /etc/php.d/*.ini como ficheros de configuración.
PHP cargará todos los ficheros presentes en /etc/php.d/*.ini como fichero
de configuración.
$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php
PHP cargará todos los ficheros de /usr/local/etc/php.d/*.ini como
ficheros de configuración.
PHP cargará todos los ficheros presentes en /usr/local/etc/php.d/*.ini
como fichero de configuración.
$ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php
PHP cargará todos los ficheros de /etc/php.d/*.ini, y luego de
/usr/local/etc/php.d/*.ini como ficheros de configuración.
PHP cargará todos los ficheros presentes en /etc/php.d/*.ini, luego
/usr/local/etc/php.d/*.ini como fichero de configuración.
$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
PHP cargará todos los ficheros de /usr/local/etc/php.d/*.ini, y luego de
/etc/php.d/*.ini como ficheros de configuración.
PHP cargará todos los ficheros presentes en /usr/local/etc/php.d/*.ini, luego en
/etc/php.d/*.ini como fichero de configuración.
]]>
</screen>
</informalexample>
</sect2>
<sect2 xml:id="configuration.file.changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>7.0.0</entry>
<entry>
Las almohadillas (<literal>#</literal>) ya no se reconocen como comentarios.
</entry>
</row>
<row>
<entry>5.3.0</entry>
<entry>
Las almohadillas (<literal>#</literal>) ya no deberían utilizarse como comentarios,
ya que lanzarán una advertencia de obsolescencia si se emplean.
</entry>
</row>
<row>
<entry>5.2.0</entry>
<entry>
La variable de entorno <varname>PHP_INI_SCAN_DIR</varname> se puede
establecer para sobrescribir el directorio de búsqueda mediante el script de configuración.
</entry>
</row>
<row>
<entry>5.1.0</entry>
<entry>
Es posible referirse a variables .ini existentes dentrode ficheros .ini.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</sect2>
</sect1>
<sect1 xml:id="configuration.file.per-user">
<title>Ficheros .user.ini</title>
<simpara>
A partir de PHP 5.3.0 se incluye soporte para ficheros de configuración INI
a nivel de directorios. Estos ficheros <emphasis>solo</emphasis> los procesa
la SAPI CGI/FastCGI. Esta funcionalidad deja obsoleta la extensión PECL htscanner.
Si está usando Apache, use los ficheros &htaccess; para lograr el mismo
efecto.
PHP incluye el soporte para ficheros INI de configuración
por directorio. Estos ficheros son analizados <emphasis>solo</emphasis>
por el SAPI CGI/FastCGI. Esta funcionalidad hace obsoleta la extensión PECL
<literal>htscanner</literal>. Si se ejecuta PHP como módulo Apache,
el uso de los ficheros &htaccess; produce el mismo efecto.
</simpara>
<simpara>
Además del fichero &php.ini; principal, PHP explora cada directorio en busca de
ficheros INI, empezando por el directorio del fichero PHP solicitado, y
continuando hasta el directorio raíz de documentos (tal y como esté establecido en
<varname>$_SERVER['DOCUMENT_ROOT']</varname>). En el caso de que el fichero PHP se encuentre
fuera del directorio raíz de documentos, sólo se explorará su directorio.
Además del fichero &php.ini; principal, PHP analiza los ficheros INI
contenidos en cada directorio, comenzando por el directorio desde el cual
el fichero PHP actual es llamado, y recorre los directorios hasta el
directorio raíz actual (tal como se define por la variable
<varname>$_SERVER['DOCUMENT_ROOT']</varname>). En el caso de que el fichero PHP
esté fuera de la raíz web, solo su directorio será escaneado.
</simpara>
<simpara>
En los ficheros INI estilo .user.ini sólo se reconocerán
las configuraciones INI que tengan los modos
<constant>INI_PERDIR</constant> y
<constant>INI_USER</constant>.
<simpara>Solo las configuraciones INI con los modos <constant>INI_PERDIR</constant>
y <constant>INI_USER</constant> serán reconocidas en los ficheros INI
.user.ini-style.
</simpara>
<simpara>
Las dos nuevas directivas INI,
Dos nuevas directivas INI,
<link linkend="ini.user-ini.filename">user_ini.filename</link> y
<link linkend="ini.user-ini.cache-ttl">user_ini.cache_ttl</link>
controlan el uso de los ficheros INI de usuarios.
controlan el uso de los ficheros INI definidos por el usuario.
</simpara>
<simpara>
<link linkend="ini.user-ini.filename">user_ini.filename</link> establece el nombre del fichero que PHP busca
en cada directorio; si se establece un string vacío, PHP no realizará ninguna búsqueda.
El nombre por omisión es <literal>.user.ini</literal>.
<link linkend="ini.user-ini.filename">user_ini.filename</link> define el nombre del fichero buscado
por PHP en cada directorio ; si esta directiva está definida a una cadena vacía,
PHP no analizará nada en absoluto. Por defecto, vale <literal>.user.ini</literal>.
</simpara>
<simpara>
<literal>user_ini.cache_ttl</literal> controla con qué frecuencia se releen los ficheros
INI de usuario. El valor por omisión es 300 segundos (5 minutos).
<link linkend="ini.user-ini.cache-ttl">user_ini.cache_ttl</link> controla la duración entre 2 relecturas
de los ficheros INI definidos por el usuario. Por defecto, vale
300 segundos (5 minutos).
</simpara>
</sect1>
<sect1 xml:id="configuration.changes.modes">
<title>Dónde se puede realizar un ajuste de configuración</title>
<title>Dónde una directiva de configuración puede ser modificada</title>
<para>
Estos modos determinan cuándo y dónde se debe o no asignar una directiva
de PHP, y cada directiva del manual hace referencia a uno de estos
modos. Por ejemplo, algunos ajustes pueden establecerse en scripts de PHP
usando <function>ini_set</function>, mientras que otros requieren hacerlo en
&php.ini; o en &httpd.conf;.
Estos modos determinan cuándo y dónde una directiva PHP puede o no puede
ser modificada, y cada directiva del manual está dirigida por uno de estos modos.
Por ejemplo, algunas directivas pueden ser modificadas en un script PHP
con la función <function>ini_set</function>, mientras que otras necesitan
ser modificadas en los ficheros &php.ini; o &httpd.conf;.
</para>
<para>
Por ejemplo, el ajuste
<link linkend="ini.output-buffering">output_buffering</link>
es <constant>INI_PERDIR</constant> por tanto no puede establecerse usando
<function>ini_set</function>. Sin embargo, la directiva
<link linkend="ini.display-errors">display_errors</link> es
<constant>INI_ALL</constant> por tanto se puede establecer en cualquier lugar,
incluso con <function>ini_set</function>.
Por ejemplo, la directiva
<link linkend="ini.output-buffering">output_buffering</link> tiene el modo
<constant>INI_PERDIR</constant> por lo que no puede ser modificada
con la función <function>ini_set</function>. Por otro lado, la directiva
<link linkend="ini.display-errors">display_errors</link> tiene el modo
<constant>INI_ALL</constant>, y puede ser modificada en cualquier lugar,
incluyendo con la función <function>ini_set</function>.
</para>
<para>
<table>
<title>Definición de los modos INI_*</title>
<tgroup cols="2">
<thead>
<row>
<entry>Modo</entry>
<entry>Significado</entry>
</row>
</thead>
<tbody>
<row>
<entry><constant>INI_USER</constant></entry>
<entry>
La entrada se puede establecer en scripts de usuario (como con <function>ini_set</function>)
o en el <link linkend="configuration.changes.windows">registro de Windows</link>.
Desde PHP 5.3, la entrada puede ser establecida en &user-ini;
</entry>
</row>
<row>
<entry><constant>INI_PERDIR</constant></entry>
<entry>
La entrada se puede establecer en &php.ini;, &htaccess;, &httpd.conf; o &user-ini;
(desde PHP 5.3)
</entry>
</row>
<row>
<entry><constant>INI_SYSTEM</constant></entry>
<entry>La entrada se puede establecer en &php.ini; o en &httpd.conf;</entry>
</row>
<row>
<entry><constant>INI_ALL</constant></entry>
<entry>La entrada se puede establecer en cualquier lugar</entry>
</row>
</tbody>
</tgroup>
</table>
<variablelist>
<!--
Replace everything inside the <variablelist> element with an <xi:include>
once libxml2 gets XInclude 1.1 attribute copying support.
The below <xi:include> will include the appropriate elements
but needs all top-level xml:id's removed (see XInclude 1.1 set-xml-id).
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('constant.ini-mode')/*)"><xi:fallback/>
</xi:include>
-->
<title>Constantes de modo INI</title>
<varlistentry>
<term>
<constant>INI_USER</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
La entrada puede ser definida en scripts de usuario (como con <function xmlns="http://docbook.org/ns/docbook">ini_set</function>)
o en el <link xmlns="http://docbook.org/ns/docbook" linkend="configuration.changes.windows">registro Windows</link>.
La entrada puede ser definida en &user-ini;
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
<constant>INI_PERDIR</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
La entrada puede ser definida en &php.ini;, &htaccess;, &httpd.conf; o &user-ini;
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
<constant>INI_SYSTEM</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
La entrada puede ser definida en &php.ini; o &httpd.conf;
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
<constant>INI_ALL</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
La entrada puede ser definida en cualquier lugar
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect1>
<sect1 xml:id="configuration.changes">
<title>Cómo cambiar los ajustes de configuración</title>
<title>Cómo modificar la configuración</title>
<sect2 xml:id="configuration.changes.apache">
<title>Ejecutar PHP como un módulo de Apache</title>
<title>Ejecutar PHP como módulo Apache</title>
<simpara>
Cuando se usa PHP como un módulo de Apache, se pueden cambiar los
ajustes de configuración usando directivas en los ficheros de configuración
de Apache (p.ej. &httpd.conf;) y en los ficheros &htaccess;. Se necesitarán
los privilegios "AllowOverride Options" o "AllowOverride All" para poder hacerlo.
Cuando se utiliza el módulo Apache, también se pueden cambiar
los parámetros de configuración utilizando las directivas
en los ficheros de configuración de Apache (&httpd.conf;) y en
los ficheros &htaccess;. Se necesitarán los privilegios
"AllowOverride Options" o "AllowOverride All".
</simpara>
<para>
Existen varias directivas de Apache que permiten
cambiar la configuración de PHP desde los propios ficheros de configuración
de Apache. Para un listado las directivas que son
<constant>INI_ALL</constant>, <constant>INI_PERDIR</constant>,
o <constant>INI_SYSTEM</constant>, consulte el apéndice de la
<link linkend="ini.list">Lista de directivas de php.ini</link>.
Hay muchas directivas
Apache que permiten modificar la configuración de PHP
desde los ficheros de configuración de Apache. Para una lista de las
directivas que son <constant>INI_ALL</constant>,
<constant>INI_PERDIR</constant> o <constant>INI_SYSTEM</constant>
consulte el anexo <link linkend="ini.list">Lista de directivas
del php.ini</link>.
</para>
<para>
@@ -371,14 +364,18 @@ $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
</term>
<listitem>
<para>
Establece el valor de la directiva especificada.
Sólo puede usarse con las directivas de tipo <constant>INI_ALL</constant> y <constant>INI_PERDIR</constant>.
Para borrar un valor previamente establecido, use <literal>none</literal> como valor.
Modifica el valor de la directiva especificada.
Esta instrucción solo es utilizable con las directivas PHP de tipo
<constant>INI_ALL</constant> y <constant>INI_PERDIR</constant>.
Para anular un valor que hubiera sido modificado previamente,
utilice el valor <literal>none</literal>.
</para>
<note>
<simpara>
No use <systemitem role="directive">php_value</systemitem> para establecer valores boolean.
Debe usarse en su lugar <systemitem role="directive">php_flag</systemitem> (ver más abajo).
No utilice <systemitem role="directive">php_value</systemitem>
para configurar valores booleanos.
<systemitem role="directive">php_flag</systemitem> (ver más abajo)
debe ser utilizada.
</simpara>
</note>
</listitem>
@@ -391,9 +388,11 @@ $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
</term>
<listitem>
<para>
Usado para establecer una directiva de configuración de tipo boolean.
Sólo puede usarse con las directivas de tipo
<constant>INI_ALL</constant> y <constant>INI_PERDIR</constant>.
Esta instrucción se utiliza para activar o
desactivar una opción.
Esta instrucción solo es utilizable con las directivas
PHP de tipo <constant>INI_ALL</constant> y
<constant>INI_PERDIR</constant>.
</para>
</listitem>
</varlistentry>
@@ -405,26 +404,29 @@ $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
</term>
<listitem>
<para>
Establece el valor de la directiva especificada.
Esto <emphasis>no se puede usar</emphasis> en ficheros &htaccess;.
Ninguna directiva establecida con <systemitem role="directive">php_admin_value</systemitem>
podrá ser sobrescrita por &htaccess; o por <function>ini_set</function>.
Para borrar un valor establecido previamente use <literal>none</literal> como valor.
Esta instrucción asigna un valor a la variable especificada.
Esta instrucción <emphasis>NO puede ser utilizada</emphasis> en un fichero
&htaccess;. Cualquier directiva de PHP configurada con el tipo
<systemitem role="directive">php_admin_value</systemitem> no puede ser
modificada utilizando el fichero &htaccess; o la función <function>ini_set</function>.
Para anular un valor que hubiera sido modificado previamente, utilice la
valor <literal>none</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<systemitem role="directive">php_admin_flag</systemitem>
<parameter>nombre</parameter>
<parameter>name</parameter>
<parameter>on|off</parameter>
</term>
<listitem>
<para>
Usado para establecer una directiva de configuración de tipo boolean.
Esto <emphasis>no se puede usar</emphasis> en ficheros &htaccess;.
Ninguna directiva establecida con <systemitem role="directive">php_admin_flag</systemitem>
podrá ser sobrescrita por &htaccess; o por <function>ini_set</function>.
Esta directiva se utiliza para activar o desactivar una opción.
Esta instrucción <emphasis>NO puede ser utilizada</emphasis> en un fichero
&htaccess;. Cualquier directiva de PHP configurada con el tipo
<systemitem role="directive">php_admin_flag</systemitem> no puede ser
modificada utilizando el fichero &htaccess; o por la función <function>ini_set</function>.
</para>
</listitem>
</varlistentry>
@@ -432,7 +434,7 @@ $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
</para>
<para>
<example>
<title>Ejemplo de configuración de Apache</title>
<title>Ejemplo de configuración Apache</title>
<programlisting role="ini">
<![CDATA[
<IfModule mod_php5.c>
@@ -449,52 +451,57 @@ $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
</para>
<caution>
<para>
Las constantes de PHP no existen fuera de PHP. Por ejemplo, en
&httpd.conf; no se pueden usar constantes de PHP
tales como <constant>E_ALL</constant> o <constant>E_NOTICE</constant>
para establecer la directiva <link linkend="ini.error-reporting">error_reporting</link>
puesto que no tendrán ningún significado y se evaluarán como
<emphasis>0</emphasis>. Use en su lugar la máscara de bits asociada.
Estas constantes sí pueden ser usadas en &php.ini;
Las constantes PHP no existen fuera de PHP. Por
ejemplo, en el fichero &httpd.conf;,
no se pueden utilizar constantes PHP como
<constant>E_ALL</constant> o <constant>E_NOTICE</constant> para especificar
el nivel de <link linkend="ini.error-reporting">informe de errores</link>,
ya que estas constantes no tienen significado para Apache,
y serán reemplazadas por <emphasis>0</emphasis>.
Utilice los valores numéricos en su lugar.
Las constantes pueden ser utilizadas en el &php.ini;
</para>
</caution>
</sect2>
<sect2 xml:id="configuration.changes.windows">
<title>Cambiar la configuración de PHP a través del registro de Windows</title>
<title>Modificar la configuración de PHP a través del registro de Windows</title>
<simpara>
Cuando se ejecuta PHP en Windows, se pueden modificar los valores
de configuración a nivel de directorio usando el registro de Windows.
Los valores de configuración se almacenan en la clave de registro
Cuando se utiliza PHP en Windows, la configuración puede
ser modificada directorio por directorio utilizando el registro de Windows. Los valores de configuración se almacenan
con la clave de registro
<literal>HKLM\SOFTWARE\PHP\Per Directory Values</literal>,
en las subclaves correspondientes a los nombres de ruta. Por ejemplo, los valores
de configuración para el directorio <literal>c:\inetpub\wwwroot</literal>
se almacenarían en la clave <literal>HKLM\SOFTWARE\PHP\Per Directory
Values\c\inetpub\wwwroot</literal>. Los ajustes para el directorio
estarán activos para cualquier script dentro de este directorio o
en cualquiera de sus subdirectorios. Los valores bajo esta clave
deberían tener el nombre de la directiva de configuración de PHP y el
valor como string. Las constantes de PHP usadas como valor no serán procesadas.
En cualquier caso, únicamente los valores de configuración
modificables de <constant>INI_USER</constant> podrán establecerse
con este método, mientras que los valores de <constant>INI_PERDIR</constant> no.
en las subclaves correspondientes a los nombres de directorio. Por ejemplo,
el valor de una opción en el directorio <literal>c:\inetpub\wwwroot</literal>
se almacenará en la clave
<literal>HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot</literal>.
El valor de esta opción será utilizado para todos los
scripts que funcionen en este directorio o sus subdirectorios.
Los valores bajo la clave deben tener el nombre de una
dirección de configuración PHP,
y el valor correspondiente. Las constantes PHP no son utilizables : hay que poner el valor entero.
Sin embargo, solo los valores de las configuraciones en
<constant>INI_USER</constant> pueden ser fijados de esta manera,
los de <constant>INI_PERDIR</constant> no pueden serlo,
ya que estos valores de configuración son releídos en cada solicitud.
</simpara>
</sect2>
<sect2 xml:id="configuration.changes.other">
<title>Otras interfaces a PHP</title>
<title>Otras interfaces de configuración de PHP</title>
<para>
Independientemente de cómo ejecute PHP, se pueden cambiar determinados valores
de los scripts en tiempo de ejecución mediante <function>ini_set</function>.
Consulte la documentación de la página <function>ini_set</function> para más información.
Según la forma en que se ejecute PHP, se pueden cambiar algunos valores
durante la ejecución de los scripts utilizando <function>ini_set</function>.
Consulte la documentación de la función <function>ini_set</function> para más
información.
</para>
<para>
Si está interesado en una lista completa de los ajustes de configuración
en su sistema con sus valores actuales, puede ejecutar la función
<function>phpinfo</function>, y consultar la página mostrada.
Puede también acceder a los valores de directivas de configuración
concretas usando <function>ini_get</function> o
<function>get_cfg_var</function>.
Si está interesado en una lista completa de las opciones configuradas
en su sistema con sus valores actuales, puede ejecutar
la función <function>phpinfo</function> y consultar la página resultante.
También se puede acceder individualmente a las directivas de configuración
durante la ejecución de los scripts utilizando la función
<function>ini_get</function> o la función <function>get_cfg_var</function>.
</para>
</sect2>
</sect1>

View File

@@ -1,73 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 2b6c321f6a2f2366c1e884fb6697ba1af7f0c0b4 Maintainer: gerardocdc Status: ready -->
<!-- Reviewed: no Maintainer: andresdzphp -->
<!-- EN-Revision: 04d9aded7bbd447523cf038ddf88e6d7f7e43c53 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<sect1 xml:id="install.macosx.bundled" xmlns="http://docbook.org/ns/docbook">
<title>Usando el paquete PHP</title>
<title>Uso de PHP integrado anterior a macOS Monterey</title>
<simpara>
PHP está incluido en los Macs desde la versión OS X 10.0.0. Habilitar PHP
con el servidor web por defecto requiere descomentar unas cuantas líneas
en el fichero de configuración de Apache <filename>httpd.conf</filename> donde
PHP está integrado con macOS desde macOS X (10.0.0) y anterior a macOS Monterey (12.0.0).
Activar PHP con el servidor Web por defecto requiere descomentar
algunas líneas en el fichero de configuración de Apache
<filename>httpd.conf</filename> mientras que el modo
<acronym>CGI</acronym> y/o <acronym>CLI</acronym> están activados por defecto
(son fácilmente accesibles a través del programa Terminal).
(acceso simple a través del terminal).
</simpara>
<simpara>
Siguiendo las instrucciones que se ofrecen a continuación se podrá habilitar
PHP de una forma rápida para un entorno de desarrollo local. Es
<emphasis>muy recomendable</emphasis> tener siempre actualizado PHP a la última
versión. Como casi todo el software vivo, y PHP no es una excepción, se crean
nuevas versiones para resolver errores y añadir nuevas funcionalidades. Consulte
la documentación de instalación de Mac OS X adecuada para más detalles. Las siguientes
instrucciones para obtener una configuración están orientadas a los principiantes que
deseen obtener una configuración totalmente operativa. Se anima a todos los usuarios
a compilar o instalar una nueva versión ya empaquetada.
La activación de PHP siguiendo estas instrucciones permite configurar
rápidamente un entorno local de desarrollo. Se recomienda encarecidamente
siempre actualizar PHP a su versión más reciente. Como la mayoría de los programas, las nuevas
versiones se crean para corregir errores y añadir funcionalidades y es el caso de PHP. Consulte la documentación de la instalación
de macOS para más detalles. Las siguientes instrucciones están destinadas
al principiante, proporcionando solo los detalles suficientes para configurar
una configuración por defecto para trabajar. Se recomienda encarecidamente a todos los usuarios compilar e instalar una versión reciente del paquete.
</simpara>
<simpara>
La instalación típica es mediante mod_php. Para habilitar el paquete mod_php que viene
en el Mac OS X para el servidor web Apache (el servidor web por defecto, al que se puede
acceder mediante las Preferencias del Sistema) se requiere efectuar los siguientes pasos:
El tipo de instalación estándar utiliza mod_php, y activa el
mod_php integrado en macOS para el servidor Web Apache (el servidor Web
por defecto que es accesible a través de las preferencias del sistema), en algunos pasos:
</simpara>
<para>
<orderedlist>
<listitem>
<simpara>
Localizar y abrir el archivo de configuración de Apache. Por defecto, la localización
de dicho fichero es: <filename>/private/etc/apache2/httpd.conf</filename>
Encuentre y abra el fichero de configuración de Apache. Por defecto, será:
<filename>/private/etc/apache2/httpd.conf</filename>
</simpara>
<simpara>
Mediante el <literal>Finder</literal> o el <literal>Spotlight</literal> puede ser
algo complicado encontrar dicho fichero ya que por defecto es privado y pertenece al
usuario <literal>root</literal>.
Utilizar el programa <literal>Finder</literal> o <literal>Spotlight</literal>
para encontrar este fichero puede resultar difícil, sabiendo que, por defecto, pertenece al usuario <literal>root</literal>.
</simpara>
<note>
<simpara>
Una forma de abrir el fichero es usando un editor de texto basado en UNIX en el
Terminal, como por ejemplo <literal>nano</literal>. Debido a que el fichero
pertenece al usuario <literal>root</literal> se debe emplear el comando <literal>sudo</literal>
para abrirlo (como si fueramos el usuario <literal>root</literal>). Por ejemplo, teclée
lo siguiente en el <literal>Terminal</literal> (tras lo cual le preguntará por la contraseña):
Una forma de abrirlo es utilizar un editor de texto Unix en
un terminal, por ejemplo, <literal>nano</literal>, y sabiendo que el
fichero es propiedad del usuario <literal>root</literal>,
deberá utilizar el comando <literal>sudo</literal> para abrirlo
(como <literal>root</literal>); además, deberá introducir
el siguiente comando en su <literal>Terminal</literal> (se le pedirá su
contraseña):
<literal>sudo nano /private/etc/apache2/httpd.conf</literal>
</simpara>
<simpara>
Comandos de nano a tener en cuenta: <literal>^w</literal> (buscar),
<literal>^o</literal> (guardar), and <literal>^x</literal> (salir) donde
Algunos comandos de nano: <literal>^w</literal> (búsqueda),
<literal>^o</literal> (guardar), y <literal>^x</literal> (salida) donde
<literal>^</literal> representa la tecla Ctrl.
</simpara>
</note>
</note>
<note>
<simpara>
Las versiones de Mac OS X anteriores a 10.5 tienen incorporadas versiones
antiguas de PHP y Apache. Por ello, es posible que el fichero de configuracion
de Apache se encuentre en dichos equipos en <filename>/etc/httpd/httpd.conf</filename>.
Las versiones de Mac OS X anteriores a 10.5 proporcionan versiones antiguas de PHP y Apache. Además, el fichero de configuración
de Apache en las máquinas originales puede ser
<filename>/etc/httpd/httpd.conf</filename>.
</simpara>
</note>
</listitem>
<listitem>
<para>
En el editor de texto, descomente las líneas (eliminando el símbolo #) que sean
similares a las que se muestran a continuación (a menudo estas líneas se encuentran
separadas, asi que tendrá que localizar ambas en el fichero):
Con un editor de texto, descomente las líneas (borrando el carácter #)
que se parecen a las siguientes líneas (estas 2 líneas no se encuentran en el mismo lugar):
<screen>
<![CDATA[
# LoadModule php5_module libexec/httpd/libphp5.so
@@ -75,19 +74,19 @@
# AddModule mod_php5.c
]]>
</screen>
Fíjese en la localización/ruta de acceso. Cuando compile PHP en el futuro,
las lineas arriba indicadas deben ser reemplazadas o comentadas.
Tenga en cuenta la ruta. En el futuro, cuando compile PHP, los ficheros
anteriores deben ser reemplazados o comentados.
</para>
</listitem>
<listitem>
<para>
Asegúrese que las extensiones que desee puedan ser interpretadas como PHP
(por ejemplo: .php .html y .inc)
Asegúrese de que las extensiones deseadas sean analizadas por PHP (ejemplos:
<filename class="extension">.php</filename>, <filename class="extension">.html</filename> y <filename class="extension">.inc</filename>)
</para>
<para>
Como las siguientes sentencias ya existían en el <filename>httpd.conf</filename>
(desde el Max Panther), una vez se habilite PHP los ficheros <filename>.php</filename>
automáticamente seran interpretados como PHP.
Sabiendo que este comportamiento ya ha sido activado en su fichero
<filename>httpd.conf</filename> (desde Mac Panther), una vez activado PHP,
los ficheros <filename class="extension">.php</filename> serán automáticamente analizados por PHP.
<screen>
<![CDATA[
<IfModule mod_php5.c>
@@ -106,83 +105,88 @@
</para>
<note>
<para>
Con anterioridad a OS X 10.5 (Leopard) se empaquetaba PHP 4 en lugar de PHP 5,
en cuyo caso las instrucciones anteriores pueden ser ligeramente diferentes
cambiando los 5 por los 4.
Antes de OS X 10.5 (Leopard), PHP 4 se entregaba por defecto en lugar de PHP 5.
Por lo tanto, las instrucciones anteriores diferirán solo cambiando 5 por 4.
</para>
</note>
</listitem>
<listitem>
<simpara>
Asegúrese que DirectoryIndex carga el fichero por defecto index deseado
Asegúrese de que DirectoryIndex cargue el fichero index por defecto.
</simpara>
<simpara>
Esto tambien se configura en <filename>httpd.conf</filename>. Normalmente se usan
<filename>index.php</filename> y <filename>index.html</filename>. Por defecto
<filename>index.php</filename> está habilitado porque está incluido en la
comprobación de PHP mostrada arriba. Ajuste a conveniencia.
Esto también se define en el fichero <filename>httpd.conf</filename>.
Normalmente, los ficheros <filename>index.php</filename> y
<filename>index.html</filename> se utilizan. Por defecto,
<filename>index.php</filename> está activado porque también está
en la verificación de PHP anterior. Ajuste según sea necesario.
</simpara>
</listitem>
<listitem>
<simpara>
Configure la localizacion de &php.ini; o use el valor por defecto.
Defina la ruta hacia el fichero
&php.ini; o utilice la ruta por defecto.
</simpara>
<simpara>
Por defecto se localiza en los Mac OS X en <filename>/usr/local/php/php.ini</filename>
y empleando <function>phpinfo</function> se puede obtener esta información.
Si no se está usando &php.ini;, PHP usará los valores por defecto. Véase
también las preguntas frecuentes relacionadas en <link linkend="faq.installation.phpini">finding php.ini</link>.
La ruta por defecto en macOS es
<filename>/usr/local/php/php.ini</filename> y una llamada a la función
<function>phpinfo</function> revelará esta información.
Si no se utiliza ningún fichero &php.ini;, PHP utilizará todos los valores
por defecto. Consulte la FAQ sobre
"<link linkend="faq.installation.phpini">encontrar el fichero php.ini</link>".
</simpara>
</listitem>
<listitem>
<simpara>
Localize o configure el <literal>DocumentRoot</literal>
Encuentre y defina el <literal>DocumentRoot</literal>
</simpara>
<simpara>
Éste es el directorio raíz de todos los ficheros web. Los ficheros en este directorio
son obtenidos del servidor web a fin de que los ficheros PHP sean ejecutados como PHP
antes de ser enviados al navegador. Una ruta de acceso típica es <filename>/Library/WebServer/Documents</filename>
pero puede ser configurada en <filename>httpd.conf</filename>. Como alternativa,
el <filename>DocumentRoot</filename> por defecto para usuarios individuales es
Este es el directorio principal para todos los ficheros Web. Los ficheros en
este directorio serán servidos por el servidor Web, y por lo tanto, los ficheros PHP
serán analizados por PHP antes de enviarlos al navegador. La ruta por defecto es <filename>/Library/WebServer/Documents</filename> pero puede
definirse a cualquier valor en el fichero
<filename>httpd.conf</filename>. Además, el directorio <filename>DocumentRoot</filename> para
los diferentes usuarios es
<filename>/Users/yourusername/Sites</filename>
</simpara>
</listitem>
<listitem>
<simpara>
Cree un fichero <function>phpinfo</function>
Cree un fichero <function>phpinfo</function>.
</simpara>
<para>
La función <function>phpinfo</function> muestra información sobre PHP. Considere
la creación de un fichero en el DocumentRoot que contenga el siguiente código PHP:
La función <function>phpinfo</function> muestra la información sobre PHP.
Cree un fichero en el DocumentRoot con el siguiente código PHP:
<programlisting role="php">
<![CDATA[
<?php phpinfo(); ?>
]]>
</programlisting>
</para>
</para>
</listitem>
<listitem>
<simpara>
Reinicie Apache, y cargue el fichero PHP creado arriba
Reinicie Apache y cargue el fichero PHP que acabamos de crear.
</simpara>
<para>
Para reiniciar, ejecute <literal>sudo apachectl graceful</literal> en el shell o
desactive/active la opción "Compartir Web" en las Preferencias del Sistema. Por defecto,
cargar ficheros locales en el navegador tiene una <acronym>URL</acronym> parecida a:
<filename>http://localhost/info.php</filename>. Usar DocumentRoot en el directorio
del usuario es otra opción, y la URL sería parecida a:
Para reiniciar, ejecute el comando <literal>sudo apachectl graceful</literal>
en un terminal o detenga/inicie la opción "Personal Web Server" en las
preferencias del sistema de macOS. Por defecto, la carga de ficheros locales en
el navegador se realiza a través de <acronym>URL</acronym> como esta:
<filename>http://localhost/info.php</filename> o, si está utilizando el DocumentRoot
de un directorio de usuario, la URL será:
<filename>http://localhost/~yourusername/info.php</filename>
</para>
</listitem>
</orderedlist>
</para>
<simpara>
<acronym>CLI</acronym> (o <acronym>CGI</acronym> en versiones antiguas) también es
llamado de forma correcta <filename>php</filename> y posiblemente existe como
<filename>/usr/bin/php</filename>. Abra el Terminal, lea la <link linkend="features.commandline">sección de línea de comando</link>
del manual de PHP, y ejecute <literal>php -v</literal> para comprobar la versión de PHP del
binario PHP. Una llamada a <function>phpinfo</function> también le mostrará
esta información.
<acronym>CLI</acronym> (o <acronym>CGI</acronym> en versiones anteriores) se llama
<filename>php</filename> y normalmente reside en
<filename>/usr/bin/php</filename>. Abra un terminal, lea la sección sobre
<link linkend="features.commandline">la línea de comandos</link> del manual de PHP, y
ejecute el comando <literal>php -v</literal> para verificar la versión de PHP de este binario. Una llamada a la función <function>phpinfo</function> también puede revelar esta
información.
</simpara>
</sect1>

View File

@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 3a0c7df3b6875a78c3f10c072d4239ecc63dd29d Maintainer: jvenegasperu Status: ready -->
<!-- EN-Revision: 9cc4767b2ddf65c4ed592c9deb818cbb2c9def7b Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes Maintainer: PhilDaiguille -->
<sect1 xml:id="install.macosx.compile" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Compilar PHP en Mac OS X</title>
<simpara>
Utilice la <link linkend="install.unix">guía de instalación en Unix</link> para
compilar PHP en OS X.
</simpara>
<title>Compilar PHP en macOS</title>
<simpara>
Consulte el <link linkend="install.unix">guía de instalación en Unix</link>
para compilar PHP en macOS.
</simpara>
</sect1>
<!-- Keep this comment at the end of the file

View File

@@ -1,16 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 303198cd29c8df046344ab04d029ce084e8a045d Maintainer: jorgeolaya Status: ready -->
<!-- EN-Revision: 4cb53ecbd763db2db808e90d7eda63afb380e6df Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<chapter xml:id="install.macosx" xmlns="http://docbook.org/ns/docbook">
<title>Instalación en Mac OS X</title>
<para>
Esta sección contiene notas y sugerencias específicas para la instalación
de PHP en Mac OS X. PHP se incluye con Mac, y la compilación es similar
a la <link linkend="install.unix">guía de instalación Unix </link>.
</para>
<title>Instalación en un sistema macOS</title>
<simpara>
PHP estaba incluido con macOS en las versiones 10 y 11, pero ya no está incluido
desde la versión macOS 12 (Monterey). La instalación en las versiones recientes
requiere ya sea el uso de paquetes provenientes de fuentes de terceros, ya sea la
compilación a partir del código fuente.
</simpara>
&install.macos.packages;
&install.macos.bundled;
&install.macos.compile;
&install.macos.bundled;
</chapter>
<!-- Keep this comment at the end of the file

View File

@@ -1,51 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 97e6a27891cb2ab0b1c57f24628b74b7cc7c7021 Maintainer: seros Status: ready -->
<!-- Reviewed: yes Maintainer: seros -->
<!-- EN-Revision: e8ac70bf549a723cb36465667a6109d9933b8619 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="install.macosx.packages" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Empleo de paquetes</title>
<title>Instalación en macOS utilizando paquetes de terceros</title>
<simpara>
Hay algunas versiones preempaquetadas y precompiladas de PHP para
Mac OS X. Esto puede ayudar en la creación de una configuración estándar,
pero si fuera necesario tener un conjunto diferente de características
(como un servidor seguro, o un controlador de base de datos diferente), es posible
que sea necesario construir PHP y/o un servidor web. Si no está familiarizado
con la construcción y compilación de su propio software, vale la pena
revisar si alguien ya ha construido una versión empaquetada de PHP
con las características que necesita.
Existen algunas versiones pre-empaquetadas y pre-compiladas
de PHP para macOS. Esto puede ser útil para configurar una instalación
estándar, pero si se necesita acceder a funcionalidades
específicas (como un servidor seguro, o un controlador de bases de datos
exóticas), se necesario compilar PHP y/o el servidor web por cuenta propia.
Si no se está familiarizado con la compilación y la configuración
de aplicaciones, es recomendable verificar si alguien más ha creado un paquete
que contenga las funcionalidades deseadas.
</simpara>
<simpara>
Los siguientes recursos ofrecen paquetes fáciles de instalar y
binarios precompilados para PHP en Mac OS:
Una manera sencilla de instalar PHP en macOS es utilizando el gestor de paquetes
<link xlink:href="&url.brew;">Homebrew</link>.
</simpara>
<para>
<itemizedlist>
<listitem>
<simpara>
MacPorts:
<link xlink:href="&url.mac.macports;">&url.mac.macports;</link>
</simpara>
</listitem>
<listitem>
<simpara>
Liip:
<link xlink:href="&url.mac.liip;">&url.mac.liip;</link>
</simpara>
</listitem>
<listitem>
<simpara>
Fink:
<link xlink:href="&url.mac.fink;">&url.mac.fink;</link>
</simpara>
</listitem>
<listitem>
<simpara>
Homebrew:
<link xlink:href="&url.mac.homebrew;">&url.mac.homebrew;</link>
</simpara>
</listitem>
</itemizedlist>
</para>
<orderedlist>
<listitem>
<para>
Instalar homebrew, siguiendo las instrucciones en el sitio web.
</para>
</listitem>
<listitem>
<simpara>
<command>brew install php</command>
</simpara>
</listitem>
</orderedlist>
<simpara>
Los siguientes recursos alternativos ofrecen la posibilidad de instalar paquetes
y binarios precompilados para PHP en macOS:
</simpara>
<simplelist>
<member>
<link xlink:href="&url.mac.macports;">MacPorts</link>
</member>
<member>
<link xlink:href="&url.mac.fink;">Fink</link>
</member>
</simplelist>
</sect1>
<!-- Keep this comment at the end of the file

View File

@@ -1,74 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: cff92b78c8a65b7a115d8ac2bbe83bcc61fa8f87 Maintainer: seros Status: ready -->
<!-- Reviewed: no -->
<!-- EN-Revision: 111535af69b070980330fe83ed2eab5ca759c73d Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<chapter xml:id="install.pecl" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Instalación de extensiones PECL</title>
<sect1 xml:id="install.pecl.intro">
<title>Introducción a las Instalaciones en PECL</title>
<title>Introducción a las instalaciones PECL</title>
<simpara>
<link xlink:href="&url.pecl;">PECL</link> es un repositorio de extensiones de PHP
disponible mediante el sistema de paquetes <link xlink:href="&url.php.pear;">PEAR</link>.
Esta sección del manual tiene por objetivo ilustrar cómo obtener e instalar
extensiones PECL.
&link.pecl; es un depósito de extensiones PHP
que están disponibles a través del sistema de paquetes
<link xlink:href="&url.php.pear;">PEAR</link>. Esta sección del manual tiene como objetivo presentar
la manera de obtener e instalar las extensiones de PECL.
</simpara>
<simpara>
Estas instrucciones asumen que la ruta al fuente de su distribución de PHP es
<literal>/your/phpsrcdir/</literal>, y que <literal>extname</literal> es el nombre
de la extensión PECL. Ajuste a sus valores. Estas instrucciones, además, asumen
conocimientos del <link xlink:href="&url.php.pear.cli;">comando pear</link>.
La información del manual de PEAR para el comando <literal>pear</literal> también
es aplicable al comando <literal>pecl</literal>.
Estas instrucciones suponen que <literal>/path/to/php/src/dir/</literal> es la
ruta hasta las fuentes de la distribución PHP, y <literal>extname</literal> es el nombre
de la extensión PECL. Ajuste las siguientes instrucciones en consecuencia.
Estas instrucciones también suponen una familiaridad con el uso de
los <link xlink:href="&url.php.pear.cli;">comandos pear</link>.
La información en el manual PEAR para el comando <command>pear</command>
también es aplicable al comando <command>pecl</command>.
</simpara>
<simpara>
Para poder usarse, una extensión compartida se debe construir, instalar, y cargar.
Los métodos descritos abajo le proporcionan varias instrucciones para construir
e instalar extensiones, pero no se cargan automáticamente.
Éstas se pueden cargar añadiendo una directiva <link
linkend="ini.extension">extension</link>. al fichero &php.ini;,
o bien mediante el uso de la función <function>dl</function>.
Una extensión compartida debe ser compilada, instalada y cargada para ser
utilizada. Los métodos descritos a continuación proporcionan diversas
instrucciones sobre cómo compilar e instalar extensiones, pero no las cargan automáticamente. Las extensiones pueden ser cargadas
agregando una directiva de <link linkend="ini.extension">extensión</link>
al fichero &php.ini; o utilizando la función <function>dl</function>.
</simpara>
<simpara>
Al construir un módulo PHP, es importante contar con las versiones correctas
de las herramientas requeridas (autoconf, automake, libtool, etc.). Para
conocer los detalles de las herramientas requeridas y sus versiones, revise las
<link xlink:href="&url.php.anongit;">Instrucciones de Git Anónimo</link>.
Al compilar módulos PHP, es importante tener las herramientas en sus versiones apropiadas, tales como autoconf, automake, libtool, etc. Consulte las
<link xlink:href="&url.php.anongit;">Instrucciones para el Git anónimo</link>, para
conocer las utilidades necesarias y sus versiones.
</simpara>
</sect1>
<sect1 xml:id="install.pecl.downloads">
<title>Descarga de extensiones PECL</title>
<title>Descargar extensiones PECL</title>
<simpara>
Existen varias opciones para descargar extensiones PECL, a saber:
Existen varias maneras de descargar extensiones PECL:
</simpara>
<itemizedlist>
<listitem>
<simpara>
El comando <literal>pecl install extname</literal> descarga el código
de la extensión automáticamente, de modo que en este caso no se hace necesario
realizar una descarga por separado.
</simpara>
</listitem>
<simpara>
El comando <command>pecl install extname</command> descarga el código
de las extensiones automáticamente, lo que evita realizar
una descarga particular.
</simpara>
<listitem>
<simpara>
<link xlink:href="&url.pecl;">&url.pecl;</link>
</simpara>
<simpara>
La página web de PECL contiene información sobre las diferentes extensiones
que ofrece el Equipo de Desarrollo de PHP. La información disponible aquí
incluye: ChangeLog, notas de la versión, requisitos, y otros detalles similares.
El sitio web de PECL contiene diversa información sobre las diferentes extensiones
ofrecidas por el equipo de desarrollo de PHP.
Varias informaciones están disponibles, incluyendo los cambios
entre las versiones, las notas de versiones, lo que es requerido para hacer funcionar la extensión
así como otros detalles similares.
</simpara>
</listitem>
<listitem>
<simpara>
<literal>pecl download extname</literal>
<command>pecl download extname</command>
</simpara>
<simpara>
Puede descargar e instalar las extensiones PECL listadas en el sitio
web de PECL usando el <link xlink:href="&url.php.pear.cli;">comando pecl</link>.
También se podrán especificar versiones concretas.
Las extensiones PECL listadas en el sitio web de PECL están disponibles
y pueden ser descargadas e instaladas utilizando la
<link xlink:href="&url.php.pear.cli;">comando pecl</link>.
La versión específica de la extensión también puede ser especificada.
</simpara>
</listitem>
<listitem>
<simpara>
<acronym>git</acronym>
</simpara>
<simpara>
Muchas extensiones PECL permanecen en GitHub.
<!-- TODO Expand -->
</simpara>
</listitem>
<listitem>
@@ -76,100 +83,104 @@
<acronym>SVN</acronym>
</simpara>
<simpara>
La mayor parte de las extensiones PECL también están alojadas en <acronym>SVN</acronym>.
Puede consultar la interfaz web en <link xlink:href="&url.php.svn;pecl/">&url.php.svn;pecl/</link>.
Para descargar directamente del <acronym>SVN</acronym>, debe usar la siguiente
secuencia de comandos:
Algunas extensiones PECL permanecen en <acronym>SVN</acronym>.
Una interfaz web está disponible en <link xlink:href="&url.php.svn;pecl/">&url.php.svn;pecl/</link>.
Para descargar directamente desde <acronym>SVN</acronym>, la siguiente secuencia de instrucciones
puede ser utilizada:
</simpara>
<para>
<screen>
$ svn checkout http://svn.php.net/repository/pecl/extname/trunk extname
</screen>
</para>
<screen>
<![CDATA[
$ svn checkout https://svn.php.net/repository/pecl/extname/trunk extname
]]>
</screen>
</listitem>
<listitem>
<simpara>
Descargas para Windows
Descargas para Windows:
</simpara>
<simpara>
El proyecto PHP compila y ofrece DLL de Windows para la mayoría de
extensiones PECL en la página del paquete respectivo.
El proyecto PHP compila y ofrece DLLs de Windows para la mayoría de las
extensiones PECL disponibles en la página del paquete.
</simpara>
</listitem>
</itemizedlist>
</sect1>
<sect1 xml:id="install.pecl.windows">
<title>Instalación una extensión de PHP en Windows</title>
<title>Instalar una extensión PHP en Windows</title>
<para>
Dispone de dos formas para cargar extensiones PHP en Windows: o bien compilándolas en PHP,
o bien cargando su DLL. El método recomendado y más sencillo es cargar una extensión pre-compilada.
Existen dos maneras de cargar una extensión PHP en Windows:
o bien compilarla en PHP, o bien cargar una DLL. Cargar una
extensión precompilada es el método más práctico y recomendado.
</para>
<para>
Para cargar una extensión, debe estar disponible como fichero ".dll" en su sistema.
Todas las extensiones son compiladas por el Grupo PHP automática y periódicamente
(revise la siguiente sección para realizar descargas).
Para cargar una extensión, su fichero <filename>.dll</filename> debe estar disponible en el sistema.
Todas las extensiones son automáticamente y periódicamente compiladas por el grupo PHP
(ver la sección de descargas).
</para>
<para>
Para compilar una extensión en PHP, por favor, acceda a la documentación de
<link linkend="install.windows.building">construcción de la fuente</link>.
Para compilar una extensión en PHP, consulte la
documentación sobre <link linkend="install.windows.building">
la compilación de las fuentes</link>.
</para>
<para>
Para compilar una extensión independiente (o lo que es lo mismo, un fichero DLL), por favor, revise la
documentación de <link linkend="install.windows.building">construcción de la fuente</link>.
Si el fichero DLL no está disponible ni en su distribución de PHP ni en PECL, deberá compilarla
antes de poder comenzar a usarla.
Para compilar una extensión autónoma, (es decir, un fichero DLL), consulte la
documentación sobre <link linkend="install.windows.building">
la compilación de las fuentes</link>. Si el fichero DLL no está presente en la distribución
PHP y PECL, puede ser necesario compilarlo antes de poder utilizarlo.
</para>
<sect2 xml:id="install.pecl.windows.find">
<title>¿Dónde encontrar una extensión?</title>
<para>
Las extensiones de PHP generalmente se llaman "php_*.dll" (donde el asterisco representa
el nombre de la extensión) y se localizan bajo la carpeta "PHP\ext".
Las extensiones PHP generalmente se llaman <filename>php_*.dll</filename> (donde los asteriscos
representan el nombre de la extensión) y se encuentran en la carpeta
<filename>PHP\ext</filename>.
</para>
<para>
PHP se distribuye con las extensiones más útiles para la mayoría de desarrolladores. Se les llama
extensiones del "núcleo".
PHP se entrega con las extensiones que son más útiles para la mayoría de los usuarios.
Se llaman extensiones <emphasis>integradas</emphasis>, o <emphasis>bundled</emphasis>.
</para>
<para>
En cualquier caso, si necesita una funcionalidad que no proporciona ninguna de las extensiones
del núcleo, podrá buscarla en PECL. La Biblioteca de la Comunidad de Extensiones de PHP (PECL) es
un repositorio de extensiones PHP, que proporciona un directorio de todas las extensiones conocidas,
y aloja utilidades para descargar y desarrollar extensiones de PHP.
Sin embargo, si las extensiones integradas no proporcionan la funcionalidad necesaria,
una extensión que lo haga puede encontrarse en &link.pecl;.
La Biblioteca de Extensiones Comunitarias de PHP (PECL, también llamada Biblioteca de Extensiones Comunitarias de PHP)
es un depósito para las extensiones PHP, proporcionando un directorio de todas las extensiones conocidas y
facilidades de alojamiento para la descarga y el desarrollo de extensiones PHP.
</para>
<para>
Si usted ha desarrollado una extensión para su propio uso, quizá quiera considerar alojarla
en PECL, de forma que otros desarrolladores con las mismas necesidades puedan verse beneficiados
de su tiempo. Una de las ventajas es que tendrá la oportunidad de recibir colaboración,
(ojalá) agradecimientos, informes de errores, e incluso parches/correcciones. Antes de enviar
su extensión para ser alojada en PECL, por favor, lea
<link xlink:href="&url.pecl.submit;">el envío a PECL</link>.
Si una extensión ha sido desarrollada para un uso particular, puede ser alojada en PECL para que
otras personas con las mismas necesidades puedan beneficiarse de ella.
Un efecto secundario interesante es que es una buena oportunidad para recibir comentarios,
(con un poco de suerte) agradecimientos, informes de errores y, a veces, correcciones. Antes de
enviar una extensión para alojamiento en PECL, por favor lea
<link xlink:href="&url.pecl.submit;">PECL submit</link>.
</para>
</sect2>
<sect2 xml:id="install.pecl.windows.which">
<title>¿Qué extensión descargar?</title>
<title>¿Qué extensiones descargar?</title>
<para>
<emphasis>A menudo, encontrará varias versiones de cada DLL:</emphasis>
<emphasis>A menudo hay varias versiones de cada DLL:</emphasis>
<itemizedlist>
<listitem>
<simpara>
Números de versión diferentes (al menos los dos primeros números deben coincidir)
Diferentes números de versiones (al menos, los dos primeros dígitos deben ser los mismos)
</simpara>
</listitem>
<listitem>
<simpara>
Diferentes ajustes de seguridad en hilos
Diferentes configuraciones de seguridad de hilos
</simpara>
</listitem>
<listitem>
<simpara>
Diferentes arquitecturas de procesadores (x86, x64, ...)
Diferentes arquitecturas de procesadores (x86, x64...)
</simpara>
</listitem>
<listitem>
<simpara>
Diferentes ajustes de depuración
Diferentes configuraciones de depuración
</simpara>
</listitem>
<listitem>
@@ -180,13 +191,13 @@
</itemizedlist>
</para>
<para>
Debe tener en cuenta que los ajustes de su extensión deben coincidir con la configuración
del ejecutable de PHP que está utilizando. El siguiente script de PHP le dirá
<emphasis>todo</emphasis> sobre sus ajustes de PHP:
Se recomienda elegir las extensiones para que se adapten
a la máquina servidor en la que se utiliza PHP. El siguiente script
mostrará <emphasis>todas</emphasis> las configuraciones de PHP:
</para>
<para>
<example>
<title>llamada a <function>phpinfo</function></title>
<title>Llamada a la función <function>phpinfo</function></title>
<programlisting role="php">
<![CDATA[
<?php
@@ -197,152 +208,154 @@ phpinfo();
</example>
</para>
<para>
O ejecute desde la línea de comandos:
O bien, en línea de comandos:
<screen>
<![CDATA[
drive:\\path\to\php\executable\php.exe -i
drive:\path\to\php\executable\php.exe -i
]]>
</screen>
</para>
</sect2>
<sect2 xml:id="install.pecl.windows.loading">
<title>Cargando una extensión</title>
<title>Cargar una extensión</title>
<para>
La forma más común de cargar una extensión PHP consiste en incluirla en el fichero de configuración
<filename>php.ini</filename>. Por favor, tenga en cuenta que ya hay muchas extensiones
presentes en el fichero <filename>php.ini</filename> y que sólo es necesario eliminar el punto y coma
para activarlas.
La manera más común de cargar una extensión PHP es incluirla en el
fichero de configuración &php.ini;. Se debe tener en cuenta que muchas extensiones
ya están presentes en el fichero &php.ini; y que simplemente se debe eliminar el punto y coma para activarlas.
</para>
<para>
Observe que en versiones de PHP 7.2.0 y superiores, se podría utilizar el nombre de extensión en lugar del nombre de fichero de la extensión. Ya que esto es independiente del SO y más sencillo, especialmente para recién llegados, se convierte en la forma recomendada de especificar estensiones a cargar. El soporte para nombres de ficheros permanece por compatibilidad con versiones anteriores.
A partir de PHP 7.2.0, el nombre de la extensión puede ser utilizado en lugar
del nombre del fichero de la extensión. Como es independiente del sistema operativo y más fácil,
especialmente para los nuevos usuarios, se convierte en la manera recomendada
de especificar las extensiones a cargar. Los nombres de los ficheros siguen siendo soportados para la compatibilidad con las versiones anteriores.
</para>
<screen>
<screen>
<![CDATA[
;extension=php_extname.dll
]]>
</screen>
<screen>
</screen>
<screen>
<![CDATA[
extension=php_extname.dll
]]>
</screen>
<screen>
</screen>
<screen>
<![CDATA[
; On PHP version 7.2 and up, prefer :
; A partir de PHP 7.2, favorizar:
extension=extname
zend_extension=another_extension
]]>
</screen>
</screen>
<para>
Sin embargo, algunos servidores web puede resultar confusos, dado que no utilizan el <filename>php.ini</filename>
ubicado junto al ejecutable de PHP. Para averiguar dónde se localiza el <filename>php.ini</filename> en uso,
consulte su ruta usando <function>phpinfo</function>:
Sin embargo, algunos servidores web son confusos, ya que no utilizan el fichero
&php.ini; almacenado con el ejecutable PHP. Para saber más sobre el verdadero
&php.ini; utilizado, es posible buscar su ubicación utilizando <function>phpinfo</function>:
</para>
<screen>
<screen>
<![CDATA[
Configuration File (php.ini) Path C:\WINDOWS
Configuration File (php.ini) Path C:\WINDOWS
]]>
</screen>
<screen>
</screen>
<screen>
<![CDATA[
Loaded Configuration File C:\Program Files\PHP\5.2\php.ini
Loaded Configuration File C:\Program Files\PHP\8.2\php.ini
]]>
</screen>
</screen>
<para>
Tras activar una extensión, guarde el fichero <filename>php.ini</filename>, reinicie el servidor web y
vuelva a comprobar <function>phpinfo</function>. La nueva extensión debe ahora tener su propia sección.
Después de activar una extensión, guarde el fichero &php.ini;, y
reinicie el servidor web, luego verifique nuevamente el fichero <function>phpinfo</function>.
La nueva extensión debería tener su sección allí.
</para>
</sect2>
<sect2 xml:id="install.pecl.windows.problemsolving">
<title>Resolviendo problemas</title>
<title>Resolución de problemas</title>
<para>
Si la extensión no aparece en <function>phpinfo</function>, compruebe los registro de errores
para conocer qué provoca el problema.
Si la extensión no aparece en <function>phpinfo</function>,
es conveniente verificar los registros para saber de dónde viene el problema.
</para>
<para>
Si está utilizando PHP desde la línea de comandos (CLI), podrá leer directamente en pantalla
el error en la carga de la extensión.
Si PHP se utiliza en línea de comandos (CLI), el error de carga de la extensión
debería ser legible directamente en la pantalla.
</para>
<para>
Si está usando PHP en un servidor web, la localización y formato de los registros vería en función
de su software. Por favor, lea la documentación de su servidor web para localizar los registros,
dado que esto no lo gestiona el propio ejecutable de PHP.
Si PHP se utiliza en un servidor web, la posición y el formato de los registros
varían considerablemente de un servidor a otro. Lea la documentación del
servidor web para saber dónde se encuentran: PHP no tiene control sobre esta ubicación.
</para>
<para>
Los problemas más comunes son la ubicación del fichero DLL, el valor de "<link linkend="ini.extension-dir">
extension_dir</link>" en <filename>php.ini</filename>, y desajustes de configuración en tiempo
de compilación.
Los problemas más comunes son la ubicación del fichero DLL y
las DLLs de las que depende, el valor de la directiva
"<link linkend="ini.extension-dir">extension_dir</link>"
en el &php.ini; y las inconsistencias de compilación.
</para>
<para>
Si el problema reside en desajustes de configuración en tiempo de compilación, seguramente se deba a que no
se ha descargado el fichero DLL correcto. Pruebe a descargar de nuevo la extensión con los ajustes correctos.
De nuevo, <function>phpinfo</function> puede resultar de gran ayuda.
Si el problema es una inconsistencia de compilación, la DLL descargada probablemente no es
la correcta. Intente descargar una nueva, con las configuraciones correctas del servidor. <function>phpinfo</function> será muy útil.
</para>
</sect2>
</sect1>
<sect1 xml:id="install.pecl.pear">
<title>Compilando extensiones PECL compartidas con el comando pecl</title>
<title>Compilación de extensiones PECL compartidas con el comando pecl</title>
<simpara>
PECL facilita la creación de extensiones PHP compartidas. Usando el
PECL facilita la creación de extensiones PHP compartidas. Utilizando la
<link xlink:href="&url.php.pear.cli;">comando pecl</link>, haga lo siguiente:
</simpara>
<para>
<screen>
$ pecl install extname
</screen>
</para>
<screen>
<![CDATA[
$ pecl install extname
]]>
</screen>
<simpara>
Esto descargará el código fuente de <emphasis>extname</emphasis>,
lo compilará, e instalará <filename>extname.so</filename> en su <link
linkend="ini.extension-dir">extension_dir</link>.
Ahora se puede cargar <filename>extname.so</filename> mediante &php.ini;
Esto descargará el fichero fuente de la extensión <emphasis>extname</emphasis>,
lo compilará e instalará el fichero <filename>extname.so</filename> en el
directorio <link linkend="ini.extension-dir">extension_dir</link>.
<filename>extname.so</filename> debe luego ser cargado a través de &php.ini;.
</simpara>
<simpara>
Por omisión, el comando <literal>pecl</literal> no instalará paquetes
marcados en los estados <literal>alpha</literal> o <literal>beta</literal>.
Si no hay paquetes disponibles en estado <literal>stable</literal>,
podrá instalar un paquete en estado <literal>beta</literal> utilizando el siguiente
comando:
Por defecto, el comando <command>pecl</command> no instalará los paquetes
marcados como <literal>alpha</literal> o
<literal>beta</literal>. Si no hay ningún paquete <literal>stable</literal> disponible,
es posible instalar un paquete <literal>beta</literal> utilizando el siguiente comando:
</simpara>
<screen>
<![CDATA[
$ pecl install extname-beta
]]>
</screen>
<para>
<screen>
$ pecl install extname-beta
</screen>
</para>
<para>
Del mismo modo, podrá también instalar una versión en concreto usando esta variante:
</para>
<para>
<screen>
$ pecl install extname-0.1
</screen>
También es posible instalar una versión específica utilizando el siguiente comando:
</para>
<screen>
<![CDATA[
$ pecl install extname-0.1
]]>
</screen>
<note>
<para>
Tras activar la extensión en &php.ini;, será necesario reiniciar el servidor web
para hacer efectivos los cambios.
Después de activar la extensión en el &php.ini;, es necesario reiniciar el servidor web
para que se tenga en cuenta.
</para>
</note>
</sect1>
<sect1 xml:id="install.pecl.phpize">
<title>Compilando extensiones PEC compartidas con phpize</title>
<title>Compilación de extensiones compartidas con phpize</title>
<simpara>
A menudo no es posible utilizar el instalador <literal>pecl</literal>.
Esto se puede deber a que se encuentra tras un cortafuegos, o a que
la extensión que trata de instalar no está disponible como paquete compatible
con PECL, como por ejemplo extensiones no liberadas desde el SVN. Si necesita
construir una extensión de este tipo, puede llevar a cabo esta tarea manualmente
utilizando las herramientas de construcción de bajo nivel.
A veces, el uso del instalador <command>pecl</command> no es una opción.
Esto puede deberse a la presencia de un cortafuegos o al hecho de que la extensión en curso
de instalación no está disponible como un paquete PECL compatible, como las
extensiones no publicadas provenientes de git. Si se debe construir una extensión de este tipo,
las herramientas de construcción de nivel inferior pueden ser utilizadas para realizar
la construcción manualmente.
</simpara>
<simpara>
El comando <literal>phpize</literal> se utiliza para preparar el entorno
de compilación de la extensión de PHP. En el siguiente ejemplo, el fuente de una extensión
se ubica en un directorio llamado <filename>extname</filename>:
El comando <command>phpize</command> se utiliza para preparar
el entorno de compilación para una extensión PHP. En el siguiente ejemplo, las
fuentes de la extensión están en una carpeta llamada <filename>extname</filename>:
</simpara>
<para>
<screen>
@@ -356,41 +369,44 @@ $ make
</screen>
</para>
<simpara>
En caso de que la instalación sea correcta, se creará <filename>extname.so</filename>
y se salvará en el <link linkend="ini.extension-dir">directorio de extensiones</link>
de PHP. Quizá necesite ajustar el fichero &php.ini; y añadir una línea
<literal>extension=extname.so</literal> antes de poder usar la extensión.
Una instalación exitosa creará un fichero <filename>extname.so</filename>
y lo colocará en el <link linkend="ini.extension-dir">directorio de extensiones</link>
de PHP. El &php.ini; deberá ser ajustado, y la línea <literal>extension=extname.so</literal>
agregada antes de poder utilizar la extensión.
</simpara>
<simpara>
Si el sistema no contiene el comando <literal>phpize</literal>, y se están utilizando
paquetes pre-compilados (como RPM), asegúrese de instalar también la
versión de desarrollo apropiada del paquete PHP, dado que a menudo incluyen
el comando <literal>phpize</literal> con los ficheros de cabeceras necesarios
para construir PHP y sus extensiones.
Si el sistema no posee el comando <command>phpize</command> y se utilizan paquetes precompilados (como RPM), es necesario asegurarse de instalar
también la versión de desarrollo apropiada de los paquetes PHP ya que
incluye también el comando <literal>phpize</literal> así como los encabezados
apropiados para construir PHP y sus extensiones.
</simpara>
<simpara>
Ejecute <command>phpize --help</command> para mostrar información de uso adicional.
Ejecute el comando <command>phpize --help</command> para mostrar información
de uso adicional.
</simpara>
</sect1>
<sect1 xml:id="install.pecl.php-config">
<title>php-config</title>
<title>
<command>php-config</command>
</title>
<para>
php-config es una utilidad de consola que permite obtener información sobre
la configuración de la instalación de PHP.
<command>php-config</command> es un pequeño script shell para obtener información
sobre la configuración instalada de PHP.
</para>
<para>
A la hora de compilar extensiones, si se tuvieran varias versiones de PHP instaladas,
se podrá especificar sobre cuál se va a construir usando el modificador
<literal>--with-php-config</literal> durante la configuración, donde especificaremos
la ruta a su respecto script php-config.
Al compilar extensiones, si se instalan varias versiones de PHP,
la instalación para la cual se debe construir puede ser especificada utilizando la opción
<option role="configure">--with-php-config</option> durante la configuración, definiendo
la ruta del script <command>php-config</command> correspondiente.
</para>
<para>
En cualquier momento podrá consutlarse la lista de opciones de la utilidad php-config
ejecutando php-config con el modificador <option>-h</option>:
La lista de opciones de línea de comandos proporcionadas por el script
<command>php-config</command> puede ser obtenida ejecutando el script <command>php-config</command>
con la opción <option>-h</option>:
<screen>
<![CDATA[
Usage: /usr/local/bin/php-config [OPTION]
@@ -423,31 +439,32 @@ Options:
<tbody>
<row>
<entry>--prefix</entry>
<entry>Prefijo del directorio donde PHP está instalado, p.ej. /usr/local</entry>
<entry>Prefijo del directorio donde PHP está instalado, i.e. /usr/local</entry>
</row>
<row>
<entry>--includes</entry>
<entry>Lista de opciones -I con todos los ficheros incluídos</entry>
<entry>Lista de las opciones <literal>-I</literal> con todos los ficheros incluidos</entry>
</row>
<row>
<entry>--ldflags</entry>
<entry>Banderas LD con las que se ha compilado PHP</entry>
<entry>Banderas <literal>LD</literal> que han sido compiladas con PHP</entry>
</row>
<row>
<entry>--libs</entry>
<entry>Bibliotecas extras con las que se ha compilado PHP</entry>
<entry>Bibliotecas adicionales que han sido compiladas con PHP</entry>
</row>
<row>
<entry>--extension-dir</entry>
<entry>Directorio en el que se buscan por omisión las extensiones</entry>
<entry>Directorios donde las extensiones son buscadas por defecto</entry>
</row>
<row>
<entry>--include-dir</entry>
<entry>Prefijo de directorio donde se buscan por omisión los ficheros de cabeceras</entry>
<entry>Prefijo del directorio donde los encabezados de ficheros son
instalados por defecto</entry>
</row>
<row>
<entry>--php-binary</entry>
<entry>Ruta completa al binario de php CLI o CGI</entry>
<entry>Ruta completa hacia el CLI PHP o el binario CGI</entry>
</row>
<row>
<entry>--php-sapis</entry>
@@ -455,7 +472,8 @@ Options:
</row>
<row>
<entry>--configure-options</entry>
<entry>Opciones de configuración para recrear la configuración de la instalación actual de PHP</entry>
<entry>Opciones de configuración para recrear la configuración
de la instalación actual de PHP</entry>
</row>
<row>
<entry>--version</entry>
@@ -472,17 +490,17 @@ Options:
</sect1>
<sect1 xml:id="install.pecl.static">
<title>Compilando extensiones PECL estáticamente en PHP</title>
<title>Compilación de extensiones PECL estáticamente en PHP</title>
<simpara>
Quizá necesite construir una extensión PECL estáticamente en su binario
de PHP. Para hacer esto, necesitará ubicar el fuente de la extensión bajo
el directorio <filename>/su/directorio_fuentes_php/ext/</filename> e indicarle al sistema de
construcción de PHP que regenere su script de configuración.
Puede ser necesario construir una extensión PECL estáticamente en el binario PHP.
Para ello, las fuentes de la extensión deben ser colocadas en el directorio
<filename>/path/to/php/src/dir/ext/</filename>, y el sistema de compilación de PHP debe
regenerar su script de configuración.
</simpara>
<para>
<screen>
<![CDATA[
$ cd /your/phpsrcdir/ext
$ cd /path/to/php/src/dir/ext
$ pecl download extname
$ gzip -d < extname.tgz | tar -xvf -
$ mv extname-x.x.x extname
@@ -492,44 +510,53 @@ $ mv extname-x.x.x extname
<simpara>
Esto generará el siguiente directorio:
</simpara>
<para>
<screen>
/your/phpsrcdir/ext/extname
<screen>
<![CDATA[
/path/to/php/src/dir/ext/extname
]]>
</screen>
</para>
<simpara>
Desde aquí, fuerce a PHP a regenerar el script de configuración, y entonces
construya PHP con normalidad:
A partir de aquí, PHP debe ser forzado a reconstruir el script de configuración,
y luego puede ser construido normalmente:
</simpara>
<para>
<screen>
$ cd /your/phpsrcdir
$ rm configure
$ ./buildconf --force
$ ./configure --help
$ ./configure --with-extname --enable-someotherext --with-foobar
$ make
$ make install
<screen>
<![CDATA[
$ cd /path/to/php/src/dir
$ rm configure
$ ./buildconf --force
$ ./configure --help
$ ./configure --with-extname --enable-someotherext --with-foobar
$ make
$ make install
]]>
</screen>
</para>
<note>
<simpara>
Necesitará autoconf 2.13 y automake 1.4+ para ejecutar el
script 'buildconf' (es posible que funcionen versiones más recientes de autoconf,
pero no están oficialmente soportadas).
Para ejecutar el script <command>buildconf</command>,
<command>autoconf</command>
<literal>2.68</literal>
y
<command>automake</command>
<literal>1.4+</literal>
serán necesarios.
Las versiones más recientes de <command>autoconf</command> pueden funcionar pero no son soportadas.
</simpara>
</note>
<simpara>
Dependiendo de la extensión, utilizará <literal>--enable-extname</literal>
o <literal>--with-extname</literal>. Las extensiones que no requieren
de bibliotecas externas generalmente utilizan <literal>--enable</literal>.
Para asegurarse, ejecute el siguiente comando después de buildconf:
El uso de
<option role="configure">--enable-extname</option>
o
<option role="configure">--with-extname</option>
depende de la extensión.
En general, una extensión que no requiere bibliotecas externas utiliza
<option role="configure">--enable</option>.
Para asegurarse, ejecute el siguiente comando después de <command>buildconf</command>:
</simpara>
<para>
<screen>
$ ./configure --help | grep extname
</screen>
</para>
<screen>
<![CDATA[
$ ./configure --help | grep extname
]]>
</screen>
</sect1>
</chapter>

View File

@@ -1,229 +1,229 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 445962cfde047efd759cfc37006a5c5864864ef5 Maintainer: aeoris Status: ready -->
<!-- Reviewed: yes -->
<!-- EN-Revision: e51792efe0f103ec8724ad199524d7543610c978 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="install.unix.apache2" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Apache 2.x sobre sistemas Unix</title>
<title>Apache 2.x en sistemas Unix</title>
<para>
Esta sección contiene notas y consejos específicos a las instalaciones de Apache 2.x
de PHP sobre sistemas Unix.
Esta sección contiene las notas y consejos de instalación de PHP con el servidor
Apache 2.x en sistemas Unix.
</para>
&warn.apache2.compat;
<para>
La <link xlink:href="&url.apache2.docs;">Documentación de Apache</link>
es la fuente de información más autorizada acerca del servidor Apache 2.x.
Ahí se puede encontrar más información acerca de las opciones de
instalación.
La <link xlink:href="&url.apache2.docs;">Documentación Apache</link>
es la mejor fuente de información sobre el servidor Apache 2.x.
La mayoría de la información sobre las opciones de instalación de Apache
puede encontrarse allí.
</para>
<para>
La versión más reciente de Apache HTTP Server puede obtenerse del
<link xlink:href="&url.apache;">Sitio de descargas de Apache</link>,
y una versión apropiada de PHP de los lugares anteriormente mencionados.
Esta guía rápida solamente cubre lo básico para comenzar con Apache 2.x
y PHP. Para obtener más información lea la
<link xlink:href="&url.apache2.docs;">Documentación de Apache</link>.
Los números de versión han sido omitidos aquí, para asegurar que las
instrucciones no sean incorrectas. En los ejemplos siguientes, 'NN' deberá ser
reemplazado con la versión específica de Apache que se está utilizando.
La versión más reciente del servidor HTTP Apache puede obtenerse
desde la <link xlink:href="&url.apache;">página de descarga de Apache</link>,
y una versión adaptada de PHP desde los enlaces anteriores.
Esta guía cubre únicamente las bases de funcionamiento de Apache 2.x con PHP.
Para más información, leer la
<link xlink:href="&url.apache2.docs;">documentación Apache</link>.
Los números de versión se omiten aquí, para asegurarse de que las instrucciones no sean
incorrectas. En los ejemplos a continuación, 'NN' deberá ser reemplazado
por la versión específica de Apache a utilizar.
</para>
<para>
Existen actualmente dos versiones de Apache 2.x - está la 2.0 y la 2.2.
Mientras que existen varias razones para elegir cada una, la 2.2 es actualmente
la versión más reciente, y la que se recomienda, si es que esa opción está
disponible. Sin embargo, las instrucciones aquí funcionarán ya sea para
2.0 ó 2.2.
Actualmente hay 2 versiones de Apache 2.x - 2.4 y 2.2.
Hay varias razones para elegir una sobre la otra; sin embargo, la versión
2.4 es actualmente la última versión disponible y también la que recomendamos. Sin embargo, las instrucciones
contenidas en esta guía deberían funcionar para la versión 2.4 así como para la versión 2.2. Nota: Apache httpd 2.2 está oficialmente en Fin de Vida, no habrá más desarrollo ni parches para esta versión.
</para>
<orderedlist>
<listitem>
<para>Obténgase el servidor HTTP Apache de la ubicación listada con anterioridad,
y desempáquese:</para>
<para>
Descargue el servidor HTTP Apache desde el sitio anterior y descomprímalo :
</para>
<informalexample>
<screen>
<![CDATA[
gzip -d httpd-2_x_NN.tar.gz
tar -xf httpd-2_x_NN.tar
tar -xzf httpd-2.x.NN.tar.gz
]]>
</screen>
</informalexample>
</listitem>
<listitem>
<para>De la misma manera, obtener y desempacar las fuentes de PHP:</para>
<informalexample>
<screen>
</screen>
</informalexample>
</listitem>
<listitem>
<para>
De la misma manera, descargue y descomprima las fuentes de PHP :
</para>
<informalexample>
<screen>
<![CDATA[
gunzip php-NN.tar.gz
tar -xf php-NN.tar
tar -xzf php-NN.tar.gz
]]>
</screen>
</informalexample>
</listitem>
<listitem>
<para>
Compilar e instalar Apache. Consúltese la documentación de instalación de Apache para
mayores detalles sobre la compilación de Apache.
</para>
<informalexample>
<screen>
</screen>
</informalexample>
</listitem>
<listitem>
<para>
Compile e instale Apache. Consulte la documentación sobre la instalación
de Apache para más detalles sobre la compilación de este software.
</para>
<informalexample>
<screen>
<![CDATA[
cd httpd-2_x_NN
./configure --enable-so
make
make install
]]>
</screen>
</informalexample>
</listitem>
<listitem>
<para>
Ahora se tiene Apache 2.x.NN disponible debajo de /usr/local/apache2,
configurado con soporte para módulos cargables y con el MPM (Módulo de multiproceso) prefork estándar.
Para probar la instalación úsese el procedimiento para iniciar
el servidor Apache, por ej.:
<informalexample>
<screen>
</screen>
</informalexample>
</listitem>
<listitem>
<para>
Ahora que se tiene Apache 2.x.NN disponible bajo /usr/local/apache2,
configúrelo con soporte para la carga de módulos, así como el
MPM prefork estándar. Para probar la instalación, utilice el procedimiento
normal para iniciar el servidor Apache, es decir:
<informalexample>
<screen>
<![CDATA[
/usr/local/apache2/bin/apachectl start
]]>
</screen>
</informalexample>
y deténgase el servidor para proceder con la configuración para PHP:
<informalexample>
<screen>
</informalexample>
y deténgalo para continuar con la configuración de PHP :
<informalexample>
<screen>
<![CDATA[
/usr/local/apache2/bin/apachectl stop
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Ahora, configure y compile PHP. Aquí es donde se personaliza PHP
con varias opciones, como qué extensiones se han de habilitar. Ejecute
./configure --help para obtener una lista de opciones disponibles. En el ejemplo
se realiza un simple configure con soporte para Apache 2 y MySQL.
</para>
<para>
Si se compila Apache a partir de los fuentes, tal como se describe anteriormente, el siguiente ejemplo
coincidirá con la trayectoria para apxs, pero si se ha instalado Apache de alguna otra manera, será
necesario ajustar la trayectoria a apxs apropiadamente. Nótese que algunas distribuciones pueden renombrar
apxs cómo apxs2.
</para>
<informalexample>
<screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Ahora, configure y compile PHP. Será en este momento
cuando se podrá personalizar PHP con las diversas opciones disponibles,
como la lista de extensiones a activar. En nuestro ejemplo, realizaremos
una configuración simple, con Apache 2 y soporte MySQL.
</para>
<para>
Si se ha construido Apache desde las fuentes, tal como se describe anteriormente,
el siguiente ejemplo debería ser correcto en cuanto a las rutas hacia los apxs, pero si
se ha instalado Apache de otra manera, se deberán tener en cuenta las especificidades y ajustar las rutas apxs en consecuencia. Tenga en cuenta que, según las distribuciones, podría ser necesario renombrar apxs a apxs2.
</para>
<informalexample>
<screen>
<![CDATA[
cd ../php-NN
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql
make
make install
]]>
</screen>
</informalexample>
<para>
Si se decide a cambiar las opciones de configuración después de la instalación,
se deben volver a ejecutar los pasos configure, make, y make install.
Solamente se necesita
reiniciar apache para que el nuevo módulo tenga efecto. Una recompilación de
Apache no es necesaria.
</para>
<para>
Nótese que a menos que se indique lo contrario, 'make install' también instalará PEAR,
varias herramientas de PHP tales como phpize, instalará la interfaz de línea de comando (CLI) de PHP, y más.
</para>
</listitem>
<listitem>
<para>
Configurar php.ini
</para>
<informalexample>
<screen>
</screen>
</informalexample>
<para>
Si se decide modificar las opciones de configuración después de la instalación,
se deberán ejecutar nuevamente las etapas "configure", "make" y "make install".
Entonces solo se necesitará reiniciar Apache para que el nuevo módulo surta efecto.
Una recompilación de Apache no es necesaria.
</para>
<para>
Tenga en cuenta que, salvo indicaciones contrarias, la etapa "make install" también instalará
PEAR, así como diversas herramientas PHP como phpsize, PHP CLI y
mucho más.
</para>
</listitem>
<listitem>
<para>
Configurar el archivo php.ini
</para>
<informalexample>
<screen>
<![CDATA[
cp php.ini-development /usr/local/lib/php.ini
]]>
</screen>
</screen>
</informalexample>
<para>
Se puede editar el fichero .ini para fijar las opciones de PHP. Si se prefiere tener
php.ini en otra ubicación, utilice --with-config-file-path=/alguna/trayectoria en el
paso 5.
</para>
<para>
Si en vez de eso se elige php.ini-production, asegúrese de leer la lista
de cambios al interior, ya que afectan como se comporta PHP.
</para>
</listitem>
<listitem>
<para>
Edítese httpd.conf para cargar el módulo PHP. La trayectoria a la derecha
de la sentencia LoadModule debe apuntar a la trayectoria del módulo PHP
en el sistema. El make install anterior podría ya haber agregado
esto automáticamente, pero asegúrese de revisar.
</para>
<informalexample>
<para>
Para PHP 7:
</para>
<programlisting role="apache-conf">
<![CDATA[
LoadModule php7_module modules/libphp7.so
]]>
</programlisting>
</informalexample>
<para>
Se debe editar el archivo .ini para definir las opciones PHP.
Si se prefiere colocar este archivo en otro directorio, utilice
la opción <literal>--with-config-file-path=/some/path</literal> en la etapa 5.
</para>
<informalexample>
<para>
Para PHP 5:
</para>
<programlisting role="apache-conf">
<para>
Si se elige el archivo php.ini-production, asegúrese de leer la lista
de modificaciones correspondiente ya que puede afectar considerablemente la forma
en que PHP funcionará.
</para>
</listitem>
<listitem>
<para>
Edite el archivo <filename>httpd.conf</filename> para cargar el módulo PHP. La ruta especificada
a la derecha de la cadena LoadModule, debe corresponder a la ruta del sistema del módulo
PHP. La etapa "make install" anterior debería haber realizado esta operación
por usted, pero una simple verificación permitirá asegurarse.
</para>
<informalexample>
<para>
Para PHP 8:
</para>
<programlisting role="apache-conf">
<![CDATA[
LoadModule php5_module modules/libphp5.so
LoadModule php_module modules/libphp.so
]]>
</programlisting>
</informalexample>
</listitem>
<listitem>
<para>
Indicar a Apache que procese ciertas extensiones como PHP. Por ejemplo, hágase que
Apache procese ficheros .php como PHP. En vez de solamente utilizar la directiva de Apache
AddType, se desea evitar subidas de ficheros potencialmente peligrosas y que ficheros
creados tal como exploit.php.jpg sean ejecutados como PHP. Utilizando este
ejemplo, se puede hacer que cualquier extensión o extensiones sean procesadas como PHP simplemente
añadiéndolas. Se agregará .php para demostrarlo.
</para>
<informalexample>
</programlisting>
</informalexample>
<informalexample>
<para>
Para PHP 7:
</para>
<programlisting role="apache-conf">
<![CDATA[
LoadModule php7_module modules/libphp5.so
]]>
</programlisting>
</informalexample>
</listitem>
<listitem>
<para>
Indique a Apache que analice ciertas extensiones como scripts PHP.
Por ejemplo, deje que Apache pase a PHP los archivos cuya extensión es
<literal>.php</literal>.
En lugar de utilizar solo la directiva <literal>AddType</literal> de Apache,
se desea evitar cualquier riesgo potencialmente peligroso, cuando
se descarga y crea un archivo como <filename>exploit.php.jpg</filename>,
de ejecución PHP. Utilizando este ejemplo, se puede tener cualquier
extensión analizada por PHP. Se ha añadido <literal>.php</literal> para el ejemplo.
</para>
<informalexample>
<programlisting role="apache-conf">
<![CDATA[
<FilesMatch \.php$>
@@ -232,131 +232,131 @@ LoadModule php5_module modules/libphp5.so
]]>
</programlisting>
</informalexample>
<para>
O, si se deseara permitir que ficheros .php, .php2, .php3, .php4, .php5, .php6, y
.phtml fuesen ejecutados como PHP, pero nada más, se utilizaría esto:
</para>
<informalexample>
<programlisting role="apache-conf">
<para>
O, si se desea permitir que los archivos <literal>.php</literal>, <literal>.php2</literal>,
<literal>.php3</literal>, <literal>.php4</literal>, <literal>.php5</literal>,
<literal>.php6</literal>, y <literal>.phtml</literal> sean
analizados por PHP, pero nada más, se utilizará esto :
</para>
<informalexample>
<programlisting role="apache-conf">
<![CDATA[
<FilesMatch "\.ph(p[2-1]?|tml)$">
<FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
]]>
</programlisting>
</informalexample>
<para>
Y para permitir que ficheros .phps sean manejados por el filtro de fuentes de php, y
desplegado como código fuente con sintaxis resaltada, se utiliza esto:
</para>
<informalexample>
<programlisting role="apache-conf">
</programlisting>
</informalexample>
<para>
Y para permitir que los archivos <literal>.phps</literal> sean manejados por el filtro del código
fuente de PHP, y así, ser mostrados como código fuente con coloración
sintáctica, utilice esto :
</para>
<informalexample>
<programlisting role="apache-conf">
<![CDATA[
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
]]>
</programlisting>
</informalexample>
<para>
mod_rewrite puede ser utilizado para permitir que cualquier fichero .php arbitrario sea desplegado
como código fuente con sintaxis resaltada, sin tener que renombrarlo o copiarlo
a un fichero .phps:
</para>
<informalexample>
<programlisting role="apache-conf">
</programlisting>
</informalexample>
<para>
<literal>mod_rewrite</literal> puede ser utilizado para permitir que cualquier archivo <literal>.php</literal>
sea mostrado como código fuente con coloración sintáctica, sin necesidad de renombrarlo o copiarlo con una extensión <literal>.phps</literal>. :
</para>
<informalexample>
<programlisting role="apache-conf">
<![CDATA[
RewriteEngine On
RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]
]]>
</programlisting>
</informalexample>
<para>
El filtro de código fuente php no debe habilitarse en sistemas de producción, donde
podría exponer información confidencial o de alguna otra manera sensible incluida en
código fuente.
</para>
</listitem>
<listitem>
<para>
Utilícese el procedimiento normal para iniciar el servidor Apache, por ej.:
</para>
<informalexample>
<screen>
</programlisting>
</informalexample>
<para>
El filtro de código fuente PHP no debería estar activo en sistemas de
producción, ya que puede exponer código confidencial o información
sensible contenida en el código fuente.
</para>
</listitem>
<listitem>
<para>
Utilice el procedimiento normal para iniciar el servidor Apache, es decir:
</para>
<informalexample>
<screen>
<![CDATA[
/usr/local/apache2/bin/apachectl start
]]>
</screen>
</informalexample>
<para>O</para>
<informalexample>
<screen>
</informalexample>
<para>O</para>
<informalexample>
<screen>
<![CDATA[
service httpd restart
]]>
</screen>
</informalexample>
</listitem>
</orderedlist>
<para>
Siguiendo los pasos anteriores se tendrá corriendo un servidor web Apache2 con
soporte para PHP como un módulo <literal>SAPI</literal>. Por supuesto existen
muchas opciones más de configuración disponibles para Apache y PHP. Para más
información teclee <command>./configure --help</command> en el árbol de fuentes
correspondiente.
</para>
<para>
Apache se puede compilar con soporte multihilos seleccionando el
<filename>worker</filename> MPM, en vez del
<filename>prefork</filename> MPM standard, cuando Apache se compila. Esto se realiza
agregando la siguiente opción al argumento pasado a ./configure, en el
paso 3 anterior:
</para>
<informalexample>
<screen>
</informalexample>
</listitem>
</orderedlist>
<para>
Si se han seguido los pasos anteriores, ahora se tiene un servidor web
Apache2 funcional con soporte PHP como módulo <literal>SAPI</literal>.
Por supuesto, hay una multitud de otras opciones de configuración disponibles
con Apache y PHP. Para más información, introduzca el comando
<command>./configure --help</command> en el árbol de fuentes correspondiente.
</para>
<para>
Apache puede ser compilado en modo multithread, seleccionando
el MPM <filename>worker</filename>, en lugar del estándar
MPM <filename>prefork</filename>. Esto se hace añadiendo la siguiente opción al argumento de la comando "./configure", en la etapa 3 anterior :
</para>
<informalexample>
<screen>
<![CDATA[
--with-mpm=worker
]]>
</screen>
</informalexample>
<para>
Esto no debe llevarse a cabo sin ser consciente de las consecuencias de
esta decisión, y tener al menos un ligero entendimiento acerca de
las implicaciones. La documentación de Apache
al respecto de <link xlink:href="&url.apache2.mpm;">MPM-Modules</link>
discute los MPM en forma mucho más detallada.
</para>
<note>
<para>
Las <link linkend="faq.installation.apache.multiviews">Preguntas frecuentes
de Apache MultiViews</link> discute acerca del uso de multiviews con PHP.
</para>
</note>
<note>
<para>
Para compilar una versión multihilo de Apache, el sistema destino debe soportar hilos.
En este caso, PHP también debe compilarse con la opción Zend Thread Safety (ZTS)
experimental. Bajo esta configuración, no todas las extensiones se encontrarán disponibles.
La configuración recomendada es compilar Apache con el MPM-module
<filename>prefork</filename> por omisión.
</para>
</note>
</screen>
</informalexample>
<para>
Esto no debería emprenderse sin ser consciente de las consecuencias,
y teniendo al menos una justa comprensión de lo que implica.
La documentación de Apache sobre
<link xlink:href="&url.apache2.mpm;">MPM-Modules</link>
proporcionará información importante que permitirá tomar
la decisión.
</para>
<note>
<para>
La <link linkend="faq.installation.apache.multiviews">FAQ Apache
MultiViews</link> trata sobre el uso de MultiViews con PHP.
</para>
</note>
<note>
<para>
Para compilar una versión multithread de Apache, el sistema de destino
debe soportar threads. En este caso, PHP también debe ser construido
con Zend Thread Safety (ZTS). Bajo esta configuración, no todas las extensiones
estarán disponibles. Recomendamos compilar Apache con el
<filename>prefork</filename> MPM-Module.
</para>
</note>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
@@ -364,7 +364,7 @@ sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:0
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
@@ -373,7 +373,7 @@ sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=0 si
vim: et tw=0 syn=sgml
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -1,131 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 3049bd1d4a1bf7c75076e817aeba02e71c0013c2 Maintainer: lduran Status: ready -->
<!-- EN-Revision: 4cb53ecbd763db2db808e90d7eda63afb380e6df Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="install.unix.debian" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Notas de instalación en Debian GNU/Linux</title>
<title>Instalación desde paquetes en Debian GNU/Linux y distribuciones similares</title>
<para>
Esta sección contiene notas y consejos específicos para instalar
PHP sobre <link xlink:href="&url.debian;">Debian GNU/Linux</link>.
Aunque PHP puede ser instalado desde el código fuente, también está
disponible a través de paquetes provenientes de <link xlink:href="&url.debian;">Debian GNU/Linux</link>.
Esto también es cierto para otras distribuciones basadas en Debian, tales como
Ubuntu, Kali Linux y Linux Mint.
</para>
<warning>
<para>
No se ofrece soporte de builds no oficiales de terceros. Cualquier
bug debe ser informado al equipo de Debian a no ser que puedan reproducirse
usando los últimos builds de nuestra <link xlink:href="&url.php.downloads;">zona
de descargas</link>.
</para>
</warning>
&warn.install.third-party-support;
<para>
Mientras que las instrucciones para construir PHP sobre Unix se aplican a Debian también,
esta página del manual contiene información específica para otras opciones, tales como
utilizar ya sea los comandos <literal>apt-get</literal> o <literal>aptitude</literal>.
En esta página del manual estos dos comandos se pueden utilizar indistintamente.
Los paquetes pueden ser instalados utilizando la comando <command>apt</command> o
la comando <command>aptitude</command>. Esta página de manual utiliza estos dos
comandos de manera intercambiable.
</para>
<sect2 xml:id="install.unix.debian.apt">
<title>Utilizando APT</title>
<simpara>
Primero, nótese que otros paquetes relacionados podrían ser deseables como
<literal>libapache2-mod-php5</literal> para integración con Apache 2, y
<literal>php-pear</literal> para PEAR.
</simpara>
<simpara>
Segundo, antes de instalar un paquete, es sensato asegurarse de que la lista de paquetes
está al día. Típicamente, esto se realiza ejecutando el comando
<command>apt-get update</command>.
</simpara>
<example xml:id="install.unix.debian.apt.example">
<title>Ejemplo de Instalación en Debian con Apache 2</title>
<programlisting role="shell">
<title>Uso de APT</title>
<simpara>
En primer lugar, tenga en cuenta que otros paquetes pueden ser deseables, como
<literal>libapache-mod-php</literal> para la integración con Apache 2, y
<literal>php-pear</literal> para PEAR.
</simpara>
<simpara>
Luego, antes de instalar un paquete, es prudente asegurarse de que la lista de paquetes
esté actualizada. Generalmente, esto se hace utilizando el comando
<command>apt update</command>.
</simpara>
<example xml:id="install.unix.debian.apt.example">
<title>Ejemplo de instalación en Debian con Apache 2</title>
<programlisting role="shell">
<![CDATA[
# apt-get install php5-common libapache2-mod-php5 php5-cli
# apt install php-common libapache2-mod-php php-cli
]]>
</programlisting>
</example>
<simpara>
APT instalará automáticamente el módulo PHP 5 para Apache 2 junto con todas sus
dependencias, y luego lo activará. Apache debería reiniciarse para que
los cambios tengan efecto. Por ejemplo:
</simpara>
<example xml:id="install.unix.debian.apt.example2">
<title>Deteniendo e iniciando Apache una vez que PHP está instalado</title>
<programlisting role="shell">
</programlisting>
</example>
<simpara>
APT instalará y activará automáticamente el módulo PHP para Apache 2, así como todas
sus dependencias. Apache deberá ser reiniciado para que los cambios sean efectivos. Por ejemplo:
</simpara>
<example xml:id="install.unix.debian.apt.example2">
<title>Detener y reiniciar Apache una vez instalado PHP</title>
<programlisting role="shell">
<![CDATA[
# /etc/init.d/apache2 stop
# /etc/init.d/apache2 start
]]>
</programlisting>
</example>
</programlisting>
</example>
</sect2>
<sect2 xml:id="install.unix.debian.config">
<title>Un mejor control de la configuración</title>
<simpara>
En la sección anterior, PHP se instaló únicamente con los módulos principales. Es
muy probable que se deseen módulos adicionales, tales como
<link linkend="book.mysql">MySQL</link>,
<link linkend="book.curl">cURL</link>,
<link linkend="book.image">GD</link>,
etc. Estos también pueden ser instalados vía el comando <literal>apt-get</literal>.
</simpara>
<example xml:id="install.unix.debian.config.example">
<title>Métodos para listar paquetes relacionados con PHP 5</title>
<programlisting role="shell">
<simpara>
En el ejemplo anterior, PHP fue instalado con solo los componentes principales. Es probable que se necesiten módulos adicionales, tales como
<link linkend="book.mysql">MySQL</link>,
<link linkend="book.curl">cURL</link>,
<link linkend="book.image">GD</link>,
etc. También pueden ser instalados a través del comando <command>apt</command>.
</simpara>
<example xml:id="install.unix.debian.config.example">
<title>Métodos para listar los paquetes PHP adicionales</title>
<programlisting role="shell">
<![CDATA[
# apt-cache search php5
# aptitude search php5
# aptitude search php5 |grep -i mysql
# apt-cache search php
# apt search php | grep -i mysql
# aptitude search php
]]>
</programlisting>
</example>
<simpara>
Los ejemplos mostran una gran cantidad de paquetes incluyendo varios específicos a PHP
como php5-cgi, php5-cli y php5-dev. Determine cuales son necesarios
e instálelos como cualquier otro ya sea con <literal>apt-get</literal>
o <literal>aptitude</literal>. Y ya que Debian realiza
revisión de dependencias, preguntará por ellos, así que por ejemplo para instalar
MySQL y cURL:
</simpara>
<example xml:id="install.unix.debian.config.example2">
<title>Instalar PHP con MySQL, cURL</title>
<programlisting role="shell">
</programlisting>
</example>
<simpara>
La lista de paquetes incluirá un gran número de paquetes que incluyen los componentes
básicos de PHP, tales como <literal>php-cgi</literal>, <literal>php-cli</literal>, y
<literal>php-dev</literal>, así como numerosas extensiones PHP. Durante
la instalación de las extensiones, se instalarán automáticamente paquetes adicionales si es necesario para satisfacer las dependencias de estos paquetes.
</simpara>
<example xml:id="install.unix.debian.config.example2">
<title>Instalar PHP con MySQL y cURL</title>
<programlisting role="shell">
<![CDATA[
# apt-get install php5-mysql php5-curl
# apt install php-mysql php-curl
]]>
</programlisting>
</example>
<simpara>
APT agregará automáticamente las líneas apropiadas a los
diferentes ficheros relacionados con &php.ini; como
<filename>/etc/php5/apache2/php.ini</filename>,
<filename>/etc/php5/conf.d/pdo.ini</filename>, etc. y dependiendo de
la extensión, le agregará registros similares a <literal>extension=foo.so</literal>.
De cualquier manera, reiniciar el servidor web (como es Apache) es requerido antes de que estos
cambios tengan efecto.
</simpara>
</programlisting>
</example>
<simpara>
APT agregará automáticamente las líneas correctas a los ficheros relacionados con &php.ini;, como
<filename>/etc/php/7.4/php.ini</filename>,
<filename>/etc/php/7.4/conf.d/*.ini</filename>, etc., y según la extensión,
agregará entradas similares a <literal>extension=foo.so</literal>.
Además, reiniciar el servidor web (Apache, por ejemplo) es necesario para que estos cambios
sean efectivos.
</simpara>
</sect2>
<sect2 xml:id="install.unix.debian.faq">
<title>Problemas Frecuentes</title>
<title>Problemas comunes</title>
<itemizedlist>
<listitem>
<simpara>
Si los scripts de PHP no se están interpretando por el servidor web, entonces es
probable que PHP no haya sido agregado al fichero de configuración del servidor
web, que en Debian puede ser <filename>/etc/apache2/apache2.conf</filename>
o algo semejante. Véase el manual de Debian para mayores detalles.
Si los scripts PHP no son interpretados por el servidor web, es probable que PHP
no haya sido añadido a los ficheros de configuración del servidor web, es decir, en Debian,
<filename>/etc/apache2/apache2.conf</filename> o equivalente.
Consulte el manual de Debian para más detalles.
</simpara>
</listitem>
<listitem>
<simpara>
Si una extensión fue aparentemente instalada y aún así las funciones no aparecen definidas,
asegurar de que el fichero ini apropiado está siendo cargado y/o que el servidor
web fue reiniciado después de la instalación.
</simpara>
</listitem>
<listitem>
<simpara>
Hay dos comandos básicos para instalar paquetes en Debian (y otras
variantes de linux): <literal>apt-get</literal> y <literal>aptitude</literal>.
Pero, explicar las sutiles diferencias entre estos comandos va
más allá del alcance de este manual.
Si una extensión ha sido aparentemente instalada pero sus funciones no están definidas,
asegúrese de que las líneas adecuadas han sido insertadas en los ficheros .ini y/o que
el servidor web ha sido reiniciado después de la instalación.
</simpara>
</listitem>
</itemizedlist>

View File

@@ -1,38 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 96c9d88bad9a7d7d44bfb7f26c226df7ee9ddf26 Maintainer: chuso Status: ready -->
<!-- EN-Revision: 7006df7c1fbc64457ac4011ae33309c3f3e5b202 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<sect1 xml:id="install.unix.lighttpd-14" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Lighttpd 1.4 en sistemas Unix</title>
<para>
Esta sección contiene anotaciones y consejos específicos para la instalación
de PHP en Lighttpd 1.4 para sistemas Unix.
Esta sección contiene información específica sobre la instalación
de PHP con Lighttpd 1.4 en sistemas Unix.
</para>
<para>
Por favor, antes de continuar consulte el <link xlink:href="&url.lighttpd.doc;">
sistema de seguimiento de Lighttpd</link> para saber cómo instalar Lighttpd apropiadamente.
Consulte <link xlink:href="&url.lighttpd.doc;">Lighttpd</link>
para una instalación correcta de Lighttpd antes de continuar.
</para>
<para>
La SAPI recomendada para conectar PHP a Lighttpd es Fastcig. Esta SAPI
viene habilitada por omisión en php-cgi PHP 5.3. En versiones anteriores debe
configurarse PHP con --enable-fastcgi. Para verificar que PHP tiene fastcgi habilitado,
<literal>php -v</literal> debe contener <literal>PHP 5.2.5 (cgi-fcgi)</literal>
En versiones anteriores a PHP 5.2.3, fastcgi estaba habilitado en el binario de php (no había php-cgi).
FastCGI es el SAPI preferido para conectar PHP y Lighttpd. FastCGI activa
automáticamente php-cgi.
</para>
<sect2 xml:id="install.unix.lighttpd-14.lighttpd-spawn">
<title>Permitiendo que Lighttpd lance procesos de php</title>
<title>Llamada de PHP por Lighttpd</title>
<para>
Para configurar Lighttpd para que se conecte a php y lance procesos fastcgi, debe editar
lighttpd.conf. Se recomienda utilizar sockets para conectar fastcgi a los procesos
del sistema local.
Para configurar Lighttpd para que se conecte a PHP y llame al proceso
FastCGI, se debe editar el fichero <filename>lighttpd.conf</filename>. Una conexión por sockets
es la solución preferida para sistemas locales.
</para>
<example>
<title>Extracto de lighttpd.conf</title>
<title>Porción del fichero lighttpd.conf</title>
<screen>
<![CDATA[
server.modules += ( "mod_fastcgi" )
@@ -56,41 +54,42 @@ fastcgi.server = ( ".php" =>
</example>
<para>
La directiva bin-path permite a lighttpd lanzar procesos fastcgi dinámicamente.
PHP creará nuevos procesos hijos según se especifique en la variable de entorno
PHP_FCGI_CHILDREN. La directiva "bin-environment" establece el entorno de los
nuevos procesos. Cada vez que se alcance un determinado número de peticiones,
determinado por PHP_FCGI_MAX_REQUEST, se matará un proceso. Las directivas
"min-procs" y "max-procs" deben, por norma general, evitarse con PHP. PHP
gestiona sus propios hijos, de forma que cachés como APC sólo estarán disponibles
para los procesos gestionados por PHP. Si se establece "min-procs" a un número superior a 1,
el número total de procesos oyentes en php se multiplica por PHP_FCGI_CHILDREN
(2 min-procs * 16 hijos produce 32 oyentes).
La directiva <filename>bin-path</filename> permite a lighttpd llamar al proceso FastCGI
dinámicamente. PHP llamará a los hijos según la variable de entorno
<envar>PHP_FCGI_CHILDREN</envar>. La directiva <literal>bin-environment</literal> define el entorno
para los procesos llamados. PHP terminará un proceso hijo cuando el
número de solicitudes especificado por <envar>PHP_FCGI_MAX_REQUESTS</envar> haya sido alcanzado.
Las directivas <literal>min-procs</literal> y <literal>max-procs</literal> pueden generalmente ser ignoradas
con PHP. PHP gestiona sus propios hijos y caches opcode como APC que comparte
únicamente los hijos gestionados por PHP. Si <literal>min-procs</literal> se establece en algo
superior a 1, el número total de respuestas PHP se multiplicado por
<envar>PHP_FCGI_CHILDREN</envar> (2 min-procs * 16 hijos, da 32 respuestas).
</para>
</sect2>
<sect2 xml:id="install.unix.lighttpd-14.spawn-fcgi">
<title>Lanzando procesos con spawn-fcgi</title>
<title>Llamada con spawn-fcgi</title>
<para>
Lighttpd contiene el programa spawn-fcgi que facilita lanzar
procesos fastcgi.
Lighttpd proporciona un programa llamado spawn-fcgi para facilitar
las llamadas a los procesos FastCGI.
</para>
</sect2>
<sect2 xml:id="install.unix.lighttpd-14.spawn-php">
<title>Lanzando procesos php-cgi</title>
<title>Llamada de php-cgi</title>
<para>
Pese a que es más laborioso, es posible lanzar procesos sin spawn-fcgi.
La variable de entorno PHP_FCGI_CHILDREN controla
cuántos procesos hijo de PHP se lanzarán para manejar las peticiones entrantes.
PHP_FCGI_MAX_REQUESTS determinará el tiempo de vida (en peticiones) de cada
proceso hijo. Aquí se muestra un script en bash que asiste en la creación de procesos php.
Es posible llamar a los procesos sin spawn-fcgi, con un
mínimo de configuración. La variable de entorno <envar>PHP_FCGI_CHILDREN</envar>
controla el número de hijos que PHP llama para gestionar las solicitudes.
La variable de entorno <envar>PHP_FCGI_MAX_REQUESTS</envar> determina la duración de
vida, en número de solicitudes, de cada hijo. A continuación se muestra un script bash simple
que ayuda a las llamadas a los gestores PHP.
</para>
<example>
<title>Lanzando oyentes FastCGI</title>
<title>Llamada a los gestores FastCGI</title>
<screen>
<![CDATA[
#!/bin/sh
@@ -101,9 +100,9 @@ PHP=/usr/local/bin/php-cgi
# Ubicación del fichero PID
PHP_PID=/tmp/php.pid
# Enlazando a una dirección
# Enlace a una dirección
#FCGI_BIND_ADDRESS=10.0.1.1:10000
# Enlazando a un socket de dominio
# Enlace a un socket de dominio
FCGI_BIND_ADDRESS=/tmp/php.sock
PHP_FCGI_CHILDREN=16
@@ -124,12 +123,12 @@ echo $! > "$PHP_PID"
<title>Conexión a instancias FCGI remotas</title>
<para>
Para poder tener aplicaciones escalables, pueden lanzarse instancias de
fastcgi en múltiples equipos remotos.
Las instancias FastCGI pueden ser llamadas en múltiples máquinas remotas
para distribuir las aplicaciones.
</para>
<example>
<title>Conexión a instancias de php-fastcgi remotas</title>
<title>Conexión a instancias remotas de php-fastcgi</title>
<screen>
<![CDATA[
fastcgi.server = ( ".php" =>
@@ -141,7 +140,6 @@ fastcgi.server = ( ".php" =>
</example>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml

View File

@@ -1,54 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 445962cfde047efd759cfc37006a5c5864864ef5 Maintainer: andresdzphp Status: ready -->
<!-- Reviewed: no Maintainer: andresdzphp -->
<!-- EN-Revision: e8ac70bf549a723cb36465667a6109d9933b8619 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<sect1 xml:id="install.unix.litespeed" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Servior web LiteSpeed/OpenLiteSpeed en sistemas Unix</title>
<title>Servidor Web LiteSpeed/Servidor Web OpenLiteSpeed en sistemas Unix</title>
<para>
LiteSpeed PHP (LSPHP) es una compilación optimizada de PHP creada para funcionar con los productos de LiteSpeed
a través de LiteSpeed SAPI. LSPHP se ejecuta como su propio proceso y tiene
su propio binario independiente, el cual puede usarse como un simple binario de línea de comandos para ejecutar
scripts PHP desde la terminal.
<para>
LiteSpeed PHP es una compilación optimizada de PHP construida para funcionar con los productos LiteSpeed
a través de la API LiteSpeed. LSPHP funciona como su propio proceso y tiene
su propio binario autónomo, que puede ser utilizado como un simple binario en línea de comandos para ejecutar
scripts PHP desde la línea de comandos.
</para>
<para>
LSAPI es una API altamente optimizada que permite la comunicación entre LiteSpeed
y motores web de terceros. Su protocolo es similar al FCGI, pero más eficiente.
LSAPI es una API altamente optimizada que permite la comunicación entre
LiteSpeed y motores web de terceros. Su protocolo es similar a FCGI, pero es
más eficiente.
</para>
<para>
Esta documentación abarcará la instalación y configuración de PHP con LSAPI
  tanto para un servidor web LiteSpeed como para un servidor web OpenLiteSpeed.
Esta documentación cubrirá la instalación y configuración de PHP con LSAPI
para un servidor Web LiteSpeed y un servidor Web OpenLiteSpeed.
</para>
<para>
Esta guía asumirá que LSWS u OLS están instalados con sus
  rutas y banderas predeterminadas. El directorio de instalación predeterminado para ambos
servidores será /usr/local/lsws y ambos se podrán ejecutar desde el subdirectorio bin.
Se asumirá que LSWS o OLS está instalado con sus
rutas y flags por omisión. El directorio de instalación por omisión para ambos servidores Web es
/usr/local/lsws y ambos pueden ser ejecutados desde el subdirectorio bin.
</para>
<para>
Tenga en cuenta que a lo largo de esta documentación, los números de versión han sido
  reemplazados con una <literal>x</literal> para garantizar que esta se mantenga correcta en el futuro. Por favor,
  reemplácelos, según sea necesario, con los números de versión correspondientes.
reemplazados por un <literal>x</literal> para garantizar que esta documentación permanezca correcta en el futuro,
reemplácelos, si es necesario, por los números de versión correspondientes.
</para>
<orderedlist>
<listitem>
<para>
Para obtener e instalar el servidor web LiteSpeed o OpenLiteSpeed, visite la
<link xlink:href="https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:installation">página de instalación</link>
de la wiki de LiteSpeed, o la
<link xlink:href="http://open.litespeedtech.com/mediawiki/index.php/Help:Install">página de instalación</link>
de la wiki de OpenLiteSpeed.
Para obtener e instalar LiteSpeed Web Server o OpenLiteSpeed Web Server, visite la
<link xlink:href="&url.litespeed.lsws;">página de instalación</link>
de la documentación de LiteSpeed Web Server
o la
<link xlink:href="&url.litespeed.install;">página de instalación</link>.
de la documentación OpenLiteSpeed
</para>
</listitem>
<listitem>
<para>
Obtenga y descomprima el código fuente de PHP:
Descargue y descomprima el código fuente de PHP:
</para>
<informalexample xml:id="install.unix.litespeed.extract.php">
@@ -66,10 +66,10 @@ cd php-x.x.x
<listitem>
<para>
Configure y compile PHP. Aquí es donde PHP se puede personalizar con varias opciones,
    como pudieran ser las extensiones que se habilitarán. Ejecute ./configure --help para obtener una lista de
    opciones. En el ejemplo, utilizaremos las opciones de configuración recomendadas predeterminadas para
    el servidor web LiteSpeed:
Configure y construya PHP. Aquí es donde PHP puede ser personalizado con diversas opciones,
tales como las extensiones que serán activadas. Ejecute ./configure --help para obtener una lista de las opciones
disponibles. En el ejemplo, se utilizarán las opciones de configuración recomendadas por omisión para
LiteSpeed Web Server:
</para>
<informalexample xml:id="install.unix.litespeed.build.php">
@@ -85,12 +85,12 @@ sudo make install
<listitem>
<para>
Compruebe la instalación de LSPHP
Verificar la instalación de LSPHP
</para>
<para>
Una de las formas más simples de verificar si la instalación de PHP fue exitosa
    es ejecutar el siguiente código:
Una de las formas más simples de verificar si la instalación de PHP ha tenido éxito
es ejecutar el siguiente código:
</para>
<informalexample>
@@ -103,7 +103,7 @@ cd /usr/local/lsws/fcgi-bin/
</informalexample>
<para>
Dicho código debería devolver información sobre la nueva compilación de PHP:
Esto debería devolver información sobre la nueva versión de PHP:
</para>
<informalexample>
@@ -117,35 +117,35 @@ Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
</informalexample>
<para>
Observe el texto <literal> litespeed </literal> entre paréntesis. Esto significa que el binario de PHP ha sido
    construido con soporte para LSAPI.
Observe el <literal>litespeed</literal> entre paréntesis. Esto significa que el binario PHP ha sido
construido con soporte LSAPI.
</para>
</listitem>
</orderedlist>
<para>
Siguiendo los pasos anteriores, el servidor web LiteSpeed / OpenLiteSpeed debería
  encontrarse ejecutándose con soporte para PHP como extensión SAPI. Hay muchos s
  opciones de configuración disponibles para LSWS / OLS y PHP. Para más información,
  eche un vistazo a la wiki de LiteSpeed sobre
<link xlink:href="https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:php">PHP</link>.
Después de seguir los pasos anteriores, LiteSpeed / OpenLiteSpeed Web Server debería
ahora funcionar con soporte de PHP como una extensión SAPI. Existen muchas otras
opciones de configuración disponibles para LSWS / OLS y PHP. Para más información,
consulte la documentación de LiteSpeed en
<link xlink:href="&url.litespeed.php;">PHP</link>.
</para>
<para>
Usando LSPHP desde la línea de comando:
Uso de LSPHP desde la línea de comandos:
</para>
<para>
El modo de línea de comandos LSPHP (LSAPI + PHP) se utiliza para procesar scripts PHP que se ejecutan
  en un servidor remoto que no necesariamente tiene un servidor web en ejecución. Se utiliza
  para procesar scripts PHP que residen en un servidor web local (separado). Esta configuración es
  adecuada para la escalabilidad del servicio, ya que el procesamiento de PHP se descarga a un servidor remoto.
El modo de línea de comandos LSPHP (LSAPI + PHP) se utiliza para procesar scripts PHP en ejecución
en un servidor remoto que no necesariamente tiene un servidor web en ejecución. Se utiliza para procesar
scripts PHP residentes en un servidor web local (separado). Esta configuración es adecuada para la escalabilidad del servicio
ya que el procesamiento PHP se descarga a un servidor remoto.
</para>
<para>
Inicie lsphp desde la línea de comandos en un servidor remoto:
  LSPHP es un ejecutable y puede iniciarse manualmente y vincularse a IPv4, IPv6 o
  direcciones de socket de dominio Unix con la opción de línea de comandos -b socket_address
Iniciar lsphp desde la línea de comandos en un servidor remoto:
LSPHP es un ejecutable y puede ser iniciado manualmente y ligado a direcciones IPv4, IPv6 o
direcciones de socket de dominio Unix con la opción de línea de comandos -b socket_address
</para>
<para>
@@ -153,7 +153,7 @@ Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
</para>
<para>
Haga que LSPHP utilice el puerto 3000 en todas las direcciones IPv4 e IPv6:
Hacer que LSPHP se ligue al puerto 3000 en todas las direcciones IPv4 e IPv6:
</para>
<informalexample>
@@ -165,7 +165,7 @@ Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
</informalexample>
<para>
Haga que LSPHP utilice el puerto 3000 en todas las direcciones IPv4:
Hacer que LSPHP se ligue al puerto 3000 en todas las direcciones IPv4:
</para>
<informalexample>
@@ -177,7 +177,7 @@ Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
</informalexample>
<para>
Haga que LSPHP utilice la dirección 192.168.0.2:3000:
Hacer que LSPHP se ligue a la dirección 192.168.0.2:3000:
</para>
<informalexample>
@@ -189,7 +189,7 @@ Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
</informalexample>
<para>
Haga que LSPHP acepte solicitudes en el socket de dominio Unix <literal> /tmp/lsphp_manual.sock </literal>:
Hacer que LSPHP acepte las solicitudes en el socket de dominio Unix <literal>/tmp/lsphp_manual.sock</literal>:
</para>
<informalexample>
@@ -201,7 +201,7 @@ Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
</informalexample>
<para>
Las variables de entorno se pueden agregar antes del ejecutable LSPHP:
Las variables de entorno pueden ser añadidas antes del ejecutable LSPHP:
</para>
<informalexample>
@@ -213,38 +213,39 @@ PHP_LSAPI_MAX_REQUESTS=500 PHP_LSAPI_CHILDREN=35 /path/to/lsphp -b IP_address:po
</informalexample>
<para>
Actualmente, LiteSpeed PHP se puede usar con el servidor web LiteSpeed, OpenLiteSpeed y Apache mod_lsapi.
Para pasos sobre configuración del lado del servidor, visite las páginas wiki de
<link xlink:href="https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:php:configuring-lsws-for-php">LiteSpeed</link>
y <link xlink:href="http://open.litespeedtech.com/mediawiki/index.php/Help:Default_PHP_Settings">OpenLiteSpeed</link>.
Hoy en día, LiteSpeed PHP puede ser utilizado con LiteSpeed Web Server,
OpenLiteSpeed Web Server y Apache mod_lsapi. Para los pasos de
configuración del lado del servidor, visite las páginas de documentación para
<link xlink:href="&url.litespeed.web.server;">LiteSpeed Web Server</link>
y <link xlink:href="&url.litespeed.open;">OpenLiteSpeed</link>.
</para>
<para>
LSPHP también se puede instalar de otras formas:
LSPHP también puede ser instalado de varias otras maneras.
</para>
<para>
CentOS:
En CentOS, LSPHP puede ser instalado tanto desde el repositorio de LiteSpeed como desde el de Remi
utilizando <link xlink:href="https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:php:rpm">RPM</link>.
En CentOS, LSPHP puede ser instalado desde el depósito LiteSpeed o el depósito
Remi utilizando <link xlink:href="&url.litespeed.packages;">RPM</link>.
</para>
<para>
Debian:
En Debian, LSPHP puede ser instalado desde el repositorio de LiteSpeed Repository utilizando
<link xlink:href="https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:php:apt">apt</link>.
En Debian, LSPHP puede ser instalado desde el depósito LiteSpeed utilizando
<link xlink:href="&url.litespeed.packages;">apt</link>.
</para>
<para>
cPanel:
Visite la respectiva <link xlink:href="https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:cpanel:easyapache4-config">página de la wiki</link>
sobre cómo instalar LSPHP en cPanel y LSWS/OLS usando EasyApache 4.
Ver la <link xlink:href="&url.litespeed.cpanel;">página de documentación</link> respectiva
sobre cómo instalar LSPHP con cPanel y LSWS/OLS utilizando EasyApache 4.
</para>
<para>
Plesk:
Plesk puede ser usado con LSPHP en CentOS, CloudLinux, Debian, y Ubuntu.
Para más detalles en este tema, visite la correspondiente <link xlink:href="https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:plesk:php_guide">página de la wiki </link>
Plesk puede ser utilizado con LSPHP en CentOS, CloudLinux, Debian y Ubuntu,
para más detalles sobre esto, visite la <link xlink:href="&url.litespeed.plesk;">página de documentación</link> respectiva.
</para>
</sect1>

View File

@@ -1,51 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: f374919ddde3a726890a867fdab02babc1a37fc1 Maintainer: seros Status: ready -->
<!-- EN-Revision: f0261e36dc250410f352fe33ad4c4e699cb18b02 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="install.unix.nginx" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Nginx 1.4.x en sistemas Unix</title>
<para>
Esta documentación cubre la instalación y configuración de PHP con
PHP-FPM para un servidor HTTP de Nginx 1.4.x.
PHP-FPM para el servidor HTTP Nginx 1.4.x.
</para>
<para>
En esta guía se asume que se ha construido Nginx desde el código fuente, por lo que
todos los ficheros binarios y de configuración están ubicados en
<literal>/usr/local/nginx</literal>. Si este no es el caso y se ha
obtenido Nginx a través de otros medios, consúltese la
<link xlink:href="&url.nginx;">Wiki de Nginx</link> para traducir
este manual a una configuración propia.
Este guía asume que se ha compilado Nginx a partir de las fuentes y por lo tanto
todos los binarios y ficheros de configuración se encuentran en
<literal>/usr/local/nginx</literal>. Si no es el caso y se ha obtenido Nginx por otros medios, por favor refiérase al
<link xlink:href="&url.nginx;">Wiki de Nginx</link> para adaptar este manual
a su configuración.
</para>
<para>
Esta guía cubre la configuración básica de un servidor Nginx para
procesar aplicaciones de PHP y servirlas en el puerto 80. Se recomienda
estudiar la documentación de Nginx y de PHP-FPM para poder
optimizar la configuración más allá del ámbito de esta documentación.
Este guía cubre las bases de la configuración del servidor Nginx para
servir una aplicación PHP en el puerto 80. Se recomienda estudiar las documentaciones de Nginx y PHP-FPM para optimizar su
instalación.
</para>
<para>
Obsérvese que en esta documentación se han reemplazado los números
de versión con una 'x' para asegurarse de que sea correcta en el futuro;
se han de reemplazar estos con los números de versión correspondiente cuando sea necesario.
Tenga en cuenta que a lo largo de esta documentación, los números de versión
han sido reemplazados por una "x" para asegurar que esta última permanezca correcta
en el futuro. Recuerde reemplazarlos por su número de versión.
</para>
<orderedlist>
<listitem>
<para>
Se recomienda visitar la página de
<link xlink:href="&url.nginx.wiki.install;">instalación</link> de la Wiki de Nginx
para obtener e instalar Nginx en un sistema propio.
Se recomienda consultar la
<link xlink:href="&url.nginx.wiki.install;">documentación de Nginx</link>
para instalarla en su sistema.
</para>
</listitem>
<listitem>
<para>
Obtener y desempaquetar el código fuente de PHP:
Recuperar y descomprimir las fuentes de PHP:
</para>
<informalexample xml:id="install.unix.nginx.extract.php">
<screen>
<![CDATA[
@@ -54,58 +53,60 @@ tar zxf php-x.x.x
</screen>
</informalexample>
</listitem>
<listitem>
<para>
Configurar y construir PHP. Aquí es donde se personaliza PHP
con varias opciones, como qué extensiones se habilitarán. Ejecutar
./configure --help para enumerar las opciones disponibles. En este ejemplo
se realiza una configuración sencilla con soporte para PHP-FPM y MySQL.
Configurar y compilar PHP. Este será el momento en el que se podrá
personalizar PHP con diversas opciones, como las extensiones
a activar. Ejecutar ./configure --help para obtener una lista
de las opciones disponibles. En nuestro ejemplo, se realizará
una configuración simple con soporte PHP-FPM y MySQLi.
</para>
<informalexample xml:id="install.unix.nginx.build.php">
<screen>
<![CDATA[
cd ../php-x.x.x
./configure --enable-fpm --with-mysql
./configure --enable-fpm --with-mysqli
make
sudo make install
]]>
</screen>
</informalexample>
</listitem>
<listitem>
<para>
Obtener y mover los ficheros de configuración a sus ubicaciones correctas
Recuperar y mover los ficheros de configuración en
los directorios correctos
</para>
<informalexample xml:id="install.unix.nginx.configure.php">
<screen>
<![CDATA[
cp php.ini-development /usr/local/php/php.ini
cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf
cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
cp sapi/fpm/php-fpm /usr/local/bin
]]>
</screen>
</informalexample>
</listitem>
<listitem>
<para>
Es importante prevenir que Nginx pase peticiones al
«backend» de PHP-FPM si el fichero no existe, evitando así
la inyección arbitraria de scripts.
Es importante que se impida que Nginx pase las peticiones
al backend PHP-FPM si el fichero no existe, evitando así
las vulnerabilidades por inyecciones arbitrarias de scripts.
</para>
<para>
Esto se puede corregir estableciendo la directiva
<link linkend="ini.cgi.fix-pathinfo">cgi.fix_pathinfo</link>
a <literal>0</literal> dentro del fichero php.ini.
Esto se puede realizar definiendo la directiva
de configuración <link linkend="ini.cgi.fix-pathinfo">cgi.fix_pathinfo</link>
al valor <literal>0</literal> en su php.ini.
</para>
<para>
Cargar el php.ini:
Editar php.ini:
</para>
<informalexample xml:id="install.unix.nginx.configure.ini">
<screen>
<![CDATA[
@@ -113,11 +114,12 @@ vim /usr/local/php/php.ini
]]>
</screen>
</informalexample>
<para>
Localizar <literal>cgi.fix_pathinfo=</literal> y modificarla como sigue:
Encontrar la directiva <literal>cgi.fix_pathinfo=</literal>
y modificarla como sigue:
</para>
<informalexample xml:id="install.unix.nginx.configure.pathinfo">
<screen>
<![CDATA[
@@ -126,41 +128,42 @@ cgi.fix_pathinfo=0
</screen>
</informalexample>
</listitem>
<listitem>
<para>
Se debe modificar php-fpm.conf para especificar que php-fpm debe ejecutarse como el usuario
www-data y el grupo www-data antes de poder iniciar el servicio:
El fichero php-fpm.conf debe ser modificado para especificar que
php-fpm debe ser ejecutado con el usuario
www-data y el grupo www-data antes de iniciar el servicio:
</para>
<informalexample xml:id="install.unix.nginx.modify.phpfpm">
<screen>
<![CDATA[
vim /usr/local/etc/php-fpm.conf
vim /usr/local/etc/php-fpm.d/www.conf
]]>
</screen>
</informalexample>
<para>
Buscar y modificar lo siguiente:
Encontrar y modificar lo siguiente:
</para>
<informalexample xml:id="install.unix.nginx.modify.phpfpm.usergroup">
<screen>
<![CDATA[
; Usuario/grupo de procesos de Unix
; Nota: El usuario es obligatorio. Si el grupo no se establece, se utilizará
; el grupo predeterminado del usuario.
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = www-data
group = www-data
]]>
</screen>
</informalexample>
<para>
Ahora se puede iniciar el servicio de php-fpm:
El servicio php-fpm puede ahora ser iniciado:
</para>
<informalexample xml:id="install.unix.nginx.start.phpfpm">
<screen>
<![CDATA[
@@ -168,18 +171,19 @@ group = www-data
]]>
</screen>
</informalexample>
<para>
Esta guía no continua configurando php-fpm; si se tiene interés en
una configuración mayor de php-fpm, consulte la documentación.
Este guía no va a configurar php-fpm más allá de esto; si está interesado en la configuración avanzada de php-fpm, por favor
consulte la documentación.
</para>
</listitem>
<listitem>
<para>
Ahora Nginx debe configurarse para que pueda procesar aplicaciones de PHP:
Nginx debe ahora ser configurado para soportar el análisis de
las aplicaciones PHP:
</para>
<informalexample xml:id="install.unix.nginx.configure.nginx">
<programlisting>
<![CDATA[
@@ -187,12 +191,12 @@ vim /usr/local/nginx/conf/nginx.conf
]]>
</programlisting>
</informalexample>
<para>
Modificar el bloque de ubicaciones predeterminado para que intente
servir ficheros .php:
Modificar el bloque por defecto para que pueda servir ficheros
.php:
</para>
<informalexample xml:id="install.unix.nginx.configure.nginx.location">
<programlisting role="nginx-conf">
<![CDATA[
@@ -203,13 +207,12 @@ location / {
]]>
</programlisting>
</informalexample>
<para>
El siguiente paso es asegurarse de que los ficheros .php se pasan al
«backend» de PHP-FPM. Bajo el bloque de ubicaciones predeterminado de PHP
comentado, añadir lo siguiente:
La siguiente etapa asegura que los ficheros .php sean pasados
al backend PHP-FPM; Bajo el bloque comentado por defecto y entre:
</para>
<informalexample xml:id="install.unix.nginx.configure.nginx.php">
<programlisting role="nginx-conf">
<![CDATA[
@@ -223,11 +226,11 @@ location ~* \.php$ {
]]>
</programlisting>
</informalexample>
<para>
Reiniciar Nginx.
</para>
<informalexample xml:id="install.unix.nginx.restart.nginx">
<screen>
<![CDATA[
@@ -237,12 +240,12 @@ sudo /usr/local/nginx/sbin/nginx
</screen>
</informalexample>
</listitem>
<listitem>
<para>
Crear un fichero de prueba
</para>
<informalexample xml:id="install.unix.nginx.test.nginx.php">
<screen>
<![CDATA[
@@ -251,21 +254,21 @@ echo "<?php phpinfo(); ?>" >> /usr/local/nginx/html/index.php
]]>
</screen>
</informalexample>
<para>
Ahora, navegar a http://localhost. phpinfo() debería mostrarse.
Ahora, navegue a http://localhost. El phpinfo()
debería ser mostrado.
</para>
</listitem>
</orderedlist>
<para>
Siguiendo los pasos anteriores se tendrá un servidor web Nginx funcionando con
soporte para PHP como módulo <literal>SAPI</literal>. Por supuesto, existen
muchas más opciones de configuración disponibles para Nginx y PHP. Para más
información, teclear <command>./configure --help</command> en el árbol de código
fuente correspondiente.
Siguiendo estos diferentes pasos, se debería ejecutar un servidor
web Nginx con soporte de PHP como módulo <literal>FPM</literal> <literal>SAPI</literal>.
Por supuesto, hay muchas más opciones de configuración disponibles para Nginx y PHP. Para más información, escriba
<command>./configure --help</command> en la fuente correspondiente.
</para>
</sect1>
<!-- Keep this comment at the end of the file

View File

@@ -1,103 +1,104 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 96c9d88bad9a7d7d44bfb7f26c226df7ee9ddf26 Maintainer: lduran Status: ready -->
<!-- EN-Revision: e8ac70bf549a723cb36465667a6109d9933b8619 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<sect1 xml:id="install.unix.openbsd" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Notas de instalación para OpenBSD</title>
<title>Instalación desde paquetes o puertos en OpenBSD</title>
<para>
Esta sección contiene notas y consejos específicos a la instalación de
PHP sobre <link xlink:href="&url.openbsd;">OpenBSD 3.6</link>.
Esta sección contiene las notas específicas para la instalación
de PHP en <link xlink:href="&url.openbsd;">OpenBSD</link>.
</para>
<sect2 xml:id="install.unix.openbsd.packages">
<title>Utilizando paquetes binarios</title>
<simpara>
Utilizar paquetes binarios para instalar PHP sobre OpenBSD es el método más
simple y recomendado. El paquete principal ha sido separado de los distintos
módulos, y cada uno puede ser instalado removido independientemente de los otros.
Los ficheros que se necesitan pueden ser encontrados en el CD de OpenBSD o en el sitio FTP.
</simpara>
<simpara>
El paquete principal que se necesita instalar es <filename>php4-core-4.3.8.tgz</filename>,
que contiene el motor básico (además de gettext e iconv). Seguido, tómese un vistazo
a los paquetes de módulos, tales como <filename>php4-mysql-4.3.8.tgz</filename>
o <filename>php4-imap-4.3.8.tgz</filename>. Se necesita emplear el comando <command>phpxs</command>
para activar y desactivar estos módulos en el fichero &php.ini;.
</simpara>
<example xml:id="install.unix.openbsd.ports.example">
<title>Ejemplo de instalación de paquete de OpenBSD</title>
<programlisting role="shell">
<title>Uso de paquetes binarios</title>
<simpara>
Este método es el método recomendado para instalar PHP en OpenBSD.
También es el método más simple. El paquete core ha sido separado de los módulos
y cada uno de ellos puede ser instalado y eliminado independientemente de los otros.
Los ficheros necesarios están en el CD de OpenBSD o en el sitio FTP.
</simpara>
<simpara>
El paquete principal que debe ser instalado es <filename>php</filename>,
que contiene el motor base (además de fpm, gettext e iconv) y podría
estar disponible en varias versiones.
Luego, eche un vistazo a los paquetes de módulos, como <filename>php-mysqli</filename>
o <filename>php-imap</filename>. Debe utilizar el comando
<command>phpxs</command> para activar y desactivar estos módulos en su
&php.ini;.
</simpara>
<example xml:id="install.unix.openbsd.ports.example">
<title>Ejemplo de instalación de PHP en OpenBSD con Ports</title>
<programlisting role="shell">
<![CDATA[
# pkg_add php4-core-4.3.8.tgz
# /usr/local/sbin/phpxs -s
# cp /usr/local/share/doc/php4/php.ini-recommended /var/www/conf/php.ini
(agregar mysql)
# pkg_add php4-mysql-4.3.8.tgz
# /usr/local/sbin/phpxs -a mysql
(agregar imap)
# pkg_add php4-imap-4.3.8.tgz
# /usr/local/sbin/phpxs -a imap
(quitar mysql a manera de prueba)
# pkg_delete php4-mysql-4.3.8
# /usr/local/sbin/phpxs -r mysql
(instalar las librerías de PEAR)
# pkg_add php4-pear-4.3.8.tgz
# pkg_add php
# pkg_add php-apache
# pkg_add php-mysqli
(instalar las bibliotecas PEAR)
# pkg_add pear
Siga las instrucciones mostradas con cada paquete!
(para eliminar paquetes)
# pkg_delete php
# pkg_delete php-apache
# pkg_delete php-mysqli
# pkg_delete pear
]]>
</programlisting>
</example>
<simpara>
Leer la página del manual <link xlink:href="&url.openbsd.packages;">packages(7)</link>
para mas información sobre paquetes binarios en OpenBSD.
</simpara>
</example>
<simpara>
Lea la página de manual Unix <link xlink:href="&url.openbsd.packages;">packages(7)</link>
para más detalles sobre los paquetes binarios de OpenBSD.
</simpara>
</sect2>
<sect2 xml:id="install.unix.openbsd.ports">
<title>Utilizando portes</title>
<title>Uso de puertos</title>
<simpara>
También se puede compilar PHP a partir de fuentes utilizando el <link xlink:href="&url.openbsd.ports;">árbol de portes</link>.
Sin embargo, esto sólo se recomienda para usuarios familiarizados con OpenBSD. El porte de PHP 4
está dividido en dos subdirectorios: core y extensions. El
directorio extensions genera subpaquetes para todos los módulos
soportados de PHP. Si se encuentra que no se desea crear alguno de estos módulos,
utilice el sabor o FLAVOR <command>no_*</command>. Por ejemplo, para evitar compilar
el módulo imap, fijar el sabor o FLAVOR a <command>no_imap</command>.
También es posible compilar PHP utilizando <link
xlink:href="&url.openbsd.ports;">el árbol de puertos</link>.
Este método es recomendado para usuarios experimentados de OpenBSD. El puerto PHP
está dividido en core y extensiones. El directorio
extensiones genera los subpaquetes de todos los módulos PHP. Si no desea crear estos módulos,
puede utilizar el comando en línea
<command>no_*</command> FLAVOR. Por ejemplo, para no compilar el módulo
imap, utilice FLAVOR con el valor <command>no_imap</command>.
</simpara>
</sect2>
<sect2 xml:id="install.unix.openbsd.faq">
<title>Problemas comunes</title>
<itemizedlist>
<listitem>
<simpara>La instalación por omisión de Apache se ejecuta dentro de una
<link xlink:href="&url.openbsd.chroot;">jaula chroot(2)</link>, que habrá de restringir a los script PHP
el acceso a ficheros debajo de <filename>/var/www</filename>. Por lo tanto se requiere crear un directorio
<filename>/var/www/tmp</filename> para que los ficheros de sesión de PHP sean almacenados, o utilizar un
medio alternativo de almacenamiento de sesiones. Además, los sockets de base de datos necesitan colocarse dentro de
la jaula o escuchar en la interfaz de <filename>localhost</filename>. Se se hace uso de funciones de red,
algunos ficheros de <filename>/etc</filename> tales como <filename>/etc/resolv.conf</filename> y
<filename>/etc/services</filename> tendrán que ser movidos a <filename>/var/www/etc</filename>.
El paquete PEAR de OpenBSD automáticamente se instala dentro de los directorios correctos del chroot, así que
no hace falta ninguna modificación especial ahí. Más información sobre el Apache de OpenBSD está disponible
en las preguntas frecuentes OpenBSD. <!-- Removed link to fix the build ~sobak 12/06/2016 -->
<simpara>
Apache y Nginx ya no son el servidor por defecto en OpenBSD, pero pueden ser fácilmente encontrados en los puertos y los paquetes. El nuevo
servidor por defecto también se llama 'httpd'.
</simpara>
</listitem>
<listitem>
<simpara>
La instalación por defecto de Apache funciona en un
<link xlink:href="&url.openbsd.chroot;">contexto chroot(2)</link>,
que limitará el acceso de los scripts PHP al directorio
<filename>/var/www</filename>. Por lo tanto, debe crear un directorio
<filename>/var/www/tmp</filename> para que las sesiones PHP sean almacenadas, o utilizar otra solución de almacenamiento.
Además, los sockets de bases de datos deben ser colocados
en este directorio, o utilizar la interfaz
<filename>localhost</filename>. Si utiliza funciones de red con ficheros como <filename>/etc</filename>,
por ejemplo <filename>/etc/resolv.conf</filename>, y
<filename>/etc/services</filename>, deberá hacerlos accesibles
también en <filename>/var/www/etc</filename>.
El paquete OpenBSD PEAR instala automáticamente los directorios correctos.
</simpara>
</listitem>
<listitem>
<simpara>
El paquete de OpenBSD 3.6 para la extensión <link xlink:href="&url.gd;">gd</link> requiere que
XFree86 sea instalado. Si no se desea utilizar algunas de las características de fuentes tipográficas que
requieren de X11, es mejor instalar el paquete <filename>php4-gd-4.3.8-no_x11.tgz</filename>.
El paquete OpenBSD para la extensión <link xlink:href="&url.gd;">gd</link>
requiere Xorg. A menos que ya esté incluido después de la instalación añadiendo
el conjunto de ficheros <filename>xbase.tgz</filename>, esto puede ser añadido posteriormente
(ver <link xlink:href="&url.openbsd.faq4;">OpenBSD FAQ#4</link>).
</simpara>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="install.unix.openbsd.older">
<title>Ediciones antiguas</title>
<simpara>
Ediciones antiguas de OpenBSD utilizaban el sistema FLAVORS para compilar
un PHP enlazado estáticamente. Dado que es difícil generar paquetes binarios utilizando
este método, ahora es depreciado. Aún es posible utilizar los viejos árboles
estables de ports si así se desea, pero carecen de soporte por parte del equipo de OpenBSD.
Si se tiene algún comentario al respecto, el responsable actual del port
es Anil Madhavapeddy (avsm arroba openbsd punto org).
</simpara>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file

View File

@@ -1,106 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 8b11ddd74b1e0161d90749e21789b3fd83f0e6d6 Maintainer: lehmer Status: ready -->
<!-- EN-Revision: 4eeb07225f615fcde68cbefb84df2fc9bf278f1f Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<sect1 xml:id="install.unix.solaris" xmlns="http://docbook.org/ns/docbook">
<title><productname>Solaris</productname> sugerencias específicas de instalación</title>
<title>Instalación en <productname>Solaris</productname></title>
<para>
Esta sección contiene notas y sugerencias específicas para la instalación de
PHP en sistemas <productname>Solaris</productname>.
</para>
<sect2 xml:id="install.unix.solaris.required">
<title>Software necesario</title>
<para>
<productname>La instalacion Solaris</productname> carece con frecuencia de los compiladores de C y sus herramientas relacionadas.
Lea <link linkend="faq.installation.needgnu">las preguntas frecuentes</link>
para obtener información sobre porqué usar versiones GNU de algunas de estas
herramientas.
Esta sección contiene las notas y consejos de instalación de PHP
en las distribuciones <productname>Solaris</productname>.
</para>
<sect2 xml:id="install.unix.solaris.required">
<title>Software necesario</title>
<para>
La instalación <productname>Solaris</productname> generalmente omite los compiladores C y sus
utilidades. Lea <link linkend="faq.installation.needgnu">esta FAQ</link>
para saber por qué las versiones GNU de algunas de estas herramientas
son necesarias.
</para>
<para>
Para descomprimir la distribución PHP se necesita
Para descomprimir la distribución PHP, se necesita
<itemizedlist>
<listitem>
<simpara>
tar
tar
</simpara>
</listitem>
<listitem>
<simpara>
gzip ó
</simpara>
</listitem>
<listitem>
<simpara>
bzip2
</simpara>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<simpara>
gzip o
</simpara>
</listitem>
<listitem>
<simpara>
bzip2
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Para compilar PHP se necesita
<itemizedlist>
<listitem>
<simpara>
gcc (recomendado, aunque puede que sirvan otros compiladores de C)
</simpara>
</listitem>
<listitem>
<simpara>
make
</simpara>
</listitem>
<listitem>
<simpara>
GNU sed
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Para compilar extensiones adicionales o hackear el código PHP puede que se necesite también
Para compilar PHP, se necesita
<itemizedlist>
<listitem>
<simpara>
flex (versión PHP 5.2 o posterior)
</simpara>
</listitem>
<listitem>
<simpara>
re2c
</simpara>
</listitem>
<listitem>
<simpara>
bison
</simpara>
</listitem>
<listitem>
<simpara>
m4
</simpara>
</listitem>
<listitem>
<simpara>
autoconf
</simpara>
</listitem>
<listitem>
<simpara>
gcc (recomendado, otros compiladores C también pueden funcionar)
</simpara>
</listitem>
<listitem>
<simpara>
make
</simpara>
</listitem>
<listitem>
<simpara>
GNU sed
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Para construir las extensiones adicionales o modificar el código de PHP,
también se puede necesitar
<itemizedlist>
<listitem>
<simpara>
re2c
</simpara>
</listitem>
<listitem>
<simpara>
bison
</simpara>
</listitem>
<listitem>
<simpara>
m4
</simpara>
</listitem>
<listitem>
<simpara>
autoconf
</simpara>
</listitem>
<listitem>
<simpara>
automake
</simpara>
</listitem>
</itemizedlist>
Además, usted tendrá que instalar (y posiblemente compilar) cualquier
software adicional específico para la configuración, tales como Oracle
o MySQL.
</para>
Además, también se deberán instalar (y tal vez compilar)
todas las bibliotecas necesarias para las extensiones como MySQL, Oracle, etc.
</para>
</sect2>
<sect2 xml:id="install.unix.solaris.packages">
<title>Empleo de paquetes</title>
<title>Uso de paquetes</title>
<simpara>
Se puede simplificar el procesao de intalación de <productname>Solaris</productname> mediante el uso de pkgadd para
instalar la mayoría de sus componentes necesarios. El Sistema de Empaquetado de Imagen (IPS) para
<productname>Solaris 11 Express</productname> contiene también la mayoría de los componentes requeridos
para la instalación usando el comando pkg.
La instalación <productname>Solaris</productname> puede simplificarse
utilizando pkgadd para instalar la mayoría de los componentes. El
sistema de paquetes de imágenes (IPS) para <productname>Solaris 11 Express</productname>
también contiene los componentes necesarios para la instalación
utilizando el comando pkg.
</simpara>
</sect2>
</sect1>

View File

@@ -1,18 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 8e732e84a1425cf0ab3a5b0da8fe113c7a6da85e Maintainer: julionc Status: ready -->
<!-- Reviewed: yes Maintainer: julionc -->
<!-- EN-Revision: 2dbf3d9064d4cb07f0a2f7d06641c877a2e5ed24 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<sect1 xml:id="install.windows.building" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Compilando desde código fuente</title>
<para>
Este capítulo enseña cómo compilar PHP a partir del código fuente en Windows, utilizando las herramientas de Microsoft. Para compilar PHP con cygwin, consulte la instalación de unix.
<xref linkend="install.unix"/>.
</para>
<para>
Veáse la documentación Wiki en:
<link xlink:href="&url.wiki.windows.build.howto;">&url.wiki.windows.build.howto;</link>
</para>
<title>Construir a partir de las fuentes</title>
<simpara>
Ver las <link xlink:href="&url.install.windows.stepbystep;">instrucciones de construcción paso a paso</link>
para compilar con Visual Studio.
</simpara>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:

View File

@@ -1,113 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 8e732e84a1425cf0ab3a5b0da8fe113c7a6da85e Maintainer: seros Status: ready -->
<!-- Reviewed: yes Maintainer: julionc -->
<!-- EN-Revision: 2dbf3d9064d4cb07f0a2f7d06641c877a2e5ed24 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<sect1 xml:id="install.windows.commandline" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Línea de comandos PHP en Microsoft Windows</title>
<title>Ejecución de PHP en línea de comandos en sistemas Windows</title>
<para>
Esta sección contiene notas y consejos específicos para la ejecución de PHP
en línea de comandos en Windows.
</para>
<note>
<para>
Esta sección contiene notas y sugerencias específicas para conseguir ejecutar PHP
en la línea de comandos para Windows.
¡Leer primero los <link linkend="install.windows.manual">pasos
de instalación manual</link>!
</para>
<note>
<para>
Se debe leer primero el
<link linkend="install.windows.manual">manual de instalación PHP en Windows</link>
</para>
</note>
<para>
Conseguir ejecutar PHP desde la línea de comandos sin hacer
ningún cambio a Windows.
<screen>
<![CDATA[
</note>
<para>
Tener PHP ejecutándose desde la línea de comandos puede realizarse sin
hacer modificaciones en Windows.
<screen>
<![CDATA[
C:\php\php.exe -f "C:\PHP Scripts\script.php" -- -arg1 -arg2 -arg3
]]>
</screen>
</para>
</screen>
</para>
<para>
Pero hay algunos pasos sencillos que puede seguir para hacer esto simple.
Algunas de estas medidas ya se deberían haber tomado, pero se repiten aquí
para ser capaz de proporcionar una completa secuencia paso a paso.
<para>
Pero hay algunos pasos fáciles de seguir para simplificar esto.
Algunos de estos pasos ya deberían haberse tomado, pero se repiten aquí
para proporcionar una secuencia completa paso a paso.
<itemizedlist>
<note>
<para>
Tanto <envar>PATH</envar> como <envar>PATHEXT</envar> son variables de sistema preexistentes importantes en Windows, por lo que se ha de asegurarse de no sobrescribir dichas variables, solamente agregarle algo.
</para>
<itemizedlist>
<note>
<para>
Las dos variables de sistema preexistentes <envar>PATH</envar> y <envar>PATHEXT</envar> son
importantes en Windows,
y se debe tener cuidado de no sobrescribirlas,
solo añadirlas.
</para>
</note>
<listitem>
<para>
Añadir la ubicación del ejecutable PHP (<filename>php.exe</filename>,
<filename>php-win.exe</filename> o <filename>php-cli.exe</filename>
según la versión de PHP y las preferencias de visualización) a la variable
de entorno <envar>PATH</envar>. Leer más sobre cómo añadir el
directorio PHP apropiado a la variable de entorno <envar>PATH</envar> en la
<link linkend="faq.installation.addtopath">entrada FAQ correspondiente</link>.
</para>
</listitem>
<listitem>
<para>
Añadir la extensión <literal>.PHP</literal>
a la variable de entorno <varname>PATHEXT</varname>. Esto puede hacerse
al mismo tiempo que se añade la variable de entorno <envar>PATH</envar>.
Siga los mismos pasos descritos en la <link
linkend="faq.installation.addtopath">FAQ</link> pero modifique la variable
de entorno <varname>PATHEXT</varname> en lugar de la variable
de entorno <envar>PATH</envar>.
<note>
<para>
La posición en la que se coloca <literal>.PHP</literal> determinará
qué script o programa se ejecuta cuando hay nombres de ficheros
correspondientes. Por ejemplo, colocar <literal>.PHP</literal> antes
de <literal>.BAT</literal> hará que se ejecute el script, en lugar del
fichero batch, si hay un fichero batch con el mismo nombre.
</para>
</note>
</para>
</listitem>
<listitem>
<para>
Añada la ubicación del ejecutable de PHP (<filename>php.exe</filename>,
<filename>php-win.exe</filename> o <filename>php-cli.exe</filename>
dependiendo de su versión de PHP y las preferencias de presentación) a la
variable de entorno <envar>PATH</envar>. Lea más acerca de cómo
añadir el directorio de PHP <envar>PATH</envar> en la <link
linkend="faq.installation.addtopath">entrada correspondiente de preguntas frecuentes</link>.
</para>
</listitem>
<listitem>
<para>
Asociar la extensión <literal>.PHP</literal> con un tipo de fichero. Esto
se hace ejecutando el siguiente comando:
<screen>
<![CDATA[
assoc .php=phpfile
]]>
</screen>
</para>
</listitem>
<listitem>
<para>
Añada la extensión <literal>.PHP</literal> de la
variable de entorno <envar>PATHEXT</envar>. Esto se puede hacer
al mismo tiempo, con la modificación de la variable de entorno <varname>PATH</varname>.
Siga los mismos pasos como se describe en las <link
linkend="faq.installation.addtopath">Preguntas frecuentes</link> pero habría que modificar la
variable de entorno <varname>PATHEXT</varname>en lugar de la
variable de entorno <envar>PATH</envar>.
<note>
<para>
La posición en que se coloca el <literal>.PHP</literal>
determina qué secuencia de comandos o programa se ejecuta cuando hay nombre de archivos coincidentes.
Por ejemplo, colocar <literal>.PHP</literal> antes de
<literal>.BAT</literal> hará que el script se ejecute, en lugar de
el archivo por lotes, si hay un fichero por lotes con el mismo nombre.
</para>
</note>
</para>
</listitem>
<listitem>
<para>
Asociar el tipo de fichero <literal>phpfile</literal> con el ejecutable PHP
apropiado. Esto se hace ejecutando el siguiente comando:
<screen>
<![CDATA[
ftype phpfile="C:\php\php.exe" -f "%1" -- %~2
]]>
</screen>
</para>
</listitem>
<listitem>
<para>
Asociar la extensión <literal>.PHP</literal> con un tipo de fichero. Esta
se hace ejecutando el siguiente comando:
<screen>
<![CDATA[
assoc .php=phpfile
]]>
</screen>
</para>
</listitem>
</itemizedlist>
</para>
<listitem>
<para>
Asociar el tipo de fichero <literal>phpfile</literal> con el adecuado
ejecutable PHP. Esto se hace ejecutando el siguiente comando:
<screen>
<![CDATA[
ftype phpfile="C:\PHP5\php.exe" -f "%1" -- %~2
]]>
</screen>
</para>
</listitem>
<para>
Siguiendo estos pasos, los scripts PHP podrán ser ejecutados desde cualquier
directorio sin necesidad de escribir el ejecutable PHP o la extensión
<literal>.PHP</literal> y todos los argumentos serán proporcionados al script para su procesamiento.
</para>
</itemizedlist>
</para>
<para>
Si sigue estos pasos permitirá ejecutar scripts PHP desde cualquier directorio
sin necesidad de escribir el ejecutable PHP o la extensión <literal>.PHP</literal>
y todos los parámetros, será enviada a el script para el procesamiento.
</para>
<para>
En el ejemplo a continuación se detallan algunos de los cambios de registro que se puede hacer manualmente.
<example>
<title>Registro de cambios</title>
<screen>
<![CDATA[
<para>
El ejemplo a continuación detalla algunos de los cambios de registro que pueden hacerse manualmente.
<example>
<title>Cambios de registro</title>
<screen>
<![CDATA[
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.php]
@@ -132,60 +133,59 @@ Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open\command]
@="\"C:\\php\\php.exe\" -f \"%1\" -- %~2"
]]>
</screen>
</example>
</para>
</screen>
</example>
</para>
<para>
Con estos cambios el mismo comando se puede escribir como:
<screen>
<![CDATA[
<para>
Con estos cambios, el mismo comando puede escribirse como sigue:
<screen>
<![CDATA[
"C:\PHP Scripts\script" -arg1 -arg2 -arg3
]]>
</screen>
O, si la ruta de acceso <literal>"C:\PHP Scripts"</literal> está en el
variable de entorno <envar>PATH</envar>:
<screen>
<![CDATA[
</screen>
o, si la ruta <literal>"C:\PHP Scripts"</literal> está en la
variable de entorno <envar>PATH</envar>:
<screen>
<![CDATA[
script -arg1 -arg2 -arg3
]]>
</screen>
</para>
</screen>
</para>
<note>
<para>
Hay un pequeño problema si tiene intención de utilizar esta técnica y usar
scripts PHP como filtro de línea de comandos, como el ejemplo a continuación:
<screen>
<![CDATA[
<note>
<para>
Hay un pequeño problema si la intención es utilizar esta técnica y
utilizar los scripts PHP como filtro en línea de comandos, como en el ejemplo a continuación:
<screen>
<![CDATA[
dir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3
]]>
</screen>
o
<screen>
<![CDATA[
</screen>
o
<screen>
<![CDATA[
dir | script -arg1 -arg2 -arg3
]]>
</screen>
Es posible que el script simplemente se cuelga y no salga nada.
Para hacer esto operacional, es necesario hacer otro cambio en el registro.
<screen>
<![CDATA[
</screen>
El script puede simplemente bloquearse y no mostrar nada.
Para que esto funcione, se debe realizar otro cambio de registro:
<screen>
<![CDATA[
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer]
"InheritConsoleHandles"=dword:00000001
]]>
</screen>
Información adicional sobre este tema se pueden encontrar en el
<link xlink:href="http://support.microsoft.com/default.aspx?scid=kb;en-us;321788">Artículo de la
base de conocimientos de Microsoft: 321788</link>.
A partir de Windows 10, este ajuste parece haber sido invertido, haciendo que la instalación predeterminada de
Windows 10 admita manejadores de consola heredados automáticamente. Esta <link
xlink:href="https://social.msdn.microsoft.com/Forums/en-US/f19d740d-21c8-4dc2-a9ab-d5c0527e932b/nasty-file-association-regression-bug-in-windows-10-console?forum=windowssdk">
entrada del foro de Microsoft</link> proporciona la explicación.
</para>
</note>
</screen>
Más información sobre este problema puede encontrarse en este <link
xlink:href="http://support.microsoft.com/default.aspx?scid=kb;en-us;321788">artículo de la base de conocimientos de Microsoft: 321788</link>.
A partir de Windows 10, este ajuste parece estar invertido, haciendo que la instalación por defecto de
Windows 10 soporte automáticamente los manejadores de consola heredados. Este <link
xlink:href="https://social.msdn.microsoft.com/Forums/en-US/f19d740d-21c8-4dc2-a9ab-d5c0527e932b/nasty-file-association-regression-bug-in-windows-10-console?forum=windowssdk">
post del foro de Microsoft</link> proporciona la explicación.
</para>
</note>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:

View File

@@ -1,88 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 8e732e84a1425cf0ab3a5b0da8fe113c7a6da85e Maintainer: seros Status: ready -->
<!-- Reviewed: yes Maintainer: julionc -->
<!-- EN-Revision: 42b7ea093412486fa88b7270a397abb008218163 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no Maintainer: PhilDaiguille -->
<sect1 xml:id="install.windows.manual" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Instalación manual de PHP en Windows</title>
<sect2>
<title>Elección del servidor web</title>
<sect3>
<title>IIS</title>
<para>
IIS está integrado en Windows.
En Windows Server, use Server Manager para añadir el rol de IIS. Asegúrese de incluir CGI Role Feature.
En Windows Desktop, use Añadir/Eliminar Programas del Panel de Control para añadir IIS.
La documentación de Microsoft tiene <link xlink:href="https://docs.microsoft.com/en-us/previous-versions/ms181052(v=vs.80)">instrucciones detallas</link>.
Para aplicaciones web de escritorio y desarrollo web, también se puede usar IIS/Express o PHP Desktop.
<example>
<title>Linea de órdenes para configurar IIS y PHP</title>
<programlisting>
<![CDATA[
<title>Instalación manual de los binarios precompilados</title>
@echo off
<simplesect xml:id="install.windows.requirements" annotations="chunk:false">
<title>Requisitos de instalación</title>
<simpara>
PHP solo está disponible para sistemas de 32 bits x86 o 64 bits x64, y actualmente no funciona en Windows RT o Windows sobre ARM.
A partir de la versión 8.3.0, PHP requiere Windows 8 o Windows Server 2012.
Las versiones posteriores a 7.2.0 requerían Windows 2008 R2 o Windows 7.
Las versiones anteriores a 7.2.0 soportaban Windows 2008 y Vista.
</simpara>
REM Descargar el fichero .ZIP o la compilación de PHP desde http://windows.php.net/downloads/
REM
REM Ruta al directorio donde se ha descomprimido el fichero .ZIP de PHP
set phpdir=c:\php
<simpara>
PHP requiere el runtime Visual C (CRT). Muchas otras aplicaciones también lo exigen, por lo que es probable que ya esté instalado, pero si no está presente, el Microsoft Visual C++ Redistributable para Visual Studio 2022 es adecuado para todas las versiones de PHP y puede ser
<link xlink:href="&url.microsoft.visualc.redistr;">descargado desde Microsoft</link>.
</simpara>
<simpara>
El CRT x86 debe ser descargado para ser utilizado con las compilaciones PHP x86 y el CRT x64 para las compilaciones PHP x64.
Si el CRT ya está instalado, el instalador mostrará un mensaje indicando que ya estaba instalado y no realizará ningún cambio.
El instalador CRT soporta las opciones de línea de comandos
<option>/quiet</option> y <option>/norestart</option>, por lo que la instalación puede ser scriptada.
</simpara>
</simplesect>
REM Limpiar los manejadores actuales de PHP
%windir%\system32\inetsrv\appcmd clear config /section:system.webServer/fastCGI
REM El siguiente comando generará un mensaje de error si PHP no está instalado. Esto puede ser ignorado.
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /-[name='PHP_via_FastCGI']
<simplesect>
<title>Dónde descargar los binarios PHP</title>
<simpara>
Las compilaciones de Windows pueden ser descargadas desde <link xlink:href="&url.php.win.downloads;">el
sitio web PHP Windows</link>.
Todas las compilaciones están optimizadas (<abbrev>PGO</abbrev>), y las versiones QA y GA están cuidadosamente probadas.
</simpara>
</simplesect>
REM Instalar el manejador de PHP
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='%phppath%\php-cgi.exe']
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /+[name='PHP_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='%phppath%\php-cgi.exe',resourceType='Unspecified']
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /accessPolicy:Read,Script
REM Configurar las variables de FastCGI
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/fastCgi /[fullPath='%phppath%\php-cgi.exe'].instanceMaxRequests:10000
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%phppath%\php-cgi.exe'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%phppath%\php-cgi.exe'].environmentVariables.[name='PHPRC',value='%phppath%\php.ini']"
]]>
</programlisting>
</example>
</para>
</sect3>
<sect3>
<title>Apache</title>
<para>
Existen varias compilaciones de Apache2 para Windows.
Se recomiendan las compilaciones Apache de ApacheLounge, aunque otras opciones pueden ser XAMPP, WampServer y BitNami, las cuales proporcionan herramientas de instalación automática.
Se puede utilizar mod_php o mod_fastcgi para cargar PHP en Apache.
Si se emplea mod_php, se DEBE utilizar una compilación TS de Apache construida con la misma versión de Visual C y la misma CPU (x86 o x64).
</para>
</sect3>
</sect2>
<sect2>
<title>Elegir una compilación</title>
<simplesect xml:id="install.windows.pecl" annotations="chunk:false">
<title>Extensiones PECL precompiladas</title>
<para>
Descargue las versiones de producción de PHP desde <link xlink:href="http://windows.php.net/download/">http://windows.php.net/download/</link>.
Todas las compilaciones están optimizadas (<abbrev>PGO</abbrev>), y las versiones de QA y GA se prueban exhaustivamente.
Las versiones preconstruidas de Windows de las extensiones PECL se distribuyen como ficheros DLL en la página PECL de la extensión.
</para>
<para>
Existen 4 tipos de compilación de PHP:
<itemizedlist spacing="compact">
<listitem>
<para>Thread-Safe(TS) - usada para servidores web monoproceso, como Apache con mod_php</para>
</listitem>
<listitem>
<para>Non-Thread-Safe(NTS) - usada para IIS y otros servidores web FastCGI (Apache con mod_fastcgi) y la recomendad para scripts de línea de comandos</para>
</listitem>
<listitem>
<para>x86 - para sistemas de 32-bits.</para>
</listitem>
<listitem>
<para>x64 - para sistemas de 64 bits.</para>
</listitem>
Los binarios no están disponibles para las extensiones que utilizan características específicas de otros sistemas, como Unix, o dependen de bibliotecas que no están disponibles en Windows.
</para>
</simplesect>
<simplesect>
<title>Tipos de compilación</title>
<para>
Existen cuatro tipos de compilaciones PHP:
<itemizedlist spacing="compact">
<listitem>
<para>Thread-Safe (TS) - para servidores web de proceso único, como Apache con mod_php</para>
</listitem>
<listitem>
<para>Non-Thread-Safe (NTS) - para IIS y otros servidores web FastCGI (Apache con mod_fastcgi) y recomendado para scripts en línea de comandos</para>
</listitem>
<listitem>
<para>x86 - para sistemas de 32 bits.</para>
</listitem>
<listitem>
<para>x64 - para sistemas de 64 bits.</para>
</listitem>
</itemizedlist>
</para>
</sect2>
</simplesect>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:

View File

@@ -1,101 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 8e732e84a1425cf0ab3a5b0da8fe113c7a6da85e Maintainer: seros Status: ready -->
<!-- Reviewed: yes Maintainer: julionc -->
<!-- EN-Revision: e8ac70bf549a723cb36465667a6109d9933b8619 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="install.windows.recommended" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Configuración recomendada en sistemas Windows</title>
<sect2>
<title>OpCache</title>
<para>
Se recomienda habilitar OpCache.
Esta extensión está incluida en PHP para Windows.
Compila y optimiza scripts de PHP y los almancena en memoria caché para así
no tener que compilarlos cada vez que se cargue la página.
Se recomienda encarecidamente activar OpCache.
Esta extensión está incluida con PHP para Windows.
Compila y optimiza los scripts PHP y los almacena en caché en memoria para
que no se compilen cada vez que se carga la página.
</para>
<para>
En el php.ini, establezca
Definir el &php.ini; a :
<example>
<title>Configuración recomendada de WinCache</title>
<title>Configuración recomendada para OpCache</title>
<screen>
<![CDATA[
zend_extension=php_opcache.dll
opcache.enable=On
opcache.cli_enable=On
opcache.enable_cli=On
]]>
</screen>
</example>
</screen>
</example>
Y reiniciar el servidor web.
Y reinice el servidor web.
Para más información, véase: <link linkend="opcache.configuration">Configuración de OpCache</link>
</para>
Para más información, leer :
<link linkend="opcache.configuration">Configuración de OpCache</link>
</para>
</sect2>
<sect2>
<title>WinCache</title>
<para>
Se recomienda que se use WinCache si se utiliza IIS, especialmente en un entorno de alojamiento
web compartido o si se utiliza el almacenamiento de ficheros en red (NAS).
Tenga en cuenta que WinCache ya no es compatible con PHP 8.0.0.
Se recomienda utilizar WinCache al usar IIS, especialmente en un entorno de alojamiento web compartido o al usar almacenamiento de ficheros en red (NAS).
Es importante señalar que WinCache ya no es compatible a partir de PHP 8.0.0.
Todas las aplicaciones de PHP se benefician automáticamente de la funcionalidad de almancenamiento en caché de WinCache. Las operaciones en el sistema de ficheros se almacenan en memoria caché.
Todas las aplicaciones PHP se benefician automáticamente de la funcionalidad de caché de ficheros de WinCache. Las operaciones del sistema de ficheros se almacenan en caché en memoria.
WinCache también puede almacenar en memoria caché objetos de usuario y compartirlos entre procesos de <varname>php.exe</varname> o <varname>php-cgi.exe</varname> (objetos compartidos entre peticiones).
WinCache también puede almacenar en caché en memoria objetos del usuario y compartirlos entre los procesos <varname>php.exe</varname> o
<varname>php-cgi.exe</varname> (compartir objetos entre las peticiones).
Muchas de las grandes aplicaciones web tienen un complemento, extensión u opción de configuración para hacer uso de la caché de objetos de usuario de WinCache.
Muchas aplicaciones web importantes tienen un complemento o una extensión o una opción de configuración para usar el caché de objetos del usuario de WinCache.
Si lo que necesita es un alto rendimiento, debería utilizar la caché de objetos en sus aplicaciones.
Si se requiere un alto rendimiento, utilice el caché de objetos en las aplicaciones.
Véase: <link xlink:href="http://pecl.php.net/package/WinCache">http://pecl.php.net/package/WinCache</link> para descargar una DLL (o tgz) de WinCache a su directorio de extensiones de PHP (extensions_dir en el php.ini).
Ver : <link xlink:href="&url.pecl.package;WinCache">&url.pecl.package;WinCache</link>
para descargar una DLL WinCache (o <filename>WINCACHE_<replaceable>*</replaceable>.tgz</filename>)
en el directorio de extensiones PHP
(<link linkend="ini.extension-dir">extension_dir</link> en el fichero <filename>php.ini</filename>).
En el php.ini, establezca
Definir el &php.ini; a :
<example>
<title>Configuración recomendada de WinCache</title>
<title>Configuración recomendada para WinCache</title>
<screen>
<![CDATA[
extension=php_wincache.dll
wincache.fcenabled=1
wincache.ocenabled=1 ; eliminado a partir de 2.0.0.0
wincache.ocenabled=1 ; removed as of wincache 2.0.0.0
]]>
</screen>
</example>
</screen>
</example>
Para más información, Véase:
<link linkend="wincache.configuration">Configuración WinCache</link>
</para>
Para más información, leer :
<link linkend="wincache.configuration">Configuración de WinCache</link>
</para>
</sect2>
<sect2>
<title>Configuración de IIS</title>
<para>
En el Administrador de IIS, Instalar módulo FastCGI y añadir un manejador para
<varname>`.php`</varname> a la ruta de <varname>PHP-CGI.exe</varname>
(no de <varname>PHP.exe</varname>)
</para>
<para>
Puede usear la herramienta de línea de comandos APPCMD para configurar IIS.
</para>
</sect2>
<sect2>
<title>Base de datos</title>
<para>
Probablemente necesitará un servidor de bases de datos.
Las bases de datos populares proporcionan extensiones de PHP para utillzarlas.
Si su sitio web no tiene mucho tráfico, puede ejecutar el servidor de bases de datos en su mismo servidor web.
Muchos servidores de bases de datos se ejecutan en Windows.
</para>
<para>PHP incluye las extensiones mysqli y pdo_mysql.</para>
<para>
Véase <link xlink:href="https://dev.mysql.com/downloads/windows/">https://dev.mysql.com/downloads/windows/</link>
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:

View File

@@ -1,26 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 8e732e84a1425cf0ab3a5b0da8fe113c7a6da85e Maintainer: seros Status: ready -->
<!-- Reviewed: yes Maintainer: andresdzphp -->
<!-- EN-Revision: e8ac70bf549a723cb36465667a6109d9933b8619 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="install.windows.tools" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Herramientas de instalación de PHP en Windows</title>
<sect2>
<title>Herramientas de instalación de PHP</title>
<para>
Si quiere configurar PHP y está usando IIS,
la forma más fácil es usar <link xlink:href="https://www.microsoft.com/web/downloads/platform.aspx">El instalador de la plataforma web de Microsoft (WebPI)</link>.
</para>
<para><link xlink:href="https://www.apachefriends.org/index.html">XAMPP</link>,
WampServer y BitNami configurarán las aplicaciones PHP para su uso con Apache en Windows.</para>
<title>Herramientas de terceros para la instalación de PHP</title>
&warn.install.third-party-support;
<para>
La configuración de Nginx en Windows requiere un poco más de configuración.
Vea la <link xlink:href="https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/">documentación de Nginx</link>
para obtener ayuda adicional con la configuración.
<link xlink:href="&url.xampp;">XAMPP</link>,
<link xlink:href="&url.wampserver;">WampServer</link>, y
<link xlink:href="&url.bitnami;">Bitnami</link>
configuran asimismo aplicaciones PHP para su uso con Apache en Windows.
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:

View File

@@ -1,260 +1,278 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 8ad67ee7a8cc6c9d7a4cf78065cab87bf2e6c08e Maintainer: Marqitos Status: ready -->
<!-- Reviewed: no Maintainer: seros -->
<chapter xml:id="language.basic-syntax" xmlns="http://docbook.org/ns/docbook">
<title>Sintaxis básica</title>
<sect1 xml:id="language.basic-syntax.phptags">
<title>Etiquetas de PHP</title>
<para>
Cuando PHP analiza un fichero, busca las etiquetas de apertura y cierre,
que son <literal>&lt;?php</literal> y <literal>?&gt;</literal>, y que indican a PHP
dónde empezar y finalizar la interpretación del código. El contenido fuera de estas
etiquetas será ignorado por el analizador de PHP, lo que permite que PHP
se embeba en varios tipos de documentos.
</para>
<!-- EN-Revision: 0e618211e53c66f33762be225a4d57c08ef4b2f7 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<!-- CREDITS: DavidA -->
<chapter xml:id="language.basic-syntax" xmlns="http://docbook.org/ns/docbook" annotations="interactive">
<title>La sintaxis básica</title>
<sect1 xml:id="language.basic-syntax.phptags">
<title>Etiquetas PHP</title>
<para>
Cuando PHP procesa un fichero, reconoce las etiquetas de apertura y
de cierre, <literal>&lt;?php</literal> y <literal>?&gt;</literal>, para
definir los límites de la ejecución del código PHP. El contenido fuera de
las etiquetas es ignorado por el analizador PHP, permitiendo a PHP integrarse
de manera transparente en diversos tipos de documentos.
</para>
<para>
Un carácter de espacio en blanco (espacio, tabulación o nueva línea) debe seguir a
<literal>&lt;?php</literal> para garantizar una separación adecuada de los tokens.
Un carácter de espacio (espacio, tabulación, o nueva línea) debe seguir
<literal>&lt;?php</literal> para asegurar una separación correcta de los tokens.
Omitir este espacio en blanco resultará en un error de sintaxis.
</para>
<para>
PHP también incluye la etiqueta corta de eco <literal>&lt;?=</literal>,
que es una abreviatura de <code>&lt;?php echo</code>.
</para>
<para>
<example>
<title>Etiquetas de apertura y cierre en PHP</title>
<programlisting role="php">
<![CDATA[
1. <?php echo 'si quieres servir código PHP en documentos XHTML o XML,
utiliza estas etiquetas'; ?>
2. Puedes utilizar la etiqueta corta de echo para <?= 'imprimir esta cadena' ?>.
Es equivalente a <?php echo 'imprimir esta cadena' ?>.
3. <? echo 'este código está dentro de etiquetas cortas, pero solo funcionará '.
'si está habilitado short_open_tag'; ?>
]]>
</programlisting>
</example>
</para>
<para>
Las etiquetas cortas (ejemplo tres) están disponibles por defecto, pero se pueden desactivar
ya sea mediante la directiva del archivo de configuración <link linkend="ini.short-open-tag">short_open_tag</link>
en &php.ini;, o están desactivadas por defecto si
PHP se compila con la configuración <option>--disable-short-tags</option>.
</para>
<para>
<note>
<para>
Como las etiquetas cortas pueden deshabilitarse, se recomienda usar solo las
etiquetas normales (<code>&lt;?php ?&gt;</code> y <code>&lt;?= ?&gt;</code>) para
maximizar la compatibilidad.
</para>
</note>
</para>
<para>
Si un fichero contiene solamente código de PHP, es preferible omitir la etiqueta de cierre de PHP
al final del mismo. Así se previene la adición de espacios en blanco o nuevas líneas
accidentales después de la etiqueta de cierre, lo cual causaría efectos no deseados
debido a que PHP comenzará la salida del búfer cuando no había intención por parte
del programador de enviar ninguna salida en ese punto del script.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
echo "Hola mundo";
// ... más código
echo "Última sentencia";
// el script finaliza aquí sin etiqueta de cierre de PHP
]]>
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 xml:id="language.basic-syntax.phpmode">
<title>Salir de HTML</title>
<para>
Cualquier cosa fuera de un par de etiquetas de apertura y cierre es ignorado por el
intérprete de PHP, lo que permite que los ficheros de PHP tengan contenido mixto. Esto hace
que PHP pueda ser embebido en documentos HTML para, por ejemplo, crear plantillas.
<informalexample>
<programlisting role="php">
<![CDATA[
<p>Esto va a ser ignorado por PHP y mostrado por el navegador.</p>
<?php echo 'Mientras que esto va a ser interpretado.'; ?>
<p>Esto también será ignorado por PHP y mostrado por el navegador.</p>
]]>
</programlisting>
</informalexample>
Este ejemplo funciona como estaba previsto, porque cuando PHP intercepta las etiquetas de cierre
?&gt;, simplemente comienza a imprimir cualquier cosa que encuentre (a excepción de
una nueva línea inmediatamente después; véase la
<link linkend="language.basic-syntax.instruction-separation">separación de instrucciones</link>)
hasta que dé con otra etiqueta de apertura a menos que se encuentre en mitad de una sentencia
condicional, en cuyo caso el intérprete determinará el resultado de la
condición antes de tomar una decisión de qué es lo que tiene que saltar.
Vea el siguiente ejemplo.
<para>
PHP incluye también la etiqueta corta echo <literal>&lt;?=</literal>,
que es un atajo para <code>&lt;?php echo</code>.
</para>
<para>
Empleo de estructuras con condiciones
<example>
<title>Salida avanzada usando condiciones</title>
<title>Etiquetas de apertura y cierre PHP</title>
<programlisting role="php">
<![CDATA[
<?php if ($expresión == true): ?>
Esto se mostrará si la expresión es verdadera.
<?php else: ?>
En caso contrario se mostrará esto.
<?php endif; ?>
<![CDATA[
1. <?php echo 'Si se desea integrar código PHP en documentos XHTML o XML, utilice estas etiquetas'; ?>
2. Se puede utilizar la etiqueta corta para <?= 'escribir este texto' ?>.
Es equivalente a <?php echo 'escribir este texto' ?>.
3. <? echo 'este código está entre etiquetas cortas'; ?>
El siguiente código <?= 'texto' ?> es un atajo para <? echo 'texto' ?>
]]>
</programlisting>
</example>
En este ejemplo, PHP saltará los bloques donde la condición no se cumpla, incluso
si están fuera de las etiquetas de apertura/cierre de PHP, los saltará según
la condición debido a que el intérprete salta los bloques contenidos
dentro de una condición que no se cumpla.
</para>
<para>
Para imprimir bloques de texto grandes, es más eficiente abandonar el modo
intérprete de PHP que enviar todo el texto a través de
<function>echo</function> o <function>print</function>.
Las etiquetas cortas (tercer ejemplo) están disponibles por omisión,
pero pueden ser desactivadas a través de la opción
<link linkend="ini.short-open-tag">short_open_tag</link>
del fichero de configuración &php.ini;, o están desactivadas por omisión si PHP
es compilado con la opción <option>--disable-short-tags</option>.
</para>
<para>
<note>
<para>
Observe también que si se está embebiendo PHP dentro de XML o XHTML
será necesario usar las etiquetas &lt;?php ?&gt; para seguir los
estándares.
Como las etiquetas cortas pueden ser desactivadas, se recomienda utilizar
solo las etiquetas normales (<code>&lt;?php ?&gt;</code> y
<code>&lt;?= ?&gt;</code>) para maximizar la compatibilidad.
</para>
</note>
</para>
<para>
Si un fichero termina con código PHP, es preferible no colocar
la etiqueta de cierre al final del fichero. Esto permite evitar olvidar
un espacio o una nueva línea después de la etiqueta de cierre de PHP, lo cual
causaría efectos no deseados ya que PHP comenzará a mostrar la salida,
lo cual no es a menudo el caso deseado.
</para>
<para>
<example>
<title>Fichero que contiene solo código PHP</title>
<programlisting role="php">
<![CDATA[
<?php
echo "Hola mundo\n";
// ... más código
echo "Última instrucción\n";
// el script termina aquí, sin la etiqueta de cierre PHP
]]>
</programlisting>
</example>
</para>
</sect1>
<sect1 xml:id="language.basic-syntax.phpmode">
<title>Escape desde HTML</title>
<para>
Todo lo que se encuentra fuera de un par de etiquetas de apertura/cierre
es ignorado por el analizador PHP, lo que permite tener ficheros PHP
mezclando contenidos. Esto permite a PHP estar contenido en documentos
HTML, para crear por ejemplo plantillas.
</para>
<para>
<example>
<title>Integrar PHP en HTML</title>
<programlisting role="php">
<![CDATA[
<p>Esto será ignorado por PHP y mostrado en el navegador.</p>
<?php echo 'Mientras que esto será analizado por PHP.'; ?>
<p>Esto también será ignorado por PHP y mostrado en el navegador.</p>
]]>
</programlisting>
</example>
</para>
<para>
Esto funciona como se espera porque cuando el intérprete PHP encuentra
la etiqueta de cierre ?&gt;, simplemente comienza a mostrar lo que encuentra (a excepción de la nueva línea que es inmediatamente seguida: ver
la <link linkend="language.basic-syntax.instruction-separation">instrucción
de separación</link>) hasta que encuentre otra etiqueta de apertura
incluso si PHP se encuentra en medio de una instrucción condicional, en cuyo caso,
el intérprete determinará la condición a tener en cuenta antes de tomar una decisión sobre lo que debe ser mostrado.
Ver el siguiente ejemplo.
</para>
<para>
Uso de estructuras con condiciones
<example>
<title>Escape avanzado usando condiciones</title>
<programlisting role="php">
<![CDATA[
<?php if ($expression == true): ?>
Esto será mostrado si la expresión es verdadera.
<?php else: ?>
De lo contrario, esto será mostrado.
<?php endif; ?>
]]>
</programlisting>
</example>
En este ejemplo, PHP ignorará los bloques donde la condición no se cumpla,
incluso si están fuera de las etiquetas de apertura/cierre de PHP. PHP
los ignorará según la condición ya que el intérprete PHP pasará
los bloques que contienen lo que no se cumple por la condición.
</para>
<para>
Para mostrar grandes bloques de texto, es más eficiente salir
del modo de análisis de PHP en lugar de enviar el texto a través de la función
<function>echo</function> o
<function>print</function>.
</para>
<para>
<note>
<para>
Si PHP está integrado en un documento XML o XHTML, la etiqueta PHP
estándar <code>&lt;?php ?&gt;</code> debe ser utilizada para mantener la conformidad con los estándares.
</para>
</note>
</para>
</sect1>
<sect1 xml:id="language.basic-syntax.instruction-separation">
<title>Separación de instrucciones</title>
<para>
Como en C o en Perl, PHP requiere que las instrucciones terminen
en punto y coma al final de cada sentencia. La etiqueta de cierre
de un bloque de código de PHP automáticamente implica un punto y coma; no
es necesario usar un punto y coma para cerrar la última línea de un
bloque de PHP. La etiqueta de cierre del bloque incluirá la nueva línea
final inmediata si está presente.
Al igual que en C o en Perl, PHP requiere que las instrucciones sean terminadas
por un punto y coma al final de cada instrucción. La etiqueta
de cierre de un bloque de código PHP implica automáticamente un punto y coma;
por lo tanto, no es necesario utilizar un punto y coma
para terminar la última línea de un bloque PHP. La etiqueta de cierre
de un bloque incluye el carácter de nueva línea seguido inmediatamente si uno
está presente.
</para>
<para>
<example>
<title>Ejemplo que muestra la etiqueta de cierre abarcando la nueva línea final</title>
<programlisting role="php">
<para>
<example>
<title>Ejemplo que muestra que la etiqueta de cierre incluye la nueva línea que sigue</title>
<programlisting role="php">
<![CDATA[
<?php echo "Algo de texto"; ?>
<?php echo "Algún texto"; ?>
Sin nueva línea
<?= "Pero nueva línea ahora" ?>
]]>
</programlisting>
&example.outputs;
<screen>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Algo de textoSin nueva línea
Algún textoSin nueva línea
Pero nueva línea ahora
]]>
</screen>
</screen>
</example>
</para>
<para>
<example>
<title>Ejemplos de entrada y salida del analizador PHP</title>
<programlisting role="php">
<![CDATA[
<?php
echo 'Esto es una prueba\n';
?>
<?php echo 'Esto es una prueba\n' ?>
<?php echo 'Omitimos la última etiqueta de cierre\n';
]]>
</programlisting>
</example>
</para>
<para>
Ejemplos de entrada y salida del analizador PHP:
<informalexample>
<programlisting role="php">
<note>
<para>
La etiqueta de cierre de un bloque PHP al final de un fichero es opcional,
y a veces es útil omitirla cuando se utiliza la función
<function>include</function> o
la función <function>require</function>,
ya que los espacios no deseados no aparecerán al final de los ficheros, y así,
siempre se podrán agregar encabezados a la respuesta más tarde. Esto es útil
también si se desea utilizar la visualización del búfer y no se desea ver espacios en blanco añadidos al final de las partes generadas por los ficheros
incluidos.
</para>
</note>
</para>
</sect1>
<sect1 xml:id="language.basic-syntax.comments">
<title>Comentarios</title>
<para>
PHP soporta los comentarios de tipo C, C++ y Shell Unix (también
llamado estilo Perl). Por ejemplo :
</para>
<para>
<example>
<title>Comentarios</title>
<programlisting role="php">
<![CDATA[
<?php
echo 'Esto es una prueba';
?>
<?php echo 'Esto es una prueba' ?>
<?php echo 'Hemos omitido la última etiqueta de cierre';
]]>
</programlisting>
</informalexample>
<note>
<para>
La etiqueta de cierre de un bloque de PHP es opcional al final de un fichero,
y en algunos casos es útil omitirla cuando se usa <function>include</function>
o <function>require</function>, para que no se produzcan espacios
en blanco al final de los ficheros, pudiéndose aún añadir así
cabeceras para la respuesta posterior. También es práctico si se utiliza la salida
del buffer y no se desean espacios en blanco no deseados
al final de las partes generadas por ficheros incluídos.
</para>
</note>
</para>
</sect1>
<sect1 xml:id="language.basic-syntax.comments">
<title>Comentarios</title>
<para>
PHP admite comentarios al estilo de 'C', 'C++' y de consola de Unix (estilo de Perl). Por ejemplo:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
echo 'Esto es una prueba'; // Esto es un comentario al estilo de c++ de una sola línea
/* Esto es un comentario multilínea
y otra lína de comentarios */
echo 'Esto es otra prueba';
echo 'Una prueba final'; # Esto es un comentario al estilo de consola de una sola línea
echo 'Esto es una prueba\n'; // Esto es un comentario de una sola línea, estilo c++
/* Esto es un comentario de
varias líneas */
echo 'Esto es otra prueba\n';
echo 'Y una prueba final\n'; # Esto es un comentario de una sola línea estilo shell
?>
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Los comentarios al estilo de "una sola línea" solo comentan hasta el final
de la línea o del bloque actual de código de PHP, lo primero que suceda.
Esto implica que el código HTML después de <literal>// ... ?&gt;</literal>
o <literal># ... ?&gt;</literal> SERÁ impreso:
?&gt; sale del modo PHP y vuelve al modo HTML, por lo que
<literal>//</literal> o <literal>#</literal> no pueden influir en eso.
</simpara>
<para>
<informalexample>
<programlisting role="php">
</programlisting>
</example>
</para>
<simpara>
Los comentarios de una sola línea solo comentan hasta el final
de la línea del bloque PHP actual.
Esto significa que el código HTML después de <literal>// ... ?&gt;</literal>
o después de <literal># ... ?&gt;</literal> SERÁ mostrado:
?&gt; terminará el modo PHP y volve al modo HTML, y
<literal>//</literal> o <literal>#</literal> no influirá en ello.
</simpara>
<para>
<example>
<title>Los comentarios van hasta el final de la línea</title>
<programlisting role="php">
<![CDATA[
<h1>Esto es un <?php # echo 'simple';?> ejemplo</h1>
<p>El encabezado anterior dirá 'Esto es un ejemplo'.</p>
<h1>Esto es un ejemplo <?php # echo 'simple';?></h1>
<p>La línea anterior mostrará 'Esto es un ejemplo'.</p>
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Los comentarios al estilo de 'C' finalizan con el primer <literal>*/</literal> que se encuentre.
Asegúrese de no anidar comentarios al estilo de 'C'. Es muy fácil cometer este
error cuando se intenta comentar un bloque grande de código.
</simpara>
<para>
<informalexample>
<programlisting role="php">
</programlisting>
</example>
</para>
<simpara>
Los comentarios estilo 'C' comentan hasta que se encuentre el primer <literal>*/</literal>.
Se debe tener cuidado con los comentarios estilo 'C' anidados en grandes bloques cuando se comentan.
</simpara>
<para>
<example>
<title>Los comentarios de tipo C</title>
<programlisting role="php">
<![CDATA[
<?php
/*
echo 'Esto es una prueba'; /* Este comentario causará un problema*/
echo 'Esto es una prueba'; /* Este comentario causará un problema */
*/
?>
]]>
</programlisting>
</informalexample>
</para>
</sect1>
</chapter>
</programlisting>
</example>
</para>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
@@ -272,7 +290,4 @@ sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -1,84 +1,125 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 7a75b854c8c52226d38397e7e8177e339fdb273f Maintainer: seros Status: ready -->
<!-- EN-Revision: 402a72776804fbb74ec5c4cad72d4c7b6cdd5b2d Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="language.exceptions" xmlns="http://docbook.org/ns/docbook">
<title>Excepciones</title>
<chapter xml:id="language.exceptions">
<!-- we use our own DTD instead of xmlns="http://docbook.org/ns/docbook" so that we can use
<sect1 annotations="chunk:false"> -->
<title>Las excepciones</title>
<para>
PHP tiene un modelo de excepciones similar al de otros lenguajes de programación.
Una excepción puede ser lanzada ("&throw;n"), y atrapada ("&catch;ed") dentro de
PHP. El código puede estar dentro de un bloque &try; para facilitar la captura
de excepciones potenciales. Cada bloque &try; debe tener al menos un
bloque &catch; o &finally; correspondiente.
PHP tiene una gestión de excepciones similar a la que ofrecen otros
lenguajes de programación.
Una excepción puede ser lanzada ("&throw;") y atrapada
("&catch;") en PHP. El código debe estar rodeado
de un bloque &try; para facilitar la captura de una excepción
potencial. Cada &try; debe tener al menos
un bloque &catch; o &finally; correspondiente.
</para>
<para>
Si se lanza una excepción y el alcance de la función actual no tiene un bloque &catch;,
la excepción "subirá" por la pila de llamadas hasta encontrar un bloque &catch;
que coincida. Todos los bloques &finally; que encuentre en el camino se ejecutarán.
Si la pila de llamadas se desenrolla hasta el alcance global sin encontrar un bloque &catch;
coincidente, el programa termina con un error fatal, a menos que se haya
configurado un manejador de excepciones global.
Si una excepción es lanzada y el ámbito actual de la función no tiene
un bloque &catch;, la excepción "subirá" la pila de llamadas de la función llamante
hasta encontrar un bloque &catch; correspondiente. Todos los bloques &finally; encontrados
serán ejecutados. Si la pila de llamadas se despliega hasta el ámbito global sin
encontrar un bloque &catch; correspondiente, el programa será terminado con
un error fatal a menos que se haya definido un gestor global de excepciones.
</para>
<para>
El objeto lanzado debe ser un &instanceof; <interfacename>Throwable</interfacename>.
Intentar lanzar un objeto que no lo sea resultará en un error fatal de PHP.
El objeto lanzado debe ser una &instanceof; <interfacename>Throwable</interfacename>.
Intentar lanzar un objeto que no lo sea resultará en un error fatal emitido por PHP.
</para>
<para>
A partir de PHP 8.0.0, la palabra clave &throw; es una expresión y puede usarse en cualquier
contexto de expresión. En versiones anteriores, era una declaración y debía estar en su propia línea.
A partir de PHP 8.0.0, la palabra clave &throw; es una expresión y puede ser
utilizada en cualquier contexto de expresiones. En las versiones
anteriores era una declaración que debía estar en su propia línea.
</para>
<sect1 annotations="chunk:false" xml:id="language.exceptions.catch">
<title><literal>catch</literal></title>
<para>
Se pueden usar múltiples bloques &catch; para atrapar diferentes clases de
excepciones. La ejecución normal (cuando no es lanzada ninguna excepción dentro del bloque
&try;) continuará después del último bloque &catch; definido en la sencuencia.
Las excepciones pueden ser lanzadas ("&throw;n") (o relanzadas) dentro de un bloque &catch;.
</para>
<para>
Cuando una excepción es lanzada, el código siguiente a la declaración no será
ejecutado, y PHP intentará encontrar el primer bloque &catch; coincidente.
Si una excepción no es capturada, se emitirá un Error Fatal de PHP con un
mensaje "<literal>Uncaught Exception ...</literal>" ("Excepción No Capturada"), a menos que se haya
definido un manejador con <function>set_exception_handler</function>.
</para>
</sect1>
<sect1 annotations="chunk:false" xml:id="language.exceptions.finally">
<para>
Un bloque &catch; define cómo reaccionar a una excepción que ha sido lanzada.
Un bloque &catch; define uno o más tipos de excepciones o errores que puede
gestionar, y opcionalmente una variable en la que asignar la excepción.
(Esta variable era requerida en las versiones anteriores a PHP 8.0.0)
El primer bloque &catch; que una excepción o error lanzado encuentre y que corresponda al
tipo del objeto lanzado gestionará el objeto.
</para>
<para>
Varios bloques &catch; pueden ser utilizados para atrapar diferentes
clases de excepciones. La ejecución normal (cuando ninguna excepción es lanzada
en el bloque &try;) continúa después del último
bloque &catch; definido en la secuencia. Las excepciones
pueden ser lanzadas (&throw;) o relanzadas en un bloque &catch;. De lo contrario,
la ejecución continuará después del bloque &catch; que ha sido desencadenado.
</para>
<para>
Cuando una excepción es lanzada, el código siguiente al procesamiento no será
ejecutado y PHP intentará encontrar el primer bloque &catch; correspondiente.
Si una excepción no es atrapada, un error fatal emitido por PHP será
enviado con un mensaje "<literal>Uncaught Exception ...</literal>"
indicando que la excepción no pudo ser atrapada a menos que un gestor
de excepciones sea definido con la función
<function>set_exception_handler</function>.
</para>
<para>
A partir de PHP 7.1, un bloque &catch; puede especificar múltiples excepciones
utilizando el carácter pipe (<literal>|</literal>). Esto es útil cuando
diferentes excepciones de jerarquías de clases diferentes son tratadas
de la misma manera.
</para>
<para>
A partir de PHP 8.0.0, el nombre de variable para la excepción atrapada es
opcional. Si no se especifica, el bloque &catch; será siempre ejecutado pero
no tendrá acceso al objeto lanzado.
</para>
</sect1>
<sect1 annotations="chunk:false" xml:id="language.exceptions.finally">
<title><literal>finally</literal></title>
<para>
En PHP y posterior, se puede utilizar un bloque &finally; después o
en lugar de los bloques &catch;. El código de dentro del bloque &finally; siempre se
ejecutará después de los bloques &try; y &catch;, independientemente de que se haya
lanzado una excepción o no, y antes de que la ejecución normal continúe.
</para>
</sect1>
Un bloque &finally; también puede ser
especificado después de los bloques &catch;. El código dentro
del bloque &finally; será siempre ejecutado después de los bloques
&try; y &catch;, independientemente de si una
excepción ha sido lanzada, antes de continuar con la ejecución normal.
</para>
<para>
Una interacción notable es entre un bloque &finally; y una declaración
&return;.
Si una declaración &return; es encontrada dentro de los bloques &try;
o &catch;, el bloque &finally; será ejecutado de todos modos. Además,
la declaración &return; es evaluada cuando es encontrada, pero el
resultado será devuelto después de que el bloque &finally; sea ejecutado.
Adicionalmente, si el bloque &finally; contiene también una declaración
&return;, el valor del bloque &finally; es devuelto.
</para>
</sect1>
<sect1 annotations="chunk:false" xml:id="language.exceptions.exception-handler">
<title>Manejador global de excepciones</title>
<title>Gestor global de excepciones</title>
<para>
Si se permite que una excepción suba hasta el alcance global, puede ser capturada
por un manejador global de excepciones si está configurado. La función <function>set_exception_handler</function>
puede establecer una función que será llamada en lugar de un bloque &catch; si no se invoca
ningún otro bloque. El efecto es esencialmente el mismo que si todo el programa
estuviera envuelto en un bloque &try;-&catch; con esa función como el &catch;.
Si una excepción es permitida subir hasta el ámbito global, puede
ser atrapada por un gestor de excepciones global si ha sido definido. La función
<function>set_exception_handler</function> puede definir una función que será
llamada en lugar de un bloque &catch; si ningún otro bloque es invocado.
El efecto es esencialmente idéntico a rodear todo el programa en un
bloque &try;-&catch; con esta función como &catch;.
</para>
</sect1>
<sect1 annotations="chunk:false" xml:id="language.exceptions.notes">
&reftitle.notes;
<note>
<para>
Las funciones internas de PHP utilizan principalmente la
<link linkend="ini.error-reporting">Información de Errores</link>, sólo las extensiones
<link linkend="language.oop5">Orientadas a objetos</link>
modernas utilizan excepciones. Sin embargo, los errores se pueden traducir a
excepciones simplemente con <link linkend="class.errorexception">ErrorException</link>.
</para>
<sect1 annotations="chunk:false" xml:id="language.exceptions.notes">
&reftitle.notes;
<note>
<para>
Las funciones internas de PHP utilizan principalmente el
<link linkend="ini.error-reporting">Error reporting</link>, solo las extensiones
<link linkend="language.oop5">orientadas a objetos</link>
utilizan las excepciones. De todos modos, los errores pueden ser fácilmente traducidos en
excepciones con <link linkend="class.errorexception">ErrorException</link>.
Sin embargo, esta técnica solo funciona para los errores no fatales.
</para>
<example>
<title>Convertir el informe de errores a excepciones</title>
<title>Convertir el error reporting en excepciones</title>
<programlisting role="php">
<![CDATA[
<?php
@@ -94,21 +135,21 @@ set_error_handler('exceptions_error_handler');
</note>
<tip>
<para>
La <link linkend="intro.spl">Biblioteca Estándar de PHP (SPL)</link> proporciona
una buena cantidad de <link linkend="spl.exceptions">excepciones integradas</link>.
La <link linkend="intro.spl">biblioteca estándar PHP (SPL)</link> proporciona
un buen número <link linkend="spl.exceptions">de excepciones adicionales</link>.
</para>
</tip>
</sect1>
<sect1 annotations="chunk:false" xml:id="language.exceptions.examples">
&reftitle.examples;
<example>
<title>Lanzar una Excepción</title>
<programlisting role="php">
<title>Lanzar una excepción</title>
<programlisting role="php">
<![CDATA[
<?php
function inverso($x) {
function inverse($x) {
if (!$x) {
throw new Exception('División por cero.');
}
@@ -116,29 +157,29 @@ function inverso($x) {
}
try {
echo inverso(5) . "\n";
echo inverso(0) . "\n";
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Excepción capturada: ', $e->getMessage(), "\n";
echo 'Excepción recibida : ', $e->getMessage(), "\n";
}
// Continuar la ejecución
echo 'Hola Mundo\n';
echo Hola mundo!\n";
?>
]]>
</programlisting>
&example.outputs;
<screen>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
0.2
Excepción capturada: División por cero.
Hola Mundo
Excepción recibida : División por cero.
¡Hola mundo!
]]>
</screen>
</example>
<example>
<title>Manejo de excepciones con un bloque <literal>finally</literal></title>
<programlisting role="php">
</screen>
</example>
<example>
<title>Gestión de la excepción con un bloque &finally;</title>
<programlisting role="php">
<![CDATA[
<?php
function inverse($x) {
@@ -151,37 +192,37 @@ function inverse($x) {
try {
echo inverse(5) . "\n";
} catch (Exception $e) {
echo 'Excepción capturada: ', $e->getMessage(), "\n";
echo 'Excepción recibida : ', $e->getMessage(), "\n";
} finally {
echo "Primer finally.\n";
echo "Primer final.\n";
}
try {
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Excepción capturada: ', $e->getMessage(), "\n";
echo 'Excepción recibida : ', $e->getMessage(), "\n";
} finally {
echo "Segundo finally.\n";
echo "Segundo final.\n";
}
// Continuar ejecución
echo 'Hola Mundo\n';
// Continuar la ejecución
echo Hola mundo!\n";
?>
]]>
</programlisting>
&example.outputs;
<screen>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
0.2
Primer finally.
Excepción capturada: División por cero.
Segundo finally.
Hola Mundo
Primer final.
Excepción recibida : División por cero.
Segundo final.
¡Hola mundo!
]]>
</screen>
</example>
</screen>
</example>
<example>
<title>Interaction between the &finally; block and &return;</title>
<title>Interacción entre el bloque &finally; y &return;</title>
<programlisting role="php">
<![CDATA[
<?php
@@ -208,20 +249,20 @@ finally
</screen>
</example>
<example>
<title>Excepciones anidadas</title>
<programlisting role="php">
<title>Herencia de una excepción</title>
<programlisting role="php">
<![CDATA[
<?php
class MiExcepción extends Exception { }
class MyException extends Exception { }
class Prueba {
public function probar() {
class Test {
public function testing() {
try {
try {
throw new MiExcepción('foo!');
} catch (MiExcepción $e) {
// relanzarla
throw new MyException('foo!');
} catch (MyException $e) {
// se relanza
throw $e;
}
} catch (Exception $e) {
@@ -230,12 +271,12 @@ class Prueba {
}
}
$foo = new Prueba;
$foo->probar();
$foo = new Test;
$foo->testing();
?>
]]>
</programlisting>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
@@ -244,7 +285,7 @@ string(4) "foo!"
</screen>
</example>
<example>
<title>Multi catch exception handling</title>
<title>Gestión de excepciones de captura múltiple</title>
<programlisting role="php">
<![CDATA[
<?php
@@ -277,14 +318,12 @@ string(11) "MyException"
</screen>
</example>
<example>
<title>Omitting the caught variable</title>
<para>Only permitted in PHP 8.0.0 and later.</para>
<title>Omitir la variable atrapada</title>
<para>Solo permitido en PHP 8.0.0 y posteriores.</para>
<programlisting role="php">
<![CDATA[
<?php
class SpecificException extends Exception {}
function test() {
throw new SpecificException('Oopsie');
}
@@ -292,21 +331,33 @@ function test() {
try {
test();
} catch (SpecificException) {
print "A SpecificException was thrown, but we don't care about the details.";
print "Se lanzó una SpecificException, pero no nos importan los detalles.";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Se lanzó una SpecificException, pero no nos importan los detalles.
]]>
</screen>
</example>
<example>
<title>Throw as an expression</title>
<para>Only permitted in PHP 8.0.0 and later.</para>
<title>Throw como expresn</title>
<para>Solo permitido en PHP 8.0.0 y posteriores.</para>
<programlisting role="php">
<![CDATA[
<?php
class SpecificException extends Exception {}
function test() {
do_something_risky() or throw new Exception('It did not work');
do_something_risky() or throw new Exception('No funcionó');
}
function do_something_risky() {
return false; // Simular un fallo
}
try {
@@ -317,64 +368,72 @@ try {
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
No funcionó
]]>
</screen>
</example>
</sect1>
<sect1 xml:id="language.exceptions.extending">
<title>Ampliar las Excepciones</title>
<title>Extender las Excepciones</title>
<para>
Una clase de Excepción definida por el usuario puede ser definida ampliando la clase
Exception interna. Los miembros y las propiedades de abajo muestran lo que es accesible
dentro de la clase hija que deriva de la clase Exception interna.
Una clase de excepción definida por el usuario puede ser definida extendiendo
la clase Exception integrada. Los miembros y las propiedades a continuación muestran
lo que es accesible en la clase hija que deriva de la clase Exception
integrada.
</para>
<example>
<title>La clase Exception Interna</title>
<title>La clase de excepción integrada</title>
<programlisting role="php">
<![CDATA[
<?php
class Exception
class Exception implements Throwable
{
protected $message = 'Unknown exception'; // mensaje de excepción
protected $message = 'Unknown exception'; // Mensaje de excepción
private $string; // caché de __toString
protected $code = 0; // código de excepción definido por el usuario
protected $file; // nombre de archivo fuente de la excepción
protected $file; // nombre de fichero fuente de la excepción
protected $line; // línea fuente de la excepción
private $trace; // determinación del origen
private $previous; // excepción previa si la excepción está anidada
private $trace; // traza de la pila de ejecución
private $previous; // excepción previa si excepción anidada
public function __construct($message = null, $code = 0, Exception $previous = null);
public function __construct($message = '', $code = 0, ?Throwable $previous = null);
final private function __clone(); // Inhibe la clonación de excepciones.
final private function __clone(); // Inhibe la duplicación de excepciones.
final public function getMessage(); // mensaje de excepción
final public function getCode(); // código de excepción
final public function getFile(); // nombre de archivo fuente
final public function getMessage(); // mensaje de la excepción
final public function getCode(); // código de la excepción
final public function getFile(); // nombre del fichero fuente
final public function getLine(); // línea fuente
final public function getTrace(); // un array de backtrace()
final public function getPrevious(); // excepción anterior
final public function getTraceAsString(); // string formateado del seguimiento del origen
final public function getTrace(); // array de la traza de la pila de ejecución
final public function getPrevious(); // la excepción previa
final public function getTraceAsString(); // traza en forma de string
// Sobrescribible
public function __toString(); // string formateado para mostrar
// Puede ser redefinida
public function __toString(); // string formateada para la visualización
}
?>
]]>
</programlisting>
</example>
<para>
Si una clase extiende la clase Exception interna y redefine el <link
Si una clase extiende la clase Exception integrada y redefine el <link
linkend="language.oop5.decon">constructor</link>, se recomienda encarecidamente
que también llame a <link
linkend="language.oop5.paamayim-nekudotayim">parent::__construct()</link>
para asegurarse que toda la información disponible haya sido asignada apropiadamente. El
método <link linkend="language.oop5.magic">__toString()</link> puede ser sobrescrito
para proporcionar una salida personalizada cuando el objeto es presentado como un string.
linkend="language.oop5.paamayim-nekudotayim">parent::__construct()</link>
para asegurarse de que todos los datos disponibles hayan sido correctamente asignados.
La función <link linkend="language.oop5.magic">__toString()</link> puede ser
redefinida para proporcionar una salida personalizada cuando el objeto es presentado
en forma de string.
</para>
<note>
<para>
Las excepciones no se pueden clonar. Intentar <link
linkend="language.oop5.cloning">clonar</link> una Excepción resultará en un
error <constant>E_ERROR</constant> fatal.
Las excepciones no pueden ser clonadas. Intentar <link
linkend="language.oop5.cloning">clonar</link> una Exception resultará en un
error fatal <constant>E_ERROR</constant>.
</para>
</note>
<example>
@@ -383,33 +442,32 @@ class Exception
<![CDATA[
<?php
/**
* Definir una clase de excepción personalizada
* Define una clase de excepción personalizada.
*/
class MiExcepción extends Exception
class MyException extends Exception
{
// Redefinir la excepción, por lo que el mensaje no es opcional
public function __construct($message, $code = 0, Exception $previous = null) {
// algo de código
// asegúrese de que todo está asignado apropiadamente
// Redefine la excepción para que el mensaje no sea opcional.
public function __construct($message, $code = 0, ?Throwable $previous = null) {
// código
// asegurarse de que todo esté correctamente asignado
parent::__construct($message, $code, $previous);
}
// representación de cadena personalizada del objeto
// Representación personalizada del objeto en forma de string.
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function funciónPersonalizada() {
public function customFunction() {
echo "Una función personalizada para este tipo de excepción\n";
}
}
/**
* Crear una clase para probar la excepción
*/
class ProbarExcepción
class TestException
{
public $var;
@@ -421,75 +479,71 @@ class ProbarExcepción
switch ($avalue) {
case self::THROW_CUSTOM:
// lanzar la excepción personalizada
throw new MiExcepción('1 no es un parámetro válido', 5);
// Lanza una excepción personalizada
throw new MyException('1 no es un parámetro válido', 5);
break;
case self::THROW_DEFAULT:
// lanzar la predeterminada.
// Lanza la predeterminada.
throw new Exception('2 no está permitido como parámetro', 6);
break;
default:
// No hay excepción, el objeto se crea.
default:
// Ninguna excepción, el objeto se creado.
$this->var = $avalue;
break;
}
}
}
// Ejemplo 1
try {
$o = new ProbarExcepción(ProbarExcepción::THROW_CUSTOM);
} catch (MiExcepción $e) { // Será atrapada
echo "Atrapada mi excepción\n", $e;
$e->funciónPersonalizada();
} catch (Exception $e) { // Skipped
echo "Atrapada la Excepción Predeterminada\n", $e;
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // Será capturada
echo "MyException capturada\n", $e;
$e->customFunction();
} catch (Exception $e) { // Ignorada
echo "Excepción predeterminada capturada\n", $e;
}
// Continuar la ejecución
var_dump($o); // Null
echo "\n\n";
// Ejemplo 2
try {
$o = new ProbarExcepción(ProbarExcepción::THROW_DEFAULT);
} catch (MiExcepción $e) { // Este tipo no coincide
echo "Atrapada mi excepción\n", $e;
$e->funciónPersonalizada();
} catch (Exception $e) { // Will be caught
echo "Atrapada la Excepción Predeterminada\n", $e;
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // No coincide con este tipo
echo "MyException capturada\n", $e;
$e->customFunction();
} catch (Exception $e) { // Será capturada
echo "Excepción predeterminada capturada\n", $e;
}
// Continuar la ejecución
var_dump($o); // Null
echo "\n\n";
// Ejemplo 3
try {
$o = new ProbarExcepción(ProbarExcepción::THROW_CUSTOM);
} catch (Exception $e) { // Será atrapada
echo "Atrapada la Excepción Predeterminada\n", $e;
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // Será capturada
echo "Excepción predeterminada capturada\n", $e;
}
// Continuar la ejecución
var_dump($o); // Null
echo "\n\n";
// Ejemplo 4
try {
$o = new ProbarExcepción();
} catch (Exception $e) { // Saltado, sin excepción
echo "Atrapada la Excepción Predeterminada\n", $e;
$o = new TestException();
} catch (Exception $e) { // Saltada, ninguna excepción
echo "Excepción predeterminada capturada\n", $e;
}
// Continuar la ejecución
var_dump($o); // ProbarExcepción
var_dump($o); // TestException
echo "\n\n";
?>
]]>
@@ -498,24 +552,24 @@ echo "\n\n";
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

File diff suppressed because it is too large Load Diff

View File

@@ -1,59 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 8c3557271d9ae71bbc8ec2a47ad83960d4272184 Maintainer: seros Status: ready -->
<!-- Reviewed: no Maintainer: andresdzphp -->
<!-- EN-Revision: 08e58ace7e5b538c8ed75d784a54885d5f785d30 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<!-- CREDITS: DAnnebicque -->
<chapter xml:id="language.generators" xmlns="http://docbook.org/ns/docbook">
<title>Generadores</title>
<title>Generators</title>
<sect1 xml:id="language.generators.overview">
<title>Información general de los generadores</title>
<title>Resumen sobre los generadores</title>
<?phpdoc print-version-for="generators"?>
<para>
Los generadores proporcionan un modo fácil de implementar
<link linkend="language.oop5.iterations">iteradores</link> simples sin la
sobrecarga o complejidad de implementar una clase que implemente la
interfaz <classname>Iterator</classname>.
Los generadores proporcionan una manera sencilla de implementar
<link linkend="language.oop5.iterations">iteradores</link>
sin el costo ni la complejidad de desarrollar una clase que implemente
la interfaz <classname>Iterator</classname>.
</para>
<para>
Un generador permite escribir código que utilice &foreach; para iterar sobre un
conjunto de datos sin que sea necesario cargar el array en memoria, lo que puede ocasionar
que se exceda el límite de memoria, o requiera una cantidad considerable de
tiempo de procesado para generarse. En su lugar, se puede escribir una función generadora,
que es igual que una
<link linkend="functions.user-defined">función</link> normal, con la salvedad de que en vez
de
hacer un solo <link linkend="functions.returning-values">return</link>, un
generador puede invocar &yield; tantas veces como necesite para proporcionar
valores por los que iterar.
Un generador ofrece un medio conveniente para proporcionar datos a las bucles &foreach; sin
tener que construir un array en memoria de antemano, lo cual podría llevar al programa
a exceder un límite de memoria o requerir un tiempo de procesamiento considerable para generarlos.
En su lugar, se puede utilizar una función generadora,
que es idéntica a una
<link linkend="functions.user-defined">función</link> normal,
excepto que en lugar de <link linkend="functions.returning-values">devolver</link>
una sola vez, un generador puede utilizar &yield; tantas veces como sea necesario, para
proporcionar los valores a recorrer.
Al igual que con los iteradores, el acceso aleatorio a los datos no es posible.
</para>
<para>
Un ejemplo simple de esto es reimplementar la función <function>range</function>
como un generador. La función estándar <function>range</function>
tiene que generar un array con cada uno de los valores y devolverlo, lo que puede
resultar en arrays grandes: por ejemplo, llamar
<command>range(0, 1000000)</command> resultará en más de 100 MB de
memoria utilizada.
Un ejemplo sencillo de este mecanismo es la reimplementación
de la función <function>range</function> en forma de generador.
La función estándar <function>range</function> debe generar un array
que contenga cada valor y devolverlo, lo cual puede llevar
a arrays de gran tamaño: por ejemplo, la llamada al código
<command>range(0, 1000000)</command> puede consumir significativamente más de
100 MB de memoria.
</para>
<para>
Como alternativa, se puede implementar un generador <literal>xrange()</literal>,
que sólo necesitará memoria para crear un
objeto <classname>Iterator</classname> y controlar el estado actual del
generador de manera interna, lo que no ocupa más de 1 kilobyte.
Como alternativa, se puede implementar un generador
<literal>xrange()</literal>, que solo necesitará memoria para la creación de un objeto <classname>Iterator</classname>, y deberá mantener internamente el estado actual del generador, lo cual resulta en un consumo de memoria inferior a 1 KB.
</para>
<example>
<title>Implementando <function>range</function> como generador</title>
<title>Implementación de la función <function>range</function> en forma de generador</title>
<programlisting role="php">
<![CDATA[
<?php
function xrange($start, $limit, $step = 1) {
if ($start < $limit) {
if ($start <= $limit) {
if ($step <= 0) {
throw new LogicException('Step tiene que ser +ve');
throw new LogicException('El paso debe ser positivo');
}
for ($i = $start; $i <= $limit; $i += $step) {
@@ -61,7 +62,7 @@ function xrange($start, $limit, $step = 1) {
}
} else {
if ($step >= 0) {
throw new LogicException('Step tiene que ser -ve');
throw new LogicException('El paso debe ser negativo');
}
for ($i = $start; $i >= $limit; $i += $step) {
@@ -71,17 +72,17 @@ function xrange($start, $limit, $step = 1) {
}
/*
* Obsereve que tanto range() como xrange() producen la misma
* salida a continuación.
* Es de notar que las funciones range() y xrange() producen el
* mismo resultado, a continuación.
*/
echo 'Números impares de una cifra de range(): ';
echo 'Números impares de un solo dígito desde range(): ';
foreach (range(1, 9, 2) as $number) {
echo "$number ";
}
echo "\n";
echo 'Números impares de una cifra de xrange(): ';
echo 'Números impares de un solo dígito desde xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
@@ -91,74 +92,72 @@ foreach (xrange(1, 9, 2) as $number) {
&example.outputs;
<screen>
<![CDATA[
Números impares de una cifra de range(): 1 3 5 7 9
Números impares de una cifra de xrange(): 1 3 5 7 9
Números impares de un solo dígito desde range(): 1 3 5 7 9
Números impares de un solo dígito desde xrange(): 1 3 5 7 9
]]>
</screen>
</example>
<sect2 xml:id="language.generators.object">
<title>Objetos <classname>Generator</classname></title>
<title>Los objetos <classname>Generator</classname></title>
<para>
Cuando una función generadora es invocada por primera vez, se devuelve un
objeto de la clase interna <classname>Generator</classname>. Este objeto
implementa la interfaz <classname>Iterator</classname> de la misma forma
que lo haría un objeto iterador de solo avance, y proporciona métodos que pueden
ser invocados para manipular el estado del generador, incluyendo el envío
de valores hacia y la devolución de valores desde él.
Cuando se llama a una función generadora,
se devuelve un objeto de la clase interna <classname>Generator</classname>. Este objeto implementa la interfaz <classname>Iterator</classname>
de la misma manera que lo haría un objeto iterador que solo avanza, y proporciona los métodos que pueden ser llamados para manipular el estado
del generador, incluyendo el envío de valores y sus retornos.
</para>
</sect2>
</sect1>
<sect1 xml:id="language.generators.syntax">
<title>Generator syntax</title>
<title>Sintaxis de un Generador</title>
<para>
Una función generadora es igual que una función normal, con la diferencia de que en vez
de devolver un valor, un generador invoca &yield; tantas veces como necesita.
Una función generadora se asemeja a una función normal, excepto que en lugar de
devolver un valor, un generador &yield; devuelve tantos valores como sea necesario.
Todas las funciones que contienen &yield; son funciones generadoras.
</para>
<para>
Cuando se llama a una función generadora, devuelve un objeto que puede ser
iterado. Cuando se itera sobre ese objeto (por ejemplo, con un
bucle &foreach;), PHP llamará a la función generadora cada vez que necesite un
valor, y guardará el estado del generador cuando este provea un
valor con yield para que ese estado pueda ser recuperado cuando el próximo valor sea requerido.
Cuando se llama a una función generadora, devuelve un objeto
que se puede recorrer. Cuando se recorre este objeto (por ejemplo, a través de una
bucle &foreach;), PHP llamará a los métodos de iteración del objeto cada
vez que necesite un valor, luego guardará el estado del generador
cuando genere un valor, para que pueda ser reanudado cuando
se requiera el siguiente valor.
</para>
<para>
Cuando no hay más valores que se puedan proporcionar, la función generadora
puede simplemente terminar, y el código desde el que se la llama continuará como si un array se hubiera quedado
sin valores.
Cuando no haya más valores para proporcionar, la función generadora puede simplemente
devolver, y el código de llamada continuará como si un array no tuviera más valores.
</para>
<note>
<para>
Un generador no puede retornar un valor: hacerlo resultaría en un error de
compilación. Un <command>return</command> vacío es válido en cuanto a sintaxis dentro
de un generador y terminará el generador.
Un generador puede devolver valores,
que pueden ser recuperados utilizando <methodname>Generator::getReturn</methodname>.
</para>
</note>
<sect2 xml:id="control-structures.yield">
<title><command>yield</command> keyword</title>
<title>La palabra clave <command>yield</command></title>
<para>
La clave de una función generadora es la palabra reservada <command>yield</command>.
En su forma más simple, la sentencia yield es parecida a la sentencia
return, excepto en que en vez de detener la ejecución de la función y
devolver un valor, yield facilita el valor al bucle que itera sobre el
generador y pausa la ejecución de la función generadora.
La palabra clave <command>yield</command> es el núcleo de una función generadora.
En su forma más simple, una instrucción yield se asemeja a una instrucción
return, excepto que en lugar de detener la ejecución de la función
y devolver, yield proporciona un valor al código que recorre el generador,
y pausa la ejecución de la función generadora.
</para>
<example>
<title>Ejemplo sencillo de facilitar valores con yield</title>
<title>Un ejemplo sencillo de producción de valores</title>
<programlisting role="php">
<![CDATA[
<?php
function gen_one_to_three() {
for ($i = 1; $i <= 3; $i++) {
// Observe que $i es preservado entre yields
// Note que $i se preserva entre cada producción de valor.
yield $i;
}
}
@@ -179,79 +178,43 @@ foreach ($generator as $value) {
]]>
</screen>
</example>
<note>
<para>
Internamente, las claves enteras secuenciales serán asociadas con los valores
sobre los que se usa yield, como un array no asociativo.
Internamente, se asociarán claves enteras secuenciales
con los valores producidos, de la misma manera que para un
array no asociativo.
</para>
</note>
<caution>
<para>
Si se utiliza yield en el contexto de una expresión (por ejemplo, en el lado derecho
de una asignación), se debe poner la sentencia yield entre
paréntesis en PHP 5. Por ejemplo, esto es válido:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
$data = (yield $value);
]]>
</programlisting>
</informalexample>
<para>
Pero esto no lo es, y resultará en un error de análisis en PHP 5:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
$data = yield $value;
]]>
</programlisting>
</informalexample>
<para>
Las restricciones parentéticas no se aplican en PHP 7.
</para>
<para>
Esta sintaxis podría usarse junto con el método
<methodname>Generator::send</methodname>.
</para>
</caution>
<sect3 xml:id="control-structures.yield.associative">
<title>Utilizar yield para facilitar valores con claves</title>
<title>Provisión de valores con claves</title>
<para>
PHP soporta arrays asociativos, y los generadores no son menos. Además
de facilitar valores simples, como se muestra arriba, también se puede facilitar
una clave al mismo tiempo.
PHP también soporta arrays asociativos, y los generadores
no son diferentes. Además de proporcionar valores simples, como hemos visto anteriormente, también se pueden
proporcionar claves simultáneamente.
</para>
<para>
La sintaxis para facilitar un par clave-valor es muy similar a la utilizada para
definir un array asociativo, como se muestra a continuación.
La sintaxis para producir un par clave/valor es similar a la utilizada
para definir un array asociativo; así:
</para>
<example>
<title>Facilitar un par clave-valor</title>
<title>Producción de un par clave/valor</title>
<programlisting role="php">
<![CDATA[
<?php
/*
* La entrada son campos separados por punto y coma, con el primer
* campo siendo la ID utilizada como clave.
* La entrada está compuesta de campos separados por un punto y coma,
* y el primer campo es un ID para usar como clave.
*/
$input = <<<'EOF'
1;PHP;Likes dollar signs
2;Python;Likes whitespace
3;Ruby;Likes blocks
1;PHP;Le gustan los signos de dólar
2;Python;Le gustan los espacios en blanco
3;Ruby;Le gustan los bloques
EOF;
function input_parser($input) {
@@ -276,44 +239,28 @@ foreach (input_parser($input) as $id => $fields) {
<![CDATA[
1:
PHP
Likes dollar signs
Le gustan los signos de dólar
2:
Python
Likes whitespace
Le gustan los espacios en blanco
3:
Ruby
Likes blocks
Le gustan los bloques
]]>
</screen>
</example>
<caution>
<para>
Como en el ejemplo anterior, facilitar un par clave-valor
en contexto de expresión requiere que la sentencia yield sea
puesta entre paréntesis:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
$data = (yield $key => $value);
]]>
</programlisting>
</informalexample>
</caution>
</sect3>
<sect3 xml:id="control-structures.yield.null">
<title>Facilitar valores nulos</title>
<title>Producción de valores nulos</title>
<para>
Yield puede ser invocado sin argumentos para facilitar un valor &null; con una
clave automática.
Yield puede ser llamado sin argumento para proporcionar un valor nulo
con una clave automática.
</para>
<example>
<title>Yielding &null;s</title>
<title>Producción de valores nulos</title>
<programlisting role="php">
<![CDATA[
<?php
@@ -342,19 +289,20 @@ array(3) {
</screen>
</example>
</sect3>
<sect3 xml:id="control-structures.yield.references">
<title>Facilitar por referencia</title>
<title>Producción de valores por referencia</title>
<para>
Las funciones generadoras son capaces de facilitar valores por referencia igual que lo hacen por
valor. Esto se hace de la misma forma que
<link linkend="functions.returning-values">devolviendo referencias desde funciones</link>:
poniendo un ampersand (signo &amp;) delante del nombre de la función.
Las funciones generadoras pueden producir valores por referencia.
Esto se hace de la misma manera que el
<link linkend="functions.returning-values">retorno por referencia
desde funciones</link> : añadiendo un ET comercial (&amp;) al nombre
de la función.
</para>
<example>
<title>Facilitar valores por referencia</title>
<title>Producción de valores por referencia</title>
<programlisting role="php">
<![CDATA[
<?php
@@ -366,10 +314,10 @@ function &gen_reference() {
}
}
/*
* Observe que es posible cambiar $number desde dentro del bucle, y
* dado que el generador está facilitando referencias, $value
* dentro de gen_reference() cambia.
/*
* Note que es posible cambiar $number en el bucle,
* y, dado que el generador proporciona referencias, $value
* en gen_reference() también cambia.
*/
foreach (gen_reference() as &$number) {
echo (--$number).'... ';
@@ -380,65 +328,65 @@ foreach (gen_reference() as &$number) {
&example.outputs;
<screen>
<![CDATA[
2... 1... 0...
2... 1... 0...
]]>
</screen>
</example>
</sect3>
<sect3 xml:id="control-structures.yield.from">
<title>Delegación de generadores mediante <command>yield from</command></title>
<title>Delegación del generador vía <command>yield from</command></title>
<para>
En PHP 7, la delegación de generadores permite producir valores desde otro
generador, objeto <classname>Traversable</classname>, o
<type>array</type> mediante la palabra reservada <command>yield from</command>.
El generador externo producirá entonces todos los valores desde el generador interno,
object, o array hasta que este ya no sea válido, después de lo cual la ejecuión
continuará en el generador externo.
La delegación del generador permite obtener los valores de otro generador, de un objeto <classname>Traversable</classname>, o
de un <type>array</type> utilizando la palabra clave <command>yield from</command>. El generador externo obtendrá así todos los valores del generador
interno, del objeto, o del array mientras no sea inválido, después de lo cual, la ejecución continuará en el generador externo.
</para>
<para>
Si un generador se emplea con <command>yield from</command>, la
expresión <command>yield from</command> también devolverá cualquier valor
Si un generador se utiliza con la expresión <command>yield from</command>,
la expresión <command>yield from</command> también devolverá cualquier valor
devuelto por el generador interno.
</para>
<caution>
<title>Almacenamiento en un array (p.ej. con <function>iterator_to_array</function>)</title>
<para>
<command>yield from</command> no reinicia las claves. Preserva
las claves devueltas por el objeto <classname>Traversable</classname> o
<type>array</type>. Por tanto, algunos valores podrían compartir una clave en común con otro
<command>yield</command> o <command>yield from</command>, los cuales, en el momento
de la inserción en el array, sobrescribirán los valores antiguos con esa clave.
</para>
<para>
Un caso común donde esto importa es cuando <function>iterator_to_array</function>
devuelve un array con claves por defecto, conduciendo a posibles resultados inesperados.
<function>iterator_to_array</function> tiene un segundo parámetro,
<parameter>use_keys</parameter>, que puede ser establecido a &false; para recoger
todos los valores mientras ignora las claves devueltas por el <classname>Generator</classname>.
</para>
<example>
<title><command>yield from</command> con <function>iterator_to_array</function></title>
<programlisting role="php">
<title>Almacenamiento en un array (e.g. con <function>iterator_to_array</function>)</title>
<para>
<command>yield from</command> no reinicia las
claves. Preserva las claves devueltas por el objeto
<classname>Traversable</classname>, o <type>array</type>.
Por lo tanto, algunos valores pueden compartir una clave común con otros <command>yield</command> o
<command>yield from</command>, que, al insertarse
en un array, sobrescribirá los valores anteriores con esa clave.
</para>
<para>
Un caso frecuente en el que esto es importante es <function>iterator_to_array</function>
devolviendo un array con clave por defecto, lo que puede llevar a
resultados potencialmente inesperados.
<function>iterator_to_array</function> tiene un segundo parámetro
<parameter>preserve_keys</parameter> que puede ser definido en &false;
para recolectar todos los valores ignorando las claves
devueltas por el <classname>Generator</classname>.
</para>
<example>
<title><command>yield from</command> con <function>iterator_to_array</function></title>
<programlisting role="php">
<![CDATA[
<?php
function from() {
function inner() {
yield 1; // clave 0
yield 2; // clave 1
yield 3; // clave 2
}
function gen() {
yield 0; // clave 0
yield from from(); // claves 0-2
yield from inner(); // claves 0-2
yield 4; // clave 1
}
// pasar false como segundo parámetro para obtener un array [0, 1, 2, 3, 4]
// establece en false el segundo parámetro para obtener un array [0, 1, 2, 3, 4]
var_dump(iterator_to_array(gen()));
?>
]]>
@@ -456,34 +404,34 @@ array(3) {
}
]]>
</screen>
</example>
</example>
</caution>
<example>
<title>Uso básico de <command>yield from</command></title>
<programlisting role="php">
<![CDATA[
<?php
function contar_hasta_diez() {
function count_to_ten() {
yield 1;
yield 2;
yield from [3, 4];
yield from new ArrayIterator([5, 6]);
yield from siete_ocho();
yield from seven_eight();
yield 9;
yield 10;
}
function siete_ocho() {
function seven_eight() {
yield 7;
yield from ocho();
yield from eight();
}
function ocho() {
function eight() {
yield 8;
}
foreach (contar_hasta_diez() as $num) {
foreach (count_to_ten() as $num) {
echo "$num ";
}
?>
@@ -492,40 +440,40 @@ foreach (contar_hasta_diez() as $num) {
&example.outputs;
<screen>
<![CDATA[
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
]]>
</screen>
</example>
<example>
<title><command>yield from</command> y valores devueltos</title>
<title><command>yield from</command> y los valores devueltos</title>
<programlisting role="php">
<![CDATA[
<?php
function contar_hasta_diez() {
function count_to_ten() {
yield 1;
yield 2;
yield from [3, 4];
yield from new ArrayIterator([5, 6]);
yield from siete_ocho();
return yield from nueve_diez();
yield from seven_eight();
return yield from nine_ten();
}
function siete_ocho() {
function seven_eight() {
yield 7;
yield from ocho();
yield from eight();
}
function ocho() {
function eight() {
yield 8;
}
function nueve_diez() {
function nine_ten() {
yield 9;
return 10;
}
$gen = contar_hasta_diez();
$gen = count_to_ten();
foreach ($gen as $num) {
echo "$num ";
}
@@ -541,19 +489,19 @@ echo $gen->getReturn();
</screen>
</example>
</sect3>
</sect2>
</sect2>
</sect1>
<sect1 xml:id="language.generators.comparison">
<title>Comparación entre generadores y objetos <classname>Iterator</classname></title>
<title>Comparación de los generadores con los objetos <classname>Iterator</classname></title>
<para>
La principal ventaja de los generadores es su simplicadad. Se ha de escribir
mucho menos código repetitivo en comparación con el necesario para implementar una
clase <classname>Iterator</classname>, y el código es generalmente mucho más
legible. Por ejemplo, la siguiente función y clase son equivalentes:
La principal ventaja de los generadores es su simplicidad. Menos código
debe ser escrito que cuando se trata de implementar una clase
<classname>Iterator</classname>, y generalmente es más legible.
Por ejemplo, la función y la clase siguientes son equivalentes:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
@@ -562,53 +510,53 @@ function getLinesFromFile($fileName) {
if (!$fileHandle = fopen($fileName, 'r')) {
return;
}
while (false !== $line = fgets($fileHandle)) {
yield $line;
}
fclose($fileHandle);
}
// Contra...
// versus...
class LineIterator implements Iterator {
protected $fileHandle;
protected $line;
protected $i;
public function __construct($fileName) {
if (!$this->fileHandle = fopen($fileName, 'r')) {
throw new RuntimeException('Couldn\'t open file "' . $fileName . '"');
throw new RuntimeException('Imposible abrir el fichero: "' . $fileName . '"');
}
}
public function rewind() {
fseek($this->fileHandle, 0);
$this->line = fgets($this->fileHandle);
$this->i = 0;
}
public function valid() {
return false !== $this->line;
}
public function current() {
return $this->line;
}
public function key() {
return $this->i;
}
public function next() {
if (false !== $this->line) {
$this->line = fgets($this->fileHandle);
$this->i++;
}
}
public function __destruct() {
fclose($this->fileHandle);
}
@@ -617,13 +565,24 @@ class LineIterator implements Iterator {
]]>
</programlisting>
</informalexample>
<para>
La flexibilidad, sin embargo, tiene un coste: los generadores son iteradores
unidireccionales, ya que no pueden ser rebobinados una vez la iteración ha empezado. Esto también
significa que se puede iterar sobre el mismo generador varias veces: el
generador necesitará ser reconstruido llamando a la función generadora de nuevo.
Sin embargo, esta flexibilidad tiene un costo: los generadores son iteradores
que solo avanzan, y no pueden ser reinicializados una vez
que su recorrido haya comenzado. Esto también significa que el mismo generador no puede
ser utilizado varias veces: el generador deberá ser reconstruido
llamando nuevamente a la función generadora.
</para>
<simplesect role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="language.oop5.iterations">Iteración de Objeto</link></member>
</simplelist>
</para>
</simplesect>
</sect1>
</chapter>

File diff suppressed because it is too large Load Diff

View File

@@ -1,35 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 52407313885d27a4e891e08dd2e2481bcc39e244 Maintainer: Marqitos Status: ready -->
<!-- Reviewed: no Maintainer: andresdzphp -->
<chapter xml:id="language.operators" xmlns="http://docbook.org/ns/docbook">
<title>Operadores</title>
<!-- EN-Revision: 16934048f79c6e117cd16a23c09c1b2ea502e284 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="language.operators" xmlns="http://docbook.org/ns/docbook" annotations="interactive">
<title>Los operadores</title>
<simpara>
Un operador es algo que toma uno más valores (o
expresiones, en la jerga de programación) y produce otro valor (de modo que la
construcción en si misma se convierte en una expresión).
Un operador es algo que toma uno o más valores
(o expresiones, en la jerga de la programación) y que produce otro valor (por lo tanto, la construcción misma se convierte en una expresión).
</simpara>
<para>
Los operadores se pueden agrupar de acuerdo con el número de valores que toman. Los operadores
unarios toman sólo un valor, por ejemplo <literal>!</literal> (el
<link linkend="language.operators.logical">operador lógico de negación</link>) o
<literal>++</literal> (el
<link linkend="language.operators.increment">Operadores de incremento/disminución</link>).
Los operadores binarios toman dos valores, como los familiares
<link linkend="language.operators.arithmetic">Operadores aritméticos</link>
<literal>+</literal> (suma) y <literal>-</literal> (resta), y la
mayoría de los operadores de PHP entran en esta categoría. Finalmente, hay sólo
un <link linkend="language.operators.comparison.ternary">operador
ternario</link>, <literal>? :</literal>, el cual toma tres valores; usualmente a este se
le refiere simplemente como "el operador ternario" (aunque podría
tal vez llamarse más correctamente como el operador condicional).
Los operadores pueden ser agrupados según el número de valores que aceptan. El operador unario opera solo sobre un valor, por ejemplo <literal>!</literal>
(el <link linkend="language.operators.logical">operador de negación</link>)
o <literal>++</literal>
(el <link linkend="language.operators.increment">operador de incremento</link>).
El segundo tipo, los operadores binarios (como el muy conocido
<link linkend="language.operators.arithmetic">operador matemático</link>
<literal>+</literal> o <literal>-</literal>) contiene la mayoría de los operadores
soportados por PHP. Finalmente,
el <link linkend="language.operators.comparison.ternary">operador ternario</link>,
<literal>? :</literal>, que acepta tres valores (también se le puede llamar el operador
condicional).
</para>
<para>
Una lista completa de operadores de PHP sigue en la sección
<link linkend="language.operators.precedence">Precedencia de Operadores</link>.
La sección también explica la precedencia y asociatividad de los operadores, las cuales gobiernan
exactamente cómo son evaluadas expresiones que contienen varios diferentes
operadores.
Una lista completa de los operadores se encuentra en la sección
<link linkend="language.operators.precedence">precedencia de los operadores</link>.
Esta sección también explica la precedencia de los operadores y la asociatividad, es decir,
las prioridades de ejecución de los operadores.
</para>
&language.operators.precedence;
@@ -62,7 +57,4 @@ sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -1,179 +1,199 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: f4f96ef8b2a95283c92ea2183fe1dedf06f3ad22 Maintainer: Marqitos Status: ready -->
<!-- Reviewed: no Maintainer: yago -->
<chapter xml:id="language.references" xmlns="http://docbook.org/ns/docbook">
<title>Explicación de las Referencias</title>
<!-- EN-Revision: 9463e5b660c4883b91a30f07ff68731bbcc48346 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<!-- CREDITS: DAnnebicque -->
<sect1 xml:id="language.references.whatare">
<title>¿Qué son las Referencias?</title>
<simpara>
Las Referencias en PHP son medios de acceder al mismo contenido de una variable
mediante diferentes nombres. No son como los punteros de C; por ejemplo,
no se puede realizar aritmética de punteros con ellas, realmente
no son direcciones de memoria, etc. Véase
<xref linkend="language.references.arent" /> para más
información. Las referencias son alias de la tabla de símbolos. Observe que en
PHP el nombre de la variable y el contenido de la variable son cosas diferentes, por lo que el mismo
contenido puede tener diferentes nombres. La analogía más próxima es con
los archivos y los nombres de archivos de Unix - los nombres de variables son entradas de directorio,
mientras que el contenido de las variables es el archivo en sí. Las referencias se pueden
vincular a enlaces duros en sistemas de archivos Unix.
</simpara>
</sect1>
<chapter xml:id="language.references" xmlns="http://docbook.org/ns/docbook">
<title>Las referencias</title>
<sect1 xml:id="language.references.whatare">
<title>¿Qué es una referencia?</title>
<simpara>
En PHP, las referencias son una forma de acceder al contenido de una misma
variable utilizando varios nombres. Las referencias no son como los
punteros en C: no se pueden realizar operaciones aritméticas de punteros
sobre ellas, no son direcciones de memoria, etc.
Se puede consultar
<xref linkend="language.references.arent" /> para más información.
De hecho, las referencias son alias en la
<link linkend="features.gc.refcounting-basics">tabla de símbolos</link>.
Tenga en cuenta que en PHP, el nombre de una variable y su contenido son dos
nociones distintas, lo que hace que se puedan dar
varios nombres al mismo contenido.
Se puede hacer la analogía con los ficheros bajo Unix, y sus nombres:
los nombres de las variables son las entradas en un directorio, mientras
que el contenido de la variable es el fichero en sí mismo.
Las referencias en PHP pueden entonces ser consideradas similares
a los enlaces bajo Unix.
</simpara>
</sect1>
<sect1 xml:id="language.references.whatdo">
<title>¿Qué hacen las referencias?</title>
<sect1 xml:id="language.references.whatdo">
<title>¿Qué hacen las referencias?</title>
<para>
Existen tres principales usos de las referencias:
la <link linkend="language.references.whatdo.assign">asignación por
referencia</link>, el <link linkend="language.references.whatdo.pass">paso
por referencia</link>
y el <link linkend="language.references.whatdo.return">retorno por
referencia</link>. Esta sección introducirá estas operaciones, con enlaces
a más detalles.
</para>
<sect2 xml:id="language.references.whatdo.assign">
<title>Asignación por referencia</title>
<para>
Hay tres operaciones básicas que se realizan usando referencias:
<link linkend="language.references.whatdo.assign">asignar por
referencia</link>, <link linkend="language.references.whatdo.pass">pasar por
referencia</link>,
y <link linkend="language.references.whatdo.return">devolver por
referencia</link>. En esta sección se dará una introducción a estas
operaciones, con enlaces para una lectura complementaria.
En este primer caso, las referencias PHP permiten que dos variables referencien el mismo contenido.
Por ejemplo:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$a =& $b;
?>
]]>
</programlisting>
</informalexample>
Esta escritura indica que <varname>$a</varname> y <varname>$b</varname>
apuntan al mismo contenido.
<note>
<para>
<varname>$a</varname> y <varname>$b</varname> son completamente
iguales aquí: no es <varname>$a</varname> quien apunta a
<varname>$b</varname>, o viceversa. Son <varname>$a</varname>
y <varname>$b</varname> quienes apuntan al mismo contenido.
</para>
</note>
</para>
<sect2 xml:id="language.references.whatdo.assign">
<title>Asignar por Referencia</title>
<note>
<para>
En la primera de estas operaciones, las referencias de PHP permiten hacer que dos
variables hagan referencia al mismo contenido. Es decir, cuando se hace:
<informalexample>
Si se asigna, pasa o devuelve una variable indefinida por referencia,
se creará automáticamente.
<example>
<title>Uso de referencias con variables indefinidas</title>
<programlisting role="php">
<![CDATA[
<?php
$a =& $b;
?>
]]>
</programlisting>
</informalexample>
significa que <varname>$a</varname> y <varname>$b</varname>
apuntan al mismo contenido.
<note>
<para>
<varname>$a</varname> y <varname>$b</varname> aquí son completamente
iguales. <varname>$a</varname> no está apuntando a
<varname>$b</varname> o viceversa.
<varname>$a</varname> y <varname>$b</varname> están apuntando al
mismo lugar.
</para>
</note>
</para>
<note>
<para>
Si se asigna, pasa, o devuelve una variable no definida por referencia,
la variable se creará.
<example>
<title>Usar referencias con variables no definidas</title>
<programlisting role="php">
<![CDATA[
<?php
function foo(&$var) { }
foo($a); // $a es "creada" y asignada a null
function foo(&$var) {}
foo($a); // $a es "creada" y asignada a NULL
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
$c = new stdClass();
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
]]>
</programlisting>
</example>
</para>
</note>
<para>
Se puede usar la misma sintaxis con funciones que devuelven
referencias:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo =& find_var($bar);
?>
]]>
</programlisting>
</informalexample>
Usar la misma sintaxis con una función que <emphasis>no</emphasis>
devuelve por referencia generará un error, al igual que usarla con el resultado
del operador <link linkend="language.oop5.basic.new">new</link>.
Aunque los objetos se manejan como punteros, estos no son lo mismo que las referencias,
como se explica en <link linkend="language.oop5.references">Objetos y referencias</link>.
</example>
</para>
<warning>
<para>
Si se asigna una referencia a una varible declarada <literal>global</literal>
dentro de una función, la referencia será visible sólo dentro de la función.
Se puede evitar esto usando la matriz <varname>$GLOBALS</varname>.
<example>
<title>Refenciar variables globales dentro de funciones</title>
<programlisting role="php">
</note>
<para>
La misma sintaxis puede ser utilizada con las funciones que
devuelven referencias:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$var1 = "Variable de ejemplo";
$foo =& find_var($bar);
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Utilizar la misma sintaxis con una función que <emphasis>no</emphasis>
devuelve por referencia generará un error, al igual que utilizarla con el
resultado del operador <link linkend="language.oop5.basic.new">new</link>.
Aunque los objetos se pasan como punteros, esto no es idéntico a las referencias como se explica en la sección los
<link linkend="language.oop5.references">Objetos y referencias</link>.
</para>
<warning>
<para>
Si se asigna una referencia a una variable declarada como <literal>global</literal>
en una función, la referencia solo será visible dentro de la función.
Se puede evitar esto utilizando el array <varname>$GLOBALS</varname>.
<example>
<title>Referenciar variables globales desde funciones</title>
<programlisting role="php">
<![CDATA[
<?php
$var1 = "Variable Ejemplo";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible sólo dentro de la función
$var2 =& $var1; // visible solo en la función
} else {
$GLOBALS["var2"] =& $var1; // visible también en el contexto global
}
}
global_references(false);
echo "var2 está establecida a '$var2'\n"; // var2 está establecida a ''
echo "var2 está definido como '$var2'\n"; // var2 está definido como ''
global_references(true);
echo "var2 está establecida a '$var2'\n"; // var2 está establecida a 'Variable de ejemplo'
echo "var2 está definido como '$var2'\n"; // var2 está definido como 'Variable Ejemplo'
?>
]]>
</programlisting>
</example>
Piense en <literal>global $var;</literal> como simplificación de <literal>$var
=&amp; $GLOBALS['var'];</literal>. De este modo, al asignar otra referencia
a <literal>$var</literal> sólo cambia la referencia de la variable local.
</para>
</warning>
<note>
<para>
Si se asigna un valor a una variable con referencias en una
sentencia &foreach;, también se modifican las referencias.
<example>
<title>Referencias y la sentencia foreach</title>
<programlisting role="php">
</programlisting>
</example>
Vea <literal>global $var;</literal> como un atajo para <literal>$var
=&amp; $GLOBALS['var'];</literal>. Por lo tanto, asignar otra referencia a
<literal>$var</literal> solo modifica la referencia local de la variable.
</para>
</warning>
<note>
<para>
Si se asigna un valor a una variable que tiene referencias en una estructura
&foreach;, las referencias también serán modificadas.
<example>
<title>Referencias y estructura foreach</title>
<programlisting role="php">
<![CDATA[
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// hacer algo
}
echo $ref; // 3 - último elemento del array iterado
echo $ref; // 3 - el último elemento del array iterado
?>
]]>
</programlisting>
</example>
</para>
</note>
<para>
Mientras que no sea estrictamente una asignación por referencia, las expresiones creadas
con el constructor de lenguaje
<link linkend="function.array"><literal>array()</literal></link> también pueden
comportarse como tales prefijando <literal>&amp;</literal> al elemento del array
a añadir. Ejemplo:
<informalexample>
<programlisting role="php">
</programlisting>
</example>
</para>
</note>
<para>
Aunque no es estrictamente una asignación por referencia, las expresiones
creadas con la estructura de lenguaje
<link linkend="function.array"><literal>array()</literal></link> pueden también
comportarse como tales, prefijando con <literal>&amp;</literal> el elemento del array.
Aquí hay un ejemplo:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$a = 1;
$b = array(2, 3);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++;
$arr[1]++;
@@ -182,17 +202,17 @@ $arr[2]++;
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Observe, sin embargo, que las referencias dentro de arrays son potencialmente peligrosas.
Realizar una asignación normal (no por referencia) con una referencia en el
lado derecho no convierte el lado izquierdo en una referencia, pero las referencias
dentro de arrays son conservadas en estas asignaciones normales. Esto también se aplica
a las llamadas a funciones donde el array es pasado por valor. Ejemplo:
<informalexample>
<programlisting role="php">
</programlisting>
</informalexample>
</para>
<para>
Note que las referencias dentro de los arrays pueden resultar
peligrosas. Utilizar una asignación normal (no por referencia) con una
referencia a la derecha del operador no transforma la parte izquierda de la asignación
en referencia, pero las referencias dentro de los arrays son preservadas. Esto
se aplica también a las llamadas de funciones con un array pasado por valor. Ejemplo:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
@@ -200,144 +220,148 @@ $arr[2]++;
$a = 1;
$b =& $a;
$c = $b;
$c = 7; // $c no es una referencia; no cambia $a o $b
$c = 7; // $c no es una referencia; no hay cambio en $a o $b
/* Asignación de variables de array */
/* Asignación de variables de tipo array */
$arr = array(1);
$a =& $arr[0]; // $a y $arr[0] son el mismo conjunto de referencias
$arr2 = $arr; // ¡no es una asignación por referencia!
$a =& $arr[0]; // $a y $arr[0] son referencias al mismo valor
$arr2 = $arr; // NO es una asignación por referencia!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* ¡El contenido de $arr se cambia incluso si no es una referencia! */
/* ¡Los contenidos de $arr son cambiados aunque no fuera una referencia! */
?>
]]>
</programlisting>
</informalexample>
En otras palabras, el comportamiento de las referencias de arrays está definido en una
base elemento-por-elemento; el comportamiento de las referencias de elementos individuales
está desasociado del estado de la referencia del array contenedor.
</para>
</sect2>
<sect2 xml:id="language.references.whatdo.pass">
<title>Pasar por Referencia</title>
<para>
Lo segundo que hacen las referencias es pasar variables por
referencia. Esto se lleva a cabo haciendo que una variable local en una función
y una variable en el ámbito de la llamada referencien al mismo
contenido. Ejemplo:
<informalexample>
<programlisting role="php">
</programlisting>
</informalexample>
En otras palabras, desde el punto de vista de las referencias, el comportamiento de los arrays
está definido elemento por elemento; el comportamiento
de cada elemento
es independiente del estado de referencia del array que los contiene.
</para>
</sect2>
<sect2 xml:id="language.references.whatdo.pass">
<title>Paso por referencia</title>
<para>
El segundo interés de las referencias es
permitir pasar variables por referencia. Esto se realiza haciendo
referenciar el mismo contenido por una variable local a una función y por una
variable del contexto llamante.
Por ejemplo:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function foo(&$var)
{
$var++;
}
function foo(&$var) {
$var++;
}
$a=5;
foo($a);
?>
]]>
</programlisting>
</informalexample>
hará que <varname>$a</varname> sea 6. Esto sucede porque en
la función <varname>foo</varname> la variable
<varname>$var</varname> hace referencia al mismo contenido que
<varname>$a</varname>. Para más información sobre esto, lea
la sección <link linkend="language.references.pass">pasar por
</programlisting>
</informalexample>
Después de la ejecución de esta porción de código, <varname>$a</varname> vale 6.
Esto se debe a que, en la función <varname>foo</varname>, la
variable <varname>$var</varname> apunta al mismo contenido que
<varname>$a</varname>.
Para más información sobre este tema, se puede consultar la sección
<link linkend="language.references.pass">paso por referencia</link>.
</para>
</sect2>
<sect2 xml:id="language.references.whatdo.return">
<title>Retorno por referencia</title>
<para>
El tercer interés de las referencias es permitir el
<link linkend="language.references.return">retorno de valores por
referencia</link>.
</para>
</sect2>
<sect2 xml:id="language.references.whatdo.return">
<title>Devolver por Referencia</title>
<para>
Lo tercero que hacen las referncias es <link
linkend="language.references.return">devolver por referencia</link>.
</para>
</sect2>
</sect1>
</para>
</sect2>
</sect1>
<sect1 xml:id="language.references.arent">
<title>Qué NO son las Referencias</title>
<para>
Como se dijo antes, las referencias no son punteros. Es decir, la
siguiente construcción no hará lo que se esperaba:
<informalexample>
<programlisting role="php">
<sect1 xml:id="language.references.arent">
<title>Lo que las referencias no son</title>
<para>
Como se ha visto anteriormente, las referencias no
son punteros. Esto significa que el script siguiente no hará
lo que se espera:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function foo(&$var)
{
$var =& $GLOBALS["baz"];
function foo(&$var) {
$var =& $GLOBALS["baz"];
}
foo($bar);
?>
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Lo que sucede es que <varname>$var</varname> en
<varname>foo</varname> será ligada con
<varname>$bar</varname> en la llamada, pero entonces
será religada con <varname>$GLOBALS["baz"]</varname>. No hay forma
de ligar <varname>$bar</varname> en el ámbito de la llamada a otra cosa
usando el mecanismo de referencia, ya que <varname>$bar</varname> no está
disponible en la función <varname>foo</varname> (está representada por
<varname>$var</varname>, pero <varname>$var</varname> sólo tiene
el contenido de la variable y no la vinculación nombre-a-valor en la
<link linkend="features.gc.refcounting-basics">tabla de símbolos</link> de llamada).
Se puede usar <link linkend="language.references.return">devolver
referencias</link> para referencias variables seleccionadas por la función.
</simpara>
</sect1>
</programlisting>
</informalexample>
</para>
<simpara>
Aquí, la variable <varname>$var</varname> en la función <varname>foo</varname> estará ligada
a <varname>$bar</varname> en el llamante, pero luego estará ligada a
<varname>$GLOBALS["baz"]</varname>.
No es posible ligar <varname>$bar</varname> a otra cosa utilizando
el mecanismo de referencias, ya que <varname>$bar</varname> no es accesible en la
función <varname>foo</varname> (aunque está representada por <varname>$var</varname>,
<varname>$var</varname> solo hace referencia al valor, y no tiene una ligadura en la
<link linkend="features.gc.refcounting-basics">tabla de símbolos</link> del llamante).
Se puede utilizar el <link linkend="language.references.return">retorno por
referencia</link> para referenciar variables seleccionadas por la función.
</simpara>
</sect1>
<sect1 xml:id="language.references.pass">
<title>Pasar por Referencia</title>
<para>
Se puede pasar una variable por referencia a una función y así hacer que la función
pueda modificar la variable. La sintaxis es la siguiente:
<informalexample>
<programlisting role="php">
<sect1 xml:id="language.references.pass">
<title>Paso por referencia</title>
<para>
Se puede pasar una variable por referencia a una función, de
manera que esta pueda modificarla.
La sintaxis es la siguiente:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function foo(&$var)
{
$var++;
function foo(&$var) {
$var++;
}
$a=5;
foo($a);
// $a es 6 aquí
foo ($a);
// $a vale 6 ahora
?>
]]>
</programlisting>
</informalexample>
<note>
</programlisting>
</informalexample>
<note>
<simpara>
No hay signo de referencia en la llamada de la
función, solo en su definición. La definición de la
función en sí misma es suficiente para pasar correctamente
argumentos por referencia.
</simpara>
</note>
</para>
<para>
Los siguientes datos pueden ser pasados por referencia:
<itemizedlist>
<listitem>
<simpara>
No existe ningún signo de referencia en una llamada a una función - sólo en
la definición de la función. Las definiciones de funciones por sí solas son suficientes para
pasar correctamente el argumento por referencia.
Una variable, como en <literal>foo($a)</literal>
</simpara>
</note>
</para>
<para>
Se puede pasar por referencia lo siguiente:
<itemizedlist>
<listitem>
<simpara>
Variables, esto es, <literal>foo($a)</literal>
</simpara>
</listitem>
<listitem>
<para>
Referencias devueltas desde funciones, es decir:
<informalexample>
<programlisting role="php">
</listitem>
<listitem>
<para>
Una referencia devuelta por una función:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
@@ -348,28 +372,29 @@ function foo(&$var)
function &bar()
{
$a = 5;
return $a;
$a = 5;
return $a;
}
foo(bar());
?>
]]>
</programlisting>
</informalexample>
Vea más sobre <link
linkend="language.references.return">devolver por referencia</link>.
</para>
</listitem>
</itemizedlist>
</para>
<para>
Ninguna otra expresión debería pasarse por referencia, ya que el
resultado no está definido. Por ejemplo, los siguientes ejemplos de pasar
por referencia no son válidos:
<informalexample>
<programlisting role="php">
</programlisting>
</informalexample>
Para más información, ver los detalles en
<link linkend="language.references.return">retorno por
referencia</link>.
</para>
</listitem>
</itemizedlist>
</para>
<para>
Todas las otras expresiones no deben ser pasadas por
referencia, ya que el resultado será indefinido. Por ejemplo,
los siguientes pasos por referencia son inválidos:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
@@ -378,45 +403,47 @@ function foo(&$var)
$var++;
}
function bar() // Observe que falta el &
function bar() // Note la ausencia de &
{
$a = 5;
return $a;
$a = 5;
return $a;
}
foo(bar()); // Produce una notificación
foo(bar()); // Produce una notificación
foo($a = 5); // Expresión, no una variable
foo(5); // Produce un error fatal
foo($a = 5); // Expresión, no una variable
foo(5); // Produce un error fatal
class Foobar
{
}
class Foobar{}
foo(new Foobar()) // Produce una notificación a partir de PHP 7.0.7
// Observación: Solo las variables deben pasarse por referencia
foo(new Foobar()) // Produce una notificación desde PHP 7.0.7
// Notificación: Solo las variables deben ser pasadas por referencia.
?>
]]>
</programlisting>
</informalexample>
</para>
</sect1>
</programlisting>
</informalexample>
<sect1 xml:id="language.references.return">
<title>Devolver Referencias</title>
<para>
Devolver por referencia es útil cuando se quiere usar una función
para encontrar a qué variable debería estar vinculada una referencia.
<emphasis>No</emphasis> use devolver por referencia para aumentar el rendimiento.
El motor optimizará automáticamente esto por sí mismo. Hay que devolver
referencias sólo cuando se tenga una razón técnicamente válida para hacerlo. Para
devolver referencias use esta sintaxis:
<informalexample>
<programlisting role="php">
</para>
</sect1>
<sect1 xml:id="language.references.return">
<title>Devolver referencias</title>
<para>
Devolver referencias es útil cuando se
quiere utilizar una función para determinar a qué variable
debe estar ligada una referencia.
No utilice <emphasis>no</emphasis>
el retorno por referencia para mejorar el rendimiento,
el motor es suficientemente robusto para optimizar esto
internamente. Devuelva referencias solo
cuando haya buenas razones técnicas
para hacerlo. Para devolver referencias, utilice esta sintaxis:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class foo
class Foo
{
public $value = 42;
@@ -426,60 +453,79 @@ class foo
}
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue es una referencia a $obj->value, que es 42.
$obj = new Foo();
$myValue = &$obj->getValue(); // $myValue es una referencia de $obj->value, que vale 42.
$obj->value = 2;
echo $myValue; // imprime el nuevo valor de $obj->value, esto es, 2.
echo $myValue; // muestra el nuevo valor de $obj->value, es decir, 2.
?>
]]>
</programlisting>
</informalexample>
En este ejemplo, la propiedad del objeto devuelto por la
función <varname>getValue</varname> debería estar establecida, no la
copia, como si estuviera sin usar la sintaxis de referencia.
</para>
<note>
<simpara>
A diferencia de pasar un parámetro, aquí se tiene que usar
<literal>&amp;</literal> en ambos lugares - para indicar que se
quiere devolver por referencia, no una copia, y para indicar que
la vinculación por referencia, en vez de la asignación normal, debería ser hecha
para <varname>$myValue</varname>.
</simpara>
</note>
<note>
<simpara>
Si se intenta devolver una referencia desde una función con la sintaxis:
<literal>return ($this->value);</literal>, <emphasis>no</emphasis>
funcionará ya que se está intentando devolver el resultado de una
<emphasis>expresión</emphasis>, y no de una variable, por referencia. Sólo se
puede devolver variables por referencia desde una función - nada más.
</simpara>
</note>
<para>
Para usar la referencia retornada, se debe usar la asignación por referencia:
<informalexample>
<programlisting role="php">
</programlisting>
</informalexample>
En este ejemplo, se asigna un valor a la propiedad del objeto
devuelta por la función <varname>getValue</varname>, y no a su copia,
como sería el caso si no se hubiera utilizado la sintaxis de referencia.
</para>
<note>
<simpara>
A diferencia del paso de parámetro, aquí, se debe utilizar
<literal>&amp;</literal> en ambos lugares, tanto para
indicar que se devuelve por referencia (no por copia), como
para indicar que también se asigna por referencia (no por copia
tampoco) para la variable <varname>$myValue</varname>.
</simpara>
</note>
<note>
<simpara>
Si se intenta devolver una referencia desde una función
con la sintaxis: <literal>return ($this->value);</literal>,
esto no funcionará <emphasis>no</emphasis> como
se espera, y devolverá el resultado de la <emphasis>expresión</emphasis>,
y no de la variable, por referencia. Solo se pueden devolver
variables por referencia desde una función, y nada más.
</simpara>
</note>
<para>
Para utilizar la referencia devuelta, se debe utilizar la asignación
por referencia:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function &collector()
{
static $collection = array();
return $collection;
static $collection = array();
return $collection;
}
$collection = &collector();
// Ahora, la variable $collection es una variable por referencia que referencia el array static dentro de la función
$collection[] = 'foo';
print_r(collector());
// Array
// (
// [0] => foo
// )
?>
]]>
</programlisting>
</informalexample>
Para pasar la referencia retornada a otra función que espera una referencia
se puede usar la siguiente sintaxis:
<informalexample>
<programlisting role="php">
</programlisting>
</informalexample>
<note>
<simpara>
Si la asignación se realiza sin el símbolo <literal>&amp;</literal>,
por ejemplo <code>$collection = collector();</code>,
la variable <varname>$collection</varname> recibirá una copia del valor,
y no la referencia devuelta por la función.
</simpara>
</note>
Para pasar la referencia devuelta a otra función que espera una referencia,
se puede utilizar la siguiente sintaxis:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
@@ -493,25 +539,25 @@ array_push(collector(), 'foo');
?>
]]>
</programlisting>
</informalexample>
</para>
<note>
<simpara>
Observe que <literal>array_push(&amp;collector(), 'foo');</literal>
<emphasis>no</emphasis> funcionará, resultará en un error fatal.
</simpara>
</note>
</sect1>
</programlisting>
</informalexample>
</para>
<note>
<simpara>
Note que <literal>array_push(&amp;collector(), 'foo');</literal>
<emphasis>no funcionará</emphasis>, y resultará en un error
fatal.
</simpara>
</note>
</sect1>
<sect1 xml:id="language.references.unset">
<title>Destruir Referencias</title>
<para>
Cuando se destruye una referencia, se rompe el vínculo entre
el nombre de la variable y el contenido de la variable. Esto no significa que
el contenido de la variable sea destruida. Por ejemplo:
<informalexample>
<programlisting role="php">
<sect1 xml:id="language.references.unset">
<title>Destruir una referencia</title>
<para>
Cuando se destruye una referencia, solo se rompe el enlace entre el nombre de la variable y su contenido.
Esto no significa que el contenido de la variable sea destruido. Por ejemplo:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
@@ -521,34 +567,35 @@ unset($a);
?>
]]>
</programlisting>
</informalexample>
no destruirá <varname>$b</varname>, sólo <varname>$a</varname>.
</para>
<simpara>
De nuevo, podría ser útil pensar en esto como análogo a una llamada
a <command>unlink</command> de Unix.
</simpara>
</sect1>
</programlisting>
</informalexample>
Este ejemplo no destruirá <varname>$b</varname>, solo
<varname>$a</varname>.
</para>
<simpara>
Una vez más, se puede comparar esta acción con la llamada
<command>unlink</command> de Unix.
</simpara>
</sect1>
<sect1 xml:id="language.references.spot">
<title>Ubicar las Referencias</title>
<simpara>
Muchas construcciones sintácticas de PHP están implementadas mediante el mecanismo
de referencia, por lo que todo lo mencionado aquí sobre la vinculación de referencias también
se aplica a estas construcciones. Algunas construcciones, como pasar y
devolver por referencia, han sido mencionadas antes. Otras construcciones que
usan referencias son:
</simpara>
<sect1 xml:id="language.references.spot">
<title>Identificar una referencia</title>
<simpara>
Muchas sintaxis de PHP están implementadas a través del
mecanismo de referencia, y todo lo que se ha visto en cuanto a las ligaduras entre variables
se aplica a estas sintaxis. Algunas construcciones, como el paso
de argumentos y el retorno por referencia, han sido mencionadas anteriormente.
Otras construcciones que utilizan referencias son las siguientes:
</simpara>
<sect2 xml:id="references.global">
<title>Referencias globales</title>
<para>
Cuando se declara una variable como <command>global $var</command>,
de hecho se está creando una referencia a una variable global. Es decir,
esto es lo mismo que:
<informalexample>
<programlisting role="php">
<sect2 xml:id="references.global">
<title>Referencias globales</title>
<para>
Cuando se declara una variable como <command>global $var</command>,
se crea en realidad una referencia a una variable
global. En otras palabras, esto es lo mismo que:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
@@ -556,25 +603,17 @@ $var =& $GLOBALS["var"];
?>
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Esto también significa que al destruir <varname>$var</varname>
no se destruirá la variable global.
</simpara>
</sect2>
</programlisting>
</informalexample>
</para>
<simpara>
Esto también significa que destruir la variable <varname>$var</varname> no resultará
en la destrucción de la variable global.
</simpara>
</sect2>
</sect1>
<sect2 xml:id="references.this">
<title><literal>$this</literal></title>
<simpara>
En un método de un objeto, <varname>$this</varname> es siempre una referencia
al objeto llamado.
</simpara>
</sect2>
</sect1>
</chapter>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
@@ -592,7 +631,4 @@ sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -1,101 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: f908fff129bcd8ec1605658e06457cb04e5b2b51 Maintainer: seros Status: ready -->
<!-- Reviewed: yes Maintainer: seros -->
<chapter xml:id="language.types" xmlns="http://docbook.org/ns/docbook">
<title>Tipos</title>
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<!-- CREDITS: DAnnebicque -->
<chapter xml:id="language.types" xmlns="http://docbook.org/ns/docbook" annotations="interactive">
<title>Los tipos</title>
<sect1 xml:id="language.types.intro">
<title>Introducción</title>
<para>
En PHP, cada expresión tiene uno de los siguientes tipos integrados según su valor:
<itemizedlist>
<listitem><simpara><type>null</type></simpara></listitem>
<listitem><simpara><type>bool</type></simpara></listitem>
<listitem><simpara><type>int</type></simpara></listitem>
<listitem><simpara><type>float</type> (número de punto flotante)</simpara></listitem>
<listitem><simpara><type>string</type></simpara></listitem>
<listitem><simpara><type>array</type></simpara></listitem>
<listitem><simpara><type>object</type></simpara></listitem>
<listitem><simpara><type>callable</type></simpara></listitem>
<listitem><simpara><type>resource</type></simpara></listitem>
</itemizedlist>
</para>
<para>
Cada expresión en PHP tiene uno de los siguientes
tipos incorporados dependiendo de su valor:
<itemizedlist>
<listitem><simpara><type>null</type></simpara></listitem>
<listitem><simpara><type>bool</type></simpara></listitem>
<listitem><simpara><type>int</type></simpara></listitem>
<listitem><simpara><type>float</type> (número de punto flotante)</simpara></listitem>
<listitem><simpara><type>string</type></simpara></listitem>
<listitem><simpara><type>array</type></simpara></listitem>
<listitem><simpara><type>object</type></simpara></listitem>
<listitem><simpara><type>callable</type></simpara></listitem>
<listitem><simpara><type>resource</type></simpara></listitem>
</itemizedlist>
PHP es un lenguaje de tipado dinámico, lo que significa que, por omisión, no es necesario especificar el tipo de una variable, ya que esto se determinará en tiempo de ejecución. Sin embargo, es posible tipar estáticamente ciertos aspectos del lenguaje utilizando las
<link linkend="language.types.declarations">declaraciones de tipo</link>.
Los diferentes tipos soportados por el sistema de tipos de PHP están disponibles en la
<link linkend="language.types.type-system">página del sistema de tipos</link>.
</para>
<para>
PHP es un lenguaje tipado dinámicamente, lo que significa que, por omisión,
no es necesario especificar el tipo de una variable, ya que esto se determinará
en tiempo de ejecución. Sin embargo, es posible tipificar estáticamente algunos
aspectos del lenguaje mediante el uso de
<link linkend="language.types.declarations">declaraciones de tipos</link>.
En la página <link linkend="language.types.type-system">sistema de tipos</link>
se pueden encontrar los distintos tipos que admite PHP.
</para>
<para>
Los tipos restringen el tipo de operaciones que se pueden realizar en ellos.
Sin embargo, si se utiliza una expresión/variable en una operación que su tipo
no admite, PHP intentará <link linkend="language.types.type-juggling">convertir</link>
el valor en un tipo que admita la operación.
Los tipos limitan el tipo de operaciones que pueden realizarse sobre ellos.
Sin embargo, si una expresión/variable se utiliza en una operación que su tipo no soporta, PHP intentará
<link linkend="language.types.type-juggling">manipular el tipo</link> en un tipo compatible con la operación.
Este proceso depende del contexto en el que se utiliza el valor.
Para obtener más información, consulte la sección sobre
<link linkend="language.types.type-juggling">Manipulación de tipos</link>.
Para más información, consulte la sección sobre la
<link linkend="language.types.type-juggling">manipulación de tipos</link>.
</para>
<tip>
<simpara>
<link linkend="types.comparisons">Tablas de comparación de tipos de PHP</link>
también pueden ser útiles, ya que contienen varios ejemplos de comparación entre
valores de diferentes tipos.
<link linkend="types.comparisons">Las tablas de comparación de tipos</link>
pueden ser también útiles, ya que se presentan diversos ejemplos de comparación entre valores de diferentes tipos.
</simpara>
</tip>
<note>
<simpara>
Es posible forzar que una expresión se evalúe en un tipo determinado mediante
una <link linkend="language.types.typecasting">conversión de tipo</link>.
También se puede convertir el tipo de una variable en el lugar mediante
la función <function>settype</function>.
Es posible forzar la evaluación de una expresión a un cierto tipo utilizando un
<link linkend="language.types.typecasting">type casting</link>.
Una variable también puede ser convertida en el lugar utilizando la función
<function>settype</function>.
</simpara>
</note>
<para>
Para comprobar el tipo y el valor de una
<link linkend="language.expressions">expresión</link>,
utilice la función <function>var_dump</function>.
Para obtener el tipo de una
Para verificar el tipo y el valor de una
<link linkend="language.expressions">expresión</link>, utilice la función
<function>var_dump</function>.
Para recuperar el tipo de una
<link linkend="language.expressions">expresión</link>,
utilice la función <function>get_debug_type</function>.
To retrieve the type of an
<link linkend="language.expressions">expression</link>,
use the <function>get_debug_type</function> function.
Sin embargo, para comprobar si una expresión es de un tipo
determinado, utilice las funciones
Sin embargo, para verificar si una expresión es de un cierto tipo, utilice mejor las funciones
<!-- TODO When PhD support is there: <function>is_<replaceable>type</replaceable></function> -->
<literal>is_<replaceable>type</replaceable></literal>.
<informalexample>
<example>
<title>Tipos Diferentes</title>
<programlisting role="php">
<![CDATA[
<?php
$a_bool = true; // un valor booleano
$a_str = "foo"; // una cadena de caracteres
$a_str2 = 'foo'; // una cadena de caracteres
$an_int = 12; // un número entero
$a_bool = TRUE; // un booleano
$a_str = "foo"; // un string
$a_str2 = 'foo'; // un string
$an_int = 12; // un integer
echo get_debug_type($a_bool), "\n";
echo get_debug_type($a_str), "\n";
echo gettype($a_bool); // muestra: boolean
echo gettype($a_str); // muestra: string
// Si este valor es un entero, incrementarlo en cuatro
// Si es un integer, incrementa en 4
if (is_int($an_int)) {
$an_int += 4;
}
// Si $a_bool es una cadena, imprimirla
// (no imprime nada)
// Si $a_bool es un string, se muestra
if (is_string($a_bool)) {
echo "Cadena: $a_bool";
echo "String: $a_bool";
}
?>
]]>
@@ -108,16 +99,15 @@ string
int(16)
]]>
</screen>
</informalexample>
</example>
</para>
<note>
<simpara>
Antes de PHP 8.0.0, cuando la función <function>get_debug_type</function>
no estaba disponible, se podía utilizar en su lugar la función
<function>gettype</function>.
Sin embargo, no utiliza los nombres de tipos canónicos.
</simpara>
</note>
<simpara>
Anterior a PHP 8.0.0, cuando la función <function>get_debug_type</function> no está
disponible, la función <function>gettype</function> puede ser utilizada en su lugar.
Sin embargo, no utiliza los nombres de tipo canónicos.
</simpara>
</note>
</sect1>
&language.types.type-system;
@@ -142,6 +132,7 @@ int(16)
&language.types.type-juggling;
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 46a9cdd2dbef4ec89bf65fad9930e2feb78bbb98 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 0f7d81c13c60336b1f8662d3d52a942358bd0c7c Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes Maintainer: Marqitos -->
<book xml:id="book.ev" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<?phpdoc extension-membership="pecl" ?>
@@ -34,9 +34,7 @@
</para>
<para>
Para más detalles consulte la
<link
xlink:href="http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod">documentación
de libev</link>
<link xlink:href="http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod">documentación de libev</link>.
</para>
</preface>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 23ea6be076881a34e1d454e9680968ece085f7f6 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 85d72c5380a0b292f85236fec0d5e6d690a46c30 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="eventhttp.accept" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
@@ -31,7 +31,8 @@
<note>
<para>
Para enlazar un socket, una conexión <literal>listen</literal> y una conexión
<literal>accept</literal> en el socket en una sola llamada, utilice el método
<literal>accept</literal>
en el socket en una sola llamada, utilice el método
<methodname>EventHttp::bind</methodname>.
<methodname>EventHttp::accept</methodname> solo es necesario si un socket
está listo para aceptar las conexiones.
@@ -67,13 +68,14 @@
<programlisting role="php">
<![CDATA[
<?php
$base = new EventBase();
$http = new EventHttp($base);
$addresses = array (
$addresses = [
8091 => "127.0.0.1",
8092 => "127.0.0.2",
);
];
$i = 0;
$socket = array();

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 9e9578a5c4288bf10c16757a131c79c4e28252a8 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 9e9578a5c4288bf10c1675da131c79c4e28252a8 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="mongodb-driver-clientencryption.getkey" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 4754397753fd79f1c846868b66a2448babab1c54 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 6d310c441fd9548050c972e694438b362fa6d1fd Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="mysql-xdevapi-session.getdefaultschema" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
@@ -10,12 +10,11 @@
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>string</type><methodname>mysql_xdevapi\Session::getDefaultSchema</methodname>
<modifier>public</modifier> <type class="union"><type>mysql_xdevapi\Schema</type><type>null</type></type><methodname>mysql_xdevapi\Session::getDefaultSchema</methodname>
<void />
</methodsynopsis>
<para>
Devuelve el nombre del esquema predeterminado tal como se define generalmente
en el URI de conexión.
Recupera el esquema por defecto que se suele establecer en el URI de conexión.
</para>
</refsect1>
@@ -27,8 +26,7 @@
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
El nombre del esquema predeterminado definido por la conexión, o &null; si
no se ha definido ninguno.
El esquema por defecto definido por la conexión, o &null; si no se ha establecido ninguno.
</para>
</refsect1>
@@ -43,7 +41,7 @@ $uri = "mysqlx://testuser:testpasswd@localhost:33160/testx?ssl-mode=disabled";
$session = mysql_xdevapi\getSession($uri);
$schema = $session->getDefaultSchema();
echo $schema;
echo $schema->getName();
?>
]]>
</programlisting>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 0be325d396b139feeaee38168f779be962b74f09 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 23ea6be076881a34e1d454e9680968ece085f7f6 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="parle.pattern.matching" xmlns="http://docbook.org/ns/docbook">
<title>Correspondencia de patrón Parle</title>
@@ -20,8 +20,7 @@
<member><literal>[:space:]</literal></member>
<member><literal>[:upper:]</literal></member>
<member><literal>[:xdigit:]</literal></member>
</simplelist>
.
</simplelist>.
</para>
<para>
Las clases de caracteres Unicode no están actualmente activadas por omisión, pase --enable-parle-utf32 para hacerlas disponibles.

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 4754397753fd79f1c846868b66a2448babab1c54 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: e652ed93a5ba1f87c8f2058ff2bdfe626cf4a560 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<refentry xml:id="streamwrapper.dir-readdir" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
@@ -12,7 +12,7 @@
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>string</type><methodname>streamWrapper::dir_readdir</methodname>
<modifier>public</modifier> <type class="union"><type>string</type><type>bool</type></type><methodname>streamWrapper::dir_readdir</methodname>
<void />
</methodsynopsis>
<para>
@@ -32,9 +32,17 @@
Debe devolver una &string; que representa el próximo nombre de archivo,
o &false; si no hay más archivos.
</para>
<warning>
<simpara>
Devolver <type>true</type> o <type>false</type> tendrá el mismo
efecto de señalar que no hay un siguiente fichero. Sin embargo,
devolver <type>true</type> está desaconsejado y <type>false</type>
debe ser utilizado para señalar esta condición en su lugar.
</simpara>
</warning>
<note>
<para>
El valor devuelto se convertido en &string;.
Un valor de retorno no booleano se converti en &string;.
</para>
</note>
</refsect1>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 4754397753fd79f1c846868b66a2448babab1c54 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 821af5a8ba67e317b646a1c6b74b3229eb85c2fd Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="streamwrapper.stream-cast" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
@@ -12,7 +12,7 @@
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>resource</type><methodname>streamWrapper::stream_cast</methodname>
<modifier>public</modifier> <type class="union"><type>resource</type><type>false</type></type><methodname>streamWrapper::stream_cast</methodname>
<methodparam><type>int</type><parameter>cast_as</parameter></methodparam>
</methodsynopsis>
<para>