<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/mysqli.quickstart.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'mysqli.quickstart.connections.php',
    1 => 'Соединения',
    2 => 'Соединения',
  ),
  'up' => 
  array (
    0 => 'mysqli.quickstart.php',
    1 => 'Краткое руководство',
  ),
  'prev' => 
  array (
    0 => 'mysqli.quickstart.dual-interface.php',
    1 => 'Процедурный и объектно-ориентированный интерфейс',
  ),
  'next' => 
  array (
    0 => 'mysqli.quickstart.statements.php',
    1 => 'Выполнение запросов',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/mysqli/quickstart.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqli.quickstart.connections" class="section">
  <h2 class="title">Соединения</h2>
  <p class="para">
   Сервер MySQL поддерживает различные способы передачи данных. Соединения могут
   использовать протоколы TCP/IP, сокеты Unix-доменов или именованные пайпы
   Windows.
  </p>
  <p class="para">
   Имя хоста <code class="literal">localhost</code> имеет особое значение.
   Оно используется только в сокетах Unix доменов.
   Чтобы открыть TCP/IP-соединение с локальным хостом, необходимо использовать <code class="literal">127.0.0.1</code> вместо имени хоста <code class="literal">localhost</code>.
  </p>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Пример #1 Специальное назначение localhost</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$mysqli </span><span style="color: #007700">= new </span><span style="color: #0000BB">mysqli</span><span style="color: #007700">(</span><span style="color: #DD0000">"localhost"</span><span style="color: #007700">, </span><span style="color: #DD0000">"user"</span><span style="color: #007700">, </span><span style="color: #DD0000">"password"</span><span style="color: #007700">, </span><span style="color: #DD0000">"database"</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">host_info </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$mysqli </span><span style="color: #007700">= new </span><span style="color: #0000BB">mysqli</span><span style="color: #007700">(</span><span style="color: #DD0000">"127.0.0.1"</span><span style="color: #007700">, </span><span style="color: #DD0000">"user"</span><span style="color: #007700">, </span><span style="color: #DD0000">"password"</span><span style="color: #007700">, </span><span style="color: #DD0000">"database"</span><span style="color: #007700">, </span><span style="color: #0000BB">3306</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">host_info </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;</span></span></code></div>
    </div>

    
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

    <div class="example-contents screen">
<div class="cdata"><pre>
Localhost via UNIX socket
127.0.0.1 via TCP/IP
</pre></div>
    </div>
   </div>
  </p>
  <p class="para">
   <strong>Умолчания для параметров соединений</strong>
  </p>
  <p class="para">
   В зависимости от функции, осуществляющей подключение, какие-то параметры можно
   не задавать. Если параметр не задан, модуль попытается использовать
   значение по умолчанию для этого параметра, которое задано в конфигурационном
   файле PHP.
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Пример #2 Задание значений по умолчанию</strong></p>
    <div class="example-contents">
<div class="inicode"><pre class="inicode">mysqli.default_host=192.168.2.27
mysqli.default_user=root
mysqli.default_pw=&quot;&quot;
mysqli.default_port=3306
mysqli.default_socket=/tmp/mysql.sock</pre>
</div>
    </div>

   </div>
  </p>
  <p class="para">
   Далее, чтобы установить соединение, функция передаёт параметры в клиентскую
   библиотеку, которой пользуется модуль. Если библиотека обнаружит пустые или
   отсутствующие параметры, она может подставить вместо них свои встроенные
   значения по умолчанию.
  </p>
  <p class="para">
   <strong>
    Встроенные библиотечные значения по умолчанию для параметров соединения
   </strong>
  </p>
  <p class="para">
   Если имя хоста не задано или передана пустая строка, клиентская библиотека
   использует для подключения к Unix-сокету хоста <code class="literal">localhost</code>.
   Если сокет не задан или передана пустая строка, и при этом запрошено
   подключение к Unix-сокету, библиотека попытается подключиться к сокету
   <code class="literal">/tmp/mysql.sock</code>.
  </p>
  <p class="para">
   В Windows-системах, если в качестве имени хоста передаётся <code class="literal">.</code>,
   библиотека попытается открыть соединение на основе именованного пайпа. В этом
   случае имя сокета будет воспринято как имя пайпа. Если имя сокета не задано, то
   будет использовано значение <code class="literal">\\.\pipe\MySQL</code>.
  </p>
  <p class="para">
   Если соединение не использует ни сокет Unix-домена, ни именованный пайп Windows,
   и при этом не задан порт для подключения, библиотека использует номер порта
   <code class="literal">3306</code>.
  </p>
  <p class="para">
   В драйвере <a href="mysqlnd.overview.php" class="link">mysqlnd</a> и клиентской
   библиотеке MySQL (libmysqlclient) заложена та же логика определения умолчаний.
  </p>
  <p class="para">
   <strong>Настройки соединения</strong>
  </p>
  <p class="para">
   Настройки соединения позволяют, например, задать какие-то команды, которые
   нужно выполнить сразу после подключения, или отдать распоряжение использовать
   определённый набор символов. Настройки должны быть заданы до подключения к
   серверу.
  </p>
  <p class="para">
   Когда требуется задать настройки соединения, операция подключения выполняется
   в три этапа: функцией <span class="function"><a href="mysqli.init.php" class="function">mysqli_init()</a></span> или <span class="methodname"><a href="mysqli.construct.php" class="methodname">mysqli::__construct()</a></span> создаётся дескриптор
   подключения, затем подключение настраивается с помощью функции
   <span class="methodname"><a href="mysqli.options.php" class="methodname">mysqli::options()</a></span>, и наконец устанавливается сетевое
   соединение с сервером посредством функции
   <span class="methodname"><a href="mysqli.real-connect.php" class="methodname">mysqli::real_connect()</a></span>.
  </p>
  <p class="para">
   <strong>Объединение подключений в пул</strong>
  </p>
  <p class="para">
   Модуль mysqli поддерживает постоянные соединения с базой данных, которые
   представляют из себя специальный вид объединяемых соединений. По умолчанию
   каждое открытое скриптом соединение закрывается либо самим скриптом в ходе
   выполнения, либо автоматически по завершении работы скрипта. Постоянные
   соединения отличаются тем, что не закрываются, а помещаются в пул для
   повторного использования в дальнейшем. Если требуется подключиться к тому
   же серверу и базе данных, с тем же именем пользователя, паролем, сокетом и
   портом, то вместо создания нового подключения из пула извлекается уже
   существующее. Повторное использование подключений позволяет избежать
   накладных расходов на создание новых соединений.
  </p>
  <p class="para">
   Каждый PHP-процесс использует свой пул подключений mysqli. В зависимости от
   конфигурации веб-сервера, PHP-процесс может обслуживать один или несколько
   запросов. Соответственно, соединение из пула могут последовательно использовать
   несколько скриптов.
  </p>
  <p class="para">
   <strong>Постоянное соединение</strong>
  </p>
  <p class="para">
   Новое подключение создаётся, только если в пуле не найдётся свободного
   подключения с теми же данными хоста, имени пользователя, пароля, сокета, порта
   и базы данных по умолчанию. Механизм постоянных соединений можно включать
   и выключать PHP директивой <a href="mysqli.configuration.php#ini.mysqli.allow-persistent" class="link">mysqli.allow_persistent</a>.
   Максимальное количество соединений, которые может открыть скрипт, ограничено
   значением <a href="mysqli.configuration.php#ini.mysqli.max-links" class="link">mysqli.max_links</a>.
   Максимальное количество соединений, которые может открыть один PHP-процесс,
   ограничено значением <a href="mysqli.configuration.php#ini.mysqli.max-persistent" class="link">mysqli.max_persistent</a>. Следует
   заметить, что веб-сервер может порождать множество PHP процессов.
  </p>
  <p class="para">
   Главный недостаток постоянных подключений заключается в том, что перед
   повторным использованием их состояние не сбрасывается к изначальному. Например,
   открытые и незавершённые транзакции не будут автоматически откатываться. Также,
   если во время нахождения соединения в пуле для процесса изменились
   какие-либо разрешения или уровни доступа, этот факт никак не отразится на
   подключении при его извлечении из пула. Такое поведение может привести к
   нежелательным результатам. Хотя, с другой стороны, название
   <code class="literal">постоянный</code> можно рассматривать, как обещание, что подключение
   и правда останется в том состоянии, в котором оно было помещено в пул.
  </p>
  <p class="para">
   Модуль mysqli поддерживает обе интерпретации термина постоянное соединение:
   состояние соединения может сохраняться, а может и сбрасываться в изначальное.
   По умолчанию при извлечении из пула, соединение сбрасывается. mysqli делает
   это неявным вызовом функции <span class="methodname"><a href="mysqli.change-user.php" class="methodname">mysqli::change_user()</a></span> каждый раз,
   когда подключение используется повторно. С точки зрения пользователя подключение
   выглядит, как только что созданное.
  </p>
  <p class="para">
   Однако, вызов функции <span class="methodname"><a href="mysqli.change-user.php" class="methodname">mysqli::change_user()</a></span> довольно
   дорогостоящая операция. Для улучшения быстродействия можно перекомпилировать
   модуль с установленным флагом
   <strong><code>MYSQLI_NO_CHANGE_USER_ON_PCONNECT</code></strong>.
  </p>
  <p class="para">
   Выбор между безопасным поведением подключений и наилучшим быстродействием
   остаётся за пользователем. Здесь нельзя дать однозначного совета. Для простоты
   использования, по умолчанию включён безопасный режим с очисткой соединений.
  </p>
  <p class="para">
   <strong>Смотрите также</strong>
  </p>
  <p class="para">
   <ul class="simplelist">
    <li><span class="methodname"><a href="mysqli.construct.php" class="methodname">mysqli::__construct()</a></span></li>
    <li><span class="function"><a href="mysqli.init.php" class="function">mysqli_init()</a></span></li>
    <li><span class="methodname"><a href="mysqli.options.php" class="methodname">mysqli::options()</a></span></li>
    <li><span class="methodname"><a href="mysqli.real-connect.php" class="methodname">mysqli::real_connect()</a></span></li>
    <li><span class="methodname"><a href="mysqli.change-user.php" class="methodname">mysqli::change_user()</a></span></li>
    <li><a href="mysqli.get-host-info.php" class="link">$mysqli::host_info</a></li>
    <li><a href="mysqli.configuration.php" class="link">MySQLi Configuration Options</a></li>
    <li><a href="features.persistent-connections.php" class="link">Persistent Database Connections</a></li>
   </ul>
  </p>
 </div><?php manual_footer($setup); ?>