<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.mysqli.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'mysqli.persistconns.php',
    1 => 'Модуль mysqli и постоянные соединения',
    2 => 'Модуль mysqli и постоянные соединения',
  ),
  'up' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'MySQLi',
  ),
  'prev' => 
  array (
    0 => 'mysqli.configuration.php',
    1 => 'Настройка во время выполнения',
  ),
  'next' => 
  array (
    0 => 'mysqli.constants.php',
    1 => 'Предопределённые константы',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/mysqli/persistconns.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqli.persistconns" class="chapter">

 <h1 class="title">Модуль mysqli и постоянные соединения</h1>


 <p class="para">
  Идея постоянных подключений состоит в том, чтобы соединение между клиентским процессом
  и базой данных можно было использовать повторно, особенно когда требуется
  создавать и закрывать соединения множество раз. Это бы позволило снизить
  накладные расходы на создание новых подключений каждый раз, когда они требуются,
  за счёт использования существующих кешированных подключений, свободных для
  повторного использования.
 </p>

 <p class="para">
  В отличие от модуля mysql, в mysqli нет отдельной функции для создания
  постоянных соединений. Чтобы открыть постоянное соединение, при создании
  подключения к имени хоста нужно добавить префикс <code class="literal">p:</code>.
 </p>

 <p class="para">
  При использовании постоянных соединений можно столкнуться с проблемой, которая
  заключается в том, что клиенты могут оставлять такие подключения в
  непредсказуемом состоянии. Например, клиент ставит блокировку
  на таблицу, а затем аварийно завершает работу. То есть блокировка снята не
  будет. Новый клиентский процесс, использующий это подключение повторно, получит
  его <q class="quote">как есть</q>, и вынужден будет провести какую-то очистку
  подключения, прежде чем начать его использовать. Соответственно, в задачи
  программиста входит ещё и проверка подобных ситуаций и внедрение кода,
  осуществляющего такую очистку.
 </p>

 <p class="para">
  Тем не менее, в <code class="literal">mysqli</code> эта проблема решена. В модуле
  есть встроенный функционал, осуществляющий очистку соединений и
  переводящий их в состояние пригодное для использования. Код очистки,
  реализованный в <code class="literal">mysqli</code> включает следующие операции:
 </p>

 <ul class="itemizedlist">

  <li class="listitem">
   <p class="para">
    Откат активных транзакций
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    Закрытие и удаление временных таблиц
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    Снятие блокировки с таблиц
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    Сброс переменных сессии
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    Закрытие подготовленных запросов (всегда происходит в PHP)
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    Закрытие обработчиков
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    Снятие блокировок, установленных функцией <span class="function"><strong>GET_LOCK()</strong></span>
   </p>
  </li>

 </ul>

 <p class="para">
  Это позволяет быть уверенным в том, что возвращённые из пула соединения
  готовы к использованию в клиентских процессах.
 </p>

 <p class="para">
  Модуль <code class="literal">mysqli</code> делает очистку соединений автоматически
  путём вызова C-API функции <code class="literal">mysql_change_user()</code>.
 </p>

 <p class="para">
  Автоматическая очистка имеет свои достоинства и недостатки. Как плюс,
  программисту больше не надо заботиться об очистке соединения, все делается
  автоматически. Однако, это не лучшим образом влияет на производительность,
  скрипт <em>потенциально</em> может работать медленней, так как
  автоматическая чистка запускается каждый раз, когда соединение извлекается
  из пула.
 </p>

 <p class="para">
  Есть возможность отключить автоматическую очистку соединений, если скомпилировать
  PHP с директивой <strong><code>MYSQLI_NO_CHANGE_USER_ON_PCONNECT</code></strong>.
 </p>

 <blockquote class="note"><p><strong class="note">Замечание</strong>: 
  <p class="para">
   Постоянные соединения поддерживаются модулем <code class="literal">mysqli</code>
   как при работе с родным MySQL-драйвером, так и при работе с клиентской
   библиотекой MySQL.
  </p>
 </p></blockquote>

</div>
<?php manual_footer($setup); ?>