mirror of
https://github.com/php/doc-ru.git
synced 2025-07-21 23:23:20 +00:00
261 lines
15 KiB
XML
261 lines
15 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 5e41012cfdf8f2eff5fa56de446c7656afac536c Maintainer: rjhdby Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<chapter xml:id="oci8.connection" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
<title>Работа с соединениями OCI8 и Connection Pooling</title>
|
||
<section>
|
||
<title>Функции подключения</title>
|
||
<para>
|
||
Модуль OCI8 предоставляет три различных функции для подключения
|
||
к серверу Oracle. Стандартная функция соединения —
|
||
<function>oci_connect</function>. Она создаёт соединение к базе данных
|
||
Oracle и возвращает ресурс, который используется при последующих обращениях
|
||
к БД.
|
||
</para>
|
||
<para>
|
||
Подключение к серверу Oracle является достаточно дорогостоящей операцией
|
||
с точки зрения времени, которое требуется для выполнения.
|
||
Функция <function>oci_pconnect</function> использует постоянный
|
||
кеш соединений, которые могут быть повторно использованы различными
|
||
запросами скриптов. Это означает, что затраты на установку соединения,
|
||
как правило, происходят только единожды на один процесс PHP
|
||
(или на потомка Apache).
|
||
</para>
|
||
<para>
|
||
Если приложение соединяется к серверу Oracle, используя особый набор
|
||
данных для каждого веб-пользователя, то постоянный кеш соединений,
|
||
используемый функцией <function>oci_pconnect</function> будет менее
|
||
полезным, поскольку количество одновременных пользователей вырастает до
|
||
того уровня, где он может начать оказывать негативное влияние на
|
||
общую производительность сервера Oracle из-за поддержания слишком
|
||
большого количества простаивающих соединений. Если приложение
|
||
настроено таким образом, то рекомендуется либо настроить его с
|
||
помощью параметров конфигурации
|
||
<link linkend="ini.oci8.max-persistent">oci8.max_persistent</link>
|
||
и <link linkend="ini.oci8.persistent-timeout">oci8.persistent_timeout</link>
|
||
(это даст возможность управления размером кеша постоянных соединений и
|
||
их время жизни), либо использовать Oracle Database
|
||
Resident Connection Pooling (в Oracle Database 11g и новее), либо использовать функцию
|
||
<function>oci_connect</function> вместо неё.
|
||
</para>
|
||
<para>
|
||
Вместе <function>oci_connect</function>
|
||
и <function>oci_pconnect</function> используют кеш подключений; если
|
||
множество вызовов <function>oci_connect</function> использует одинаковые
|
||
параметры в данном скрипте, второй и последующие вызовы вернут
|
||
существующий дескриптор соединения. Кеш, который использует функция
|
||
<function>oci_connect</function>, очищается по завершению выполнения
|
||
скрипта, или когда соединение неявно закрывается. У функции
|
||
<function>oci_pconnect</function> похожее поведение, хотя её кеш
|
||
обрабатывается отдельно и остаётся действующим между
|
||
HTTP-запросами.
|
||
</para>
|
||
<para>
|
||
Эта возможность кеширования означает, что два дескриптора не изолированы
|
||
транзакционно (они на самом деле являются одним и тем же дескриптором, поэтому здесь
|
||
нет никакой изоляции). Если приложению необходимы два отдельных
|
||
транзакционно изолированных соединения, то необходимо использовать
|
||
функцию <function>oci_new_connect</function>.
|
||
</para>
|
||
<para>
|
||
Кеш функции <function>oci_pconnect</function> очищается и закрываются
|
||
все соединения к БД, когда завершается процесс PHP. Поэтому
|
||
эффективное использование постоянных соединений требует, чтобы PHP был
|
||
модулем Apache или использовался с FPM или подобным. Постоянные соединения
|
||
не будут иметь никаких преимуществ перед <function>oci_connect</function>,
|
||
когда PHP используется с CGI или через командную строку.
|
||
</para>
|
||
<para>
|
||
Функция <function>oci_new_connect</function> каждый раз создаёт
|
||
новое соединение с сервером Oracle, несмотря на то, что другие
|
||
соединения могут уже существовать. Высоконагруженным веб-приложениям
|
||
следует избегать использования <function>oci_new_connect</function>, особенно
|
||
в самых загруженных частях приложения.
|
||
</para>
|
||
<para>
|
||
Постоянные соединения могут быть закрыты пользователем, что
|
||
даёт более полный контроль над использованием ресурсов. Также постоянные соединения могут
|
||
быть закрыты автоматически, если не осталось переменных PHP указывающих на них,
|
||
например при завершении выполнения пользовательской функции. Закрытие соединения
|
||
откатит все не подтверждённые транзакции. Эти изменения в постоянных подключениях
|
||
делают их поведение аналогичным не постоянным соединениям. Чтобы включить старое
|
||
поведение, задайте опцию <link linkend="ini.oci8.old-oci-close-semantics">oci8.old_oci_close_semantics</link> значением
|
||
<emphasis>On</emphasis>.
|
||
</para>
|
||
<para>
|
||
Автоматическое пересоздание постоянных соединений после перезапуска процессов
|
||
Apache или FPM, означает, что Oracle Database <literal>LOGON</literal>
|
||
рекомендуется только для настройки атрибутов сеанса, а не для запросов
|
||
на подключение пользователей для отдельных приложений.
|
||
</para>
|
||
</section>
|
||
<section>
|
||
<title>Создание пула соединений DRCP</title>
|
||
<para>
|
||
PHP поддерживает постоянный пул соединений Oracle 11g
|
||
(DRCP). DRCP позволяет более эффективно использовать память СУБД и предоставляет
|
||
высокую масштабируемость. Изменять код приложения для использования DRCP либо
|
||
нет необходимости, либо требуются минимальные изменения.
|
||
</para>
|
||
<para>
|
||
DRCP подходит для приложений, которые подключаются используя несколько
|
||
схем БД и сохраняют соединения к БД открытыми короткий промежуток времени.
|
||
Другим приложениям следует использовать доступные по умолчанию
|
||
<literal>Dedicated</literal> серверные процессы или
|
||
использовать <literal>Shared</literal> сервера.
|
||
</para>
|
||
<para>
|
||
DRCP приносит пользу всем трём функциям подключения, однако предоставляет
|
||
самую высокую масштабируемость, когда соединения создаются с
|
||
помощью функции <function>oci_pconnect</function>.
|
||
</para>
|
||
<para>
|
||
Чтобы функциональность DRCP была доступна в OCI8, клиентские библиотеки Oracle, используемые в
|
||
PHP, и версия сервера баз данных должны быть 11g и новее.
|
||
</para>
|
||
<para>
|
||
Документация по DRCP находится в нескольких руководствах Oracle. К примеру,
|
||
смотрите <link xlink:href="&url.oracle.drcp.configure;">Конфигурирование
|
||
пула постоянных соединений базы данных</link> в документации Oracle
|
||
для информации по использованию.
|
||
Документ <link xlink:href="&url.oracle.drcp.whitepaper;">техническое
|
||
описание DRCP</link> содержит дополнительную информацию по DRCP.
|
||
</para>
|
||
<para>
|
||
Для использования DRCP, установите модуль OCI8
|
||
и библиотеки Oracle 11g (или новее) и затем выполните следующие действия:
|
||
</para>
|
||
<para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>
|
||
Как привилегированный администратор БД воспользуйтесь программой
|
||
наподобие SQL*Plus, чтобы запустить пул соединений в СУБД:
|
||
</para>
|
||
<para>
|
||
<informalexample>
|
||
<screen>
|
||
<![CDATA[
|
||
SQL> execute dbms_connection_pool.start_pool;
|
||
]]>
|
||
</screen>
|
||
</informalexample>
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
Дополнительно можно использовать
|
||
<literal>dbms_connection_pool.alter_param()</literal>,
|
||
чтобы конфигурировать параметры DRPC. Текущие настройки пула могут быть
|
||
получены из представления <literal>DBA_CPOOL_INFO</literal>.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
Обновите используемую строку соединения. К примеру, для приложений PHP, которые
|
||
сейчас соединяются, используя Network Connect Name
|
||
<literal>MYDB</literal>:
|
||
</para>
|
||
<para>
|
||
<informalexample>
|
||
<screen>
|
||
<![CDATA[
|
||
$c = oci_pconnect("myuser", "mypassword", "MYDB");
|
||
]]>
|
||
</screen>
|
||
</informalexample>
|
||
</para>
|
||
<para>
|
||
измените файл tnsnames.ora и добавьте
|
||
оператор <literal>(SERVER=POOLED)</literal>, например:
|
||
</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>
|
||
В качестве альтернативы можно изменить синтаксис упрощённого соединения
|
||
в PHP и добавить туда <literal>:POOLED</literal> после имени сервиса:
|
||
</para>
|
||
<para>
|
||
<informalexample>
|
||
<screen>
|
||
<![CDATA[
|
||
$c = oci_pconnect("myuser", "mypassword", "myhost.dom.com:1521/sales:POOLED");
|
||
]]>
|
||
</screen>
|
||
</informalexample>
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
Отредактируйте &php.ini; и выберите имя класса соединения. Это имя
|
||
устанавливает логическое разделение пула соединений и может использоваться,
|
||
чтобы изолировать пул для отдельных приложений. Любое PHP-приложение
|
||
с одинаковым именем пользователя и классом для соединения
|
||
будет иметь возможность совместно использовать соединения в пуле, получая
|
||
бОльшую масштабируемость.
|
||
</para>
|
||
<para>
|
||
<informalexample>
|
||
<screen>
|
||
<![CDATA[
|
||
oci8.connection_class = "MY_APPLICATION_NAME"
|
||
]]>
|
||
</screen>
|
||
</informalexample>
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
Запустите приложение, соединяющееся с базой 11g и новее.
|
||
</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</para>
|
||
<note>
|
||
<para>
|
||
Приложения, использующие Oracle 10g, которые требуют производительности
|
||
от постоянных соединений, могут уменьшить количество памяти сервера БД,
|
||
которое используется <literal>Shared</literal>-серверами Oracle
|
||
(ранее известные как многопоточные сервера). Обратитесь к документации
|
||
Oracle для более подробной информации.
|
||
</para>
|
||
</note>
|
||
<note>
|
||
<para>
|
||
При изменении пароля через DRCP-соединение будет выдаваться
|
||
ошибка <emphasis>ORA-56609: Usage not supported with DRCP</emphasis>.
|
||
Это документированное ограничение of Oracle Database 11g.
|
||
</para>
|
||
</note>
|
||
</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
|
||
-->
|