ScotlandPHP

Соединения

Сервер MySQL поддерживает различные способы передачи данных. Соединения могут использовать TCP/IP протоколы, сокеты Unix доменов или именованные пайпы Windows.

Имя хоста localhost имеет специальное назначение. Оно используется только в сокетах Unix доменов. Невозможно открыть TCP/IP соединение, используя в качестве имени хоста localhost. Вместо него нужно задать 127.0.0.1.

Пример #1 Специальное назначение localhost

<?php
$mysqli 
= new mysqli("localhost""user""password""database");
if (
$mysqli->connect_errno) {
    echo 
"Не удалось подключиться к MySQL: (" $mysqli->connect_errno ") " $mysqli->connect_error;
}
echo 
$mysqli->host_info "\n";

$mysqli = new mysqli("127.0.0.1""user""password""database"3306);
if (
$mysqli->connect_errno) {
    echo 
"Не удалось подключиться к MySQL: (" $mysqli->connect_errno ") " $mysqli->connect_error;
}

echo 
$mysqli->host_info "\n";
?>

Результат выполнения данного примера:

Localhost via UNIX socket
127.0.0.1 via TCP/IP

Умолчания для параметров соединений

В зависимости от функции, осуществляющей подключение, какие-то параметры можно не задавать. Если параметр не задан, расширение попытается использовать значение по умолчанию для этого параметра, которое задано в конфигурационном файле PHP.

Пример #2 Задание значений по умолчанию

mysqli.default_host=192.168.2.27
mysqli.default_user=root
mysqli.default_pw=""
mysqli.default_port=3306
mysqli.default_socket=/tmp/mysql.sock

Далее, чтобы установить соединение, функция передает параметры в клиентскую библиотеку, которой пользуется расширение. Если библиотека обнаружит пустые или отсутствующие параметры, она может подставить вместо них свои встроенные значения по умолчанию.

Встроенные библиотечные умолчания для параметров соединения

Если имя хоста не задано или передана пустая строка, клиентская библиотека использует для подключения к Unix сокету хоста localhost. Если сокет не задан или передана пустая строка, и при этом запрошено подключение к Unix сокету, библиотека попытается подключиться к сокету /tmp/mysql.sock.

В Windows системах, если в качестве имени хоста передается ., библиотека попытается открыть соединение на основе именованного пайпа. В этом случае имя сокета будет воспринято, как имя пайпа. Если имя сокета не задано, то будет использовано значение \\.\pipe\MySQL.

Если соединение не использует ни сокет Unix домена, ни именованный пайп Windows, и при этом не задан порт для подключения, библиотека использует номер порта 3306.

В драйвере mysqlnd и Клиентской библиотеке MySQL (libmysqlclient) заложена та же логика определения умолчаний.

Настройки соединения

Настройки соединения позволяют, например, задать какие-то команды, которые нужно выполнить сразу после подключения, или отдать распоряжение использовать определенный набор символов. Настройки должны быть заданы до подключения к серверу.

Когда требуется задать настройки соединения, операция подключения выполняется в три этапа: функцией mysqli_init() создается дескриптор подключения, затем подключение настраивается с помощью функции mysqli_options(), и наконец устанавливается сетевое соединение с сервером посредством функции mysqli_real_connect().

Объединение подключений в пул

Расширение mysqli поддерживает постоянные соединения с базой данных, которые представляют из себя специальный вид объединяемых соединений. По умолчанию, каждое открытое скриптом соединение закрывается либо самим скриптом в ходе выполнения, либо автоматически по завершении работы скрипта. Постоянные соединения отличаются тем, что не закрываются, а помещаются в пул для повторного использования в дальнейшем. Если требуется подключиться к тому же серверу и базе данных, с тем же именем пользователя, паролем, сокетом и портом, то вместо создания нового подключения из пула извлекается уже существующее. Повторное использование подключений позволяет избежать накладных расходов на создание новых соединений.

Каждый PHP процесс использует свой пул подключений mysqli. В зависимости от конфигурации веб-сервера, PHP процесс может обслуживать один или несколько запросов. Соответственно, соединение из пула могут последовательно использовать несколько скриптов.

Постоянное соединение

Новое подключение создается, только если в пуле не найдется свободного подключения с теми же данными хоста, имени пользователя, пароля, сокета, порта и базы данных по умолчанию. Механизм постоянных соединений можно включать и выключать PHP директивой mysqli.allow_persistent. Максимальное количество соединений, которые может открыть скрипт, ограничено значением mysqli.max_links. Максимальное количество соединений, которые может открыть один PHP процесс, ограничено значением mysqli.max_persistent. Следует заметить, что веб-сервер может порождать множество PHP процессов.

Главный недостаток постоянных подключений заключается в том, что перед повторным использованием их состояние не сбрасывается к изначальному. Например, открытые и незавершенные транзакции не будут автоматически откатываться. Также, если во время нахождения соединения в пуле для процесса изменились какие-либо разрешения или уровни доступа, этот факт никак не отразится на подключении при его извлечении из пула. Такое поведение может привести к нежелательным результатам. Хотя, с другой стороны, название постоянный можно рассматривать, как обещание, что подключение и правда останется в том состоянии, в котором оно было помещено в пул.

Расширение mysqli поддерживает обе интерпретации термина постоянное соединение: состояние соединения может сохраняться, а может и сбрасываться в изначальное. По умолчанию, при извлечении из пула соединение сбрасывается. mysqli делает это неявным вызовом функции mysqli_change_user() каждый раз, когда подключение используется повторно. С точки зрения пользователя подключение выглядит, как только что созданное.

Однако, вызов функции mysqli_change_user() довольно дорогостоящая операция. Для улучшения быстродействия можно перекомпилировать расширение с установленным флагом MYSQLI_NO_CHANGE_USER_ON_PCONNECT.

Выбор между безопасным поведением подключений и наилучшим быстродействием остается за пользователем. Здесь нельзя дать однозначного совета. Для простоты использования, по умолчанию включен безопасный режим с очисткой соединений.

См. также

add a note add a note

User Contributed Notes 3 notes

up
10
Roman G
1 year ago
To avoid problems with the display of international characters is necessary to determine the encoding:
$mysqli->set_charset('utf8');
up
-7
Spedisci at gmail dot com
11 months ago
Localhost may require a dns/hosts query, 127.0.0.1 is a Tcp/IP default. I mean no resolution = less delay.
up
-24
german dot bernhardt at gmail dot com
1 year ago
Terrible difference in runtime

$session=mysqli_connect('127.0.0.1','root','','testing');
> response: 13ms

$session=mysqli_connect('localhost','root','','testing');
> response: 1,03s

because such a difference just by changing 127.0.0.1 to localhost?
I think that something is wrong in resolving domains but not in that library php...
To Top