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:
@@ -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>
|
||||
|
||||
|
||||
@@ -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 >= 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
|
||||
>= 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, '<a><p>')</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, '<a><p>')</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>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
545
install/ini.xml
545
install/ini.xml
@@ -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 buscará
|
||||
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>
|
||||
|
||||
@@ -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 deberán 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>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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), será 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
|
||||
|
||||
485
install/pecl.xml
485
install/pecl.xml
@@ -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 cargarán 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>
|
||||
|
||||
|
||||
@@ -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
|
||||
-->
|
||||
|
||||
@@ -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 mostrarán 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>
|
||||
|
||||
@@ -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 multiplicará 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 será 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
|
||||
|
||||
@@ -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 má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>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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><?php</literal> y <literal>?></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><?php</literal> y <literal>?></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><?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><?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><?=</literal>,
|
||||
que es una abreviatura de <code><?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><?php ?></code> y <code><?= ?></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
|
||||
?>, 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><?=</literal>,
|
||||
que es un atajo para <code><?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 <?php ?> para seguir los
|
||||
estándares.
|
||||
Como las etiquetas cortas pueden ser desactivadas, se recomienda utilizar
|
||||
solo las etiquetas normales (<code><?php ?></code> y
|
||||
<code><?= ?></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 ?>, 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><?php ?></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>// ... ?></literal>
|
||||
o <literal># ... ?></literal> SERÁ impreso:
|
||||
?> 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>// ... ?></literal>
|
||||
o después de <literal># ... ?></literal> SERÁ mostrado:
|
||||
?> terminará el modo PHP y volverá 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
|
||||
-->
|
||||
|
||||
@@ -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 terminará 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 expresión</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 creará.
|
||||
default:
|
||||
// Ninguna excepción, el objeto será 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
@@ -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 &) 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 (&) 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
@@ -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
|
||||
-->
|
||||
|
||||
@@ -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
|
||||
=& $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
|
||||
=& $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>&</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>&</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>&</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>&</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>&</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(&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(&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
|
||||
-->
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 será convertido en &string;.
|
||||
Un valor de retorno no booleano se convertirá en &string;.
|
||||
</para>
|
||||
</note>
|
||||
</refsect1>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user