mirror of
https://github.com/php/doc-es.git
synced 2026-03-29 01:42:12 +01:00
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@338285 c90b9560-bf6c-de11-be94-00142212c4b1
336 lines
13 KiB
XML
336 lines
13 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: 05699686607d6714c532dafac4e19de932cb7c63 Maintainer: seros Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
<chapter xml:id="oci8.connection" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>Manejo de conexiones de OCI8 y agrupamiento de conexiones</title>
|
|
<section>
|
|
<title>Funciones de conexión</title>
|
|
<para>
|
|
La extenisón OCI8 proporciona tres funciones diferentes para
|
|
conectarse a Oracle. La función de conexión estándar
|
|
es <function>oci_connect</function>. Esta crea una conexión a
|
|
una base de datos de Oracle y devuelve un recurso utilizado por las llamadas
|
|
subsiguientes a dicha base de datos.
|
|
</para>
|
|
<para>
|
|
Conectarse a un servidor Oracle es una operación razonablemente cara
|
|
en términos del tiempo que toma en completarse.
|
|
La función <function>oci_pconnect</function> utiliza una caché de conexiones
|
|
persistentes que puede ser reutilizada a través de diferentes peticiones de
|
|
scripts. Esto significa que una conexión únicamente tendrá carga adicional normalmente
|
|
una vez por cada proceso de PHP (o subproceso de Apache).
|
|
</para>
|
|
<para>
|
|
Si una aplicación se conecta a Oracle usando un conjunto diferente de
|
|
credenciales para cada usuario de la web, la caché persistente empleada por
|
|
<function>oci_pconnect</function> no será muy útil ya que el
|
|
número de usuarios concurrentes aumentará, hasta el punto donde podría
|
|
empezar a afectar negativamente al rendimiendo global del servidor de Oracle
|
|
debido a que mantiene demasiadas conexiones inactivas. Si la
|
|
aplicación está estructurada de esta manera, se recomienda
|
|
ajustarla a través de las opciones de configuración
|
|
<link linkend="ini.oci8.max-persistent">oci8.max_persistent</link>
|
|
y <link linkend="ini.oci8.persistent-timeout">oci8.persistent_timeout</link>
|
|
(éstas otorgan control sobre el tamaño y el tiempo de vida
|
|
de la caché de conexiones persistentes), usar Oracle Database
|
|
Resident Connection Pooling (en Oracle Database 11g o posterior), o usar
|
|
<function>oci_connect</function> en su lugar.
|
|
</para>
|
|
<para>
|
|
<function>oci_connect</function>
|
|
y <function>oci_pconnect</function> emplean una caché de conexiones; si
|
|
mútiples llamadas a
|
|
<function>oci_connect</function> usan los mismos parámetros en un script
|
|
dado, la segunda y subsiguientes llamadas devolverán el gestor de conexión
|
|
existente. La caché usada por
|
|
<function>oci_connect</function> se limpia al final de la ejecución
|
|
del script, o cuando se cierra explícitamente el gestor de conexión. La
|
|
función <function>oci_pconnect</function> tiene un comportamiento similar,
|
|
aunque su caché se mantiene de forma separada y sobrevive entre
|
|
peticiones HTTP.
|
|
</para>
|
|
<para>
|
|
Esta característica de almacenamiento en caché significa que dos gestores no están transaccionalmente
|
|
aislados (de hecho, son el mismo gestor de conexión, por lo que no existe
|
|
aislamiento alguno). Si la aplicación necesita dos conexiones transaccionalmente
|
|
aisladas por separado, se ha de usar
|
|
<function>oci_new_connect</function>.
|
|
</para>
|
|
<para>
|
|
La caché de <function>oci_pconnect</function> es limpiada y cualquier
|
|
conexión a bases de datos cerrada cuando finaliza el proceso de PHP, por lo que
|
|
el uso efectivo de conexiones persistentes requiere que PHP sea un
|
|
módulo de Apache o se use con FCGI, o similar. Las conexiones persistentes
|
|
no tendrán ningún beneficio con <function>oci_connect</function>
|
|
cuando PHP se use con CGI o mediante la línea de comandos.
|
|
</para>
|
|
<para>
|
|
La función <function>oci_new_connect</function> siempre crea una
|
|
nueva conexión al servidor de Oracle, independientemente de que existan
|
|
otras conexiones. Las aplicaciones web con mucho tráfico
|
|
deberían evitar el uso de
|
|
<function>oci_new_connect</function>, especialmente las secciones más concurridas de
|
|
la aplicación.
|
|
</para>
|
|
</section>
|
|
<section>
|
|
<title>Agrupamiento de conexiones DRCP</title>
|
|
<para>
|
|
PHP, desde 5.3 (PECL OCI8 1.3), posee soporte para Oracle Database Resident
|
|
Connection Pooling (DRCP). DRCP permite el uso más eficiente de la memoria
|
|
de la máquina donde reside la base de datos y proporciona una alta escalabilidad. Se
|
|
requiren cambios mínimos, o ninguno, en la aplicación para usar DRCP.
|
|
</para>
|
|
<para>
|
|
DRCP es apropiado para aplicaciones que se conectan usando pocos esquemas de
|
|
bases de datos y mantienen abiertas dichas conexiones durante un corto periodo de
|
|
tiempo. Las demás aplicaciones deberían usar los procesos de servidor de bases de datos
|
|
predeterminado <literal>Dedicado</literal> de Oracle, o
|
|
usar servidores <literal>Compartidos</literal>.
|
|
</para>
|
|
<para>
|
|
DRCP beneficia a las tres funciones de conexión, pero proporciona la mayor
|
|
escalabilidad cuando las conexiones se crean
|
|
con <function>oci_pconnect</function>.
|
|
</para>
|
|
<para>
|
|
Para que DRCP esté disponible en OCI8, las bibliotecas cliente de Oracle usadas por
|
|
PHP y la versión de Oracle Database deben ser 11g o superior.
|
|
</para>
|
|
<para>
|
|
La documentación de DRCP se encuentra en varios manuales de Oracle. Por
|
|
ejemplo,
|
|
véase <link xlink:href="&url.oracle.drcp.configure;">Configuring
|
|
Database Resident Connection Pooling</link> en la documentación de
|
|
Oracle para obtner información de su uso.
|
|
Un <link xlink:href="&url.oracle.drcp.whitepaper;">Libro blanco
|
|
de DRCP</link> contiene información de antecedentes sobre DRCP.
|
|
</para>
|
|
<para>
|
|
Para usar DRCP, construya PHP con la extensión OCI8 1.3 (o posterior) y las bibliotecas de
|
|
Oracle 11g (o posteriores), y luego siga estos pasos:
|
|
</para>
|
|
<para>
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>
|
|
Como administrador de bases de datos privilegiado, use un programa como
|
|
SQL*Plus para iniciar el agrupamiento de conexiones en la base de datos:
|
|
</para>
|
|
<para>
|
|
<informalexample>
|
|
<screen>
|
|
<![CDATA[
|
|
SQL> execute dbms_connection_pool.start_pool;
|
|
]]>
|
|
</screen>
|
|
</informalexample>
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
Opcionalmente
|
|
use <literal>dbms_connection_pool.alter_param()</literal> para
|
|
configurar los ajustes de DRCP. La configuración de la agrupación actual se puede
|
|
consultar desde la vista <literal>DBA_CPOOL_INFO</literal>.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
Actualice las cadenas de conexión usadas. Para las aplicaciones de PHP que
|
|
actualmente se conecten usando un Nombre de Conexión de Red
|
|
como <literal>MYDB</literal>:
|
|
</para>
|
|
<para>
|
|
<informalexample>
|
|
<screen>
|
|
<![CDATA[
|
|
$c = oci_pconnect("mi_usuario", "mi_contraseña", "MYDB");
|
|
]]>
|
|
</screen>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
Modifique el fichero tnsnames.ora y añada
|
|
una cláusula <literal>(SERVER=POOLED)</literal>, por ejemplo:
|
|
</para>
|
|
<para>
|
|
<informalexample>
|
|
<screen>
|
|
<![CDATA[
|
|
MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
|
|
(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
|
|
(SERVER=POOLED)))
|
|
]]>
|
|
</screen>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
Alternativamente, modifique la sintaxis de Easy Connect en PHP y añada
|
|
<literal>:POOLED</literal> después del nombre del servidor:
|
|
</para>
|
|
<para>
|
|
<informalexample>
|
|
<screen>
|
|
<![CDATA[
|
|
$c = oci_pconnect("mi_usuario", "mi_contraseña", "mi_host.dom.com:1521/sales:POOLED");
|
|
]]>
|
|
</screen>
|
|
</informalexample>
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
Edite &php.ini; y elija un nombre de clase de conexión. Este nombre
|
|
señala una división lógica de la agrupación de conexiones y se puede
|
|
usar para aislar la agrupación para diferentes aplicaciones. Cualquier aplicación
|
|
de PHP con el mismo nombre de usuario y valor de clase de conexión
|
|
podrá compartir conexiones de la agrupación, proporcionando una mayor
|
|
escalabilidad.
|
|
</para>
|
|
<para>
|
|
<informalexample>
|
|
<screen>
|
|
<![CDATA[
|
|
oci8.connection_class = "NOMBRE_DE_MI_APLICACIÓN"
|
|
]]>
|
|
</screen>
|
|
</informalexample>
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
Ejecute la aplicación, conectándose a la base de datos 11g (o posterior).
|
|
</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
<note>
|
|
<para>
|
|
Las aplicaciones que usen Oracle 10g que requieran el rendimiento de
|
|
conexiones persitentes, pueden reducir la cantidad de memoria que el servidor de
|
|
bases de datos use utilizando sevidores <literal>Compartidos</literal> de Oracle
|
|
(anteriormente conocidos como Servidores de Multisubprocesos). Consulte la documentación
|
|
de Oracle para más información.
|
|
</para>
|
|
</note>
|
|
</section>
|
|
<section>
|
|
<title>Recomendaciones para DRCP y limitaciones conocidas</title>
|
|
<para>
|
|
El cambio de una contraseña con conexiones DRCP fallará con el error
|
|
<emphasis>ORA-56609: Usage not supported with DRCP</emphasis>.
|
|
Ésta es una restricción documentada de Oracle Database 11g.
|
|
</para>
|
|
<para>
|
|
Con la extensión OCI8 1.3, las conexiones persistentas pueden ser
|
|
cerradas por el usuario, permitiendo mayor control sobre el uso de recursos
|
|
de conexión. Las conexiones persistentes ahora también serán cerradas
|
|
automáticamente cuando no haya variables de PHP que hagan referncia a ellas, como
|
|
al final del ámbito de una función de usuario de PHP. Esto revertirá
|
|
cualquier transacción no consignada. Estos cambios a las conexiones
|
|
persistentes hacen que se comporten de forma similar a las conexiones no
|
|
persistentes, simplificando la interfaz, permitiendo así mayor
|
|
consistencia y predictabilidad a las aplicaciones.
|
|
Use <link linkend="ini.oci8.old-oci-close-semantics">oci8.old_oci_close_semantics</link>
|
|
con el valor de
|
|
<emphasis>On</emphasis> para conservar el comportamiento histórico.
|
|
</para>
|
|
<para>
|
|
Si Oracle Database es la versión 11.1.0.6, se deben aplicar los parches de las
|
|
bases de datos de Oracle para el error 6474441 de Oracle para usar DRCP.
|
|
Sin este parche, los errores como <emphasis>ORA-01000: maximum
|
|
open cursors exceeded</emphasis>, <emphasis>ORA-01001 invalid
|
|
cursor</emphasis> o <emphasis>ORA-01002 fetch out of
|
|
sequence</emphasis> podrían ocurrir. Este error fue corregido en Oracle
|
|
11.1.0.7 en adelante.
|
|
</para>
|
|
<para>
|
|
Si no se puede aplicar el parche de las bases de datos de Oracle 11.1.0.6, se pueden seguir
|
|
una de estas tres alternativas en su lugar:
|
|
</para>
|
|
<para>
|
|
<itemizedlist>
|
|
<listitem>
|
|
<simpara>
|
|
Conectarse usando servidores de Oracle <literal>Dedicados</literal>
|
|
o <literal>Compartidos</literal> en lugar de DRCP.
|
|
</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>
|
|
Establecer <link linkend="ini.oci8.statement-cache-size">oci8.statement_cache_size</link> de PHP
|
|
a 0.
|
|
</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>
|
|
Establecer un evento en el fichero de parámetros de inicialización de bases de datos:
|
|
<emphasis>event="56699 trace name context forever, level 128"</emphasis>.
|
|
</simpara>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
<para>
|
|
Los parches Oracle Database 11.1.0.7 y Oracle Database 11.1.0.6 para
|
|
el error 6474441 de Oracle permiten a las aplicacinones de PHP con conexión DRCP
|
|
usar el disparador <literal>LOGON</literal> de la base de datos para establecer las propiedades
|
|
de una sesión en el momento de crearla. Ejemplo de tales
|
|
configuraciones son el lenguaje NLS y el formato de fecha.
|
|
</para>
|
|
<para>
|
|
Si no se puede aplicar el parche para bases de datos Oracle 11.1.0.6, se pueden seguir
|
|
las siguientes alternativas en lugar
|
|
de usar los disparadores <literal>LOGON</literal>:
|
|
</para>
|
|
<para>
|
|
<itemizedlist>
|
|
<listitem>
|
|
<simpara>
|
|
Después de la identificación, establecer explícitamente las propiedades de la sesión usando
|
|
código de la aplicación de PHP.
|
|
</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>
|
|
Conectarse usando servidores de Oracle <literal>Dedicados</literal>
|
|
o <literal>Compartidos</literal> en lugar de DRCP.
|
|
</simpara>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
<para>
|
|
El reestableciemiento automático de las conexiones persistentes de PHP después
|
|
de la regeneración de procesos de Apache o FCGI significa que únicamente se recomiendan
|
|
los disparadores <literal>LOGON</literal> de PHP para establecer los atributos de sesiones
|
|
y no para peticiones de conexiones de usuario por cada aplicación. Esto es incluso más recomendado
|
|
con DRCP debido al ajuste automático de la agrupación y a la
|
|
manera de desencadenar los disparadores <literal>LOGON</literal> con la
|
|
autenticación de DRCP.
|
|
</para>
|
|
</section>
|
|
</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
|
|
-->
|
|
|