MySQLi 연결
MySQL 서버는 연결을 위해 다른 전송 계층의 사용을 지원합니다. 연결은 TCP/IP, Unix 도메인 소켓 또는 Windows 명명된 파이프를 사용합니다.
호스트 이름 localhost
에는 특별한 의미가 있습니다. Unix 도메인 소켓을 사용해야 합니다. localhost에 대한 TCP/IP 연결을 열려면 호스트 이름 localhost
대신 127.0.0.1
을 사용해야 합니다.
예제 #1 localhost의 특별한 의미
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
echo $mysqli->host_info . "\n";
$mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);
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
그런 다음 결과 매개변수 값이 확장에서 사용하는 클라이언트 라이브러리로 전달됩니다. 클라이언트 라이브러리가 비어 있거나 설정되지 않은 매개변수를 감지하면 라이브러리 기본 제공 값이 기본값일 수 있습니다.
기본 제공 연결 라이브러리 기본값
호스트 값이 설정되지 않았거나 비어 있으면 클라이언트 라이브러리는 기본적으로 localhost
의 Unix 소켓 연결로 설정됩니다. 소켓이 설정되지 않았거나 비어 있고 Unix 소켓 연결이 요청되면 /tmp/mysql.sock의 기본 소켓에 대한 연결이 시도됩니다.
Windows 시스템에서 호스트 이름 . 클라이언트 라이브러리는 Windows 명명된 파이프 기반 연결을 열려는 시도로 해석합니다. 이 경우 socket 매개변수는 파이프 이름으로 해석됩니다. 지정되지 않았거나 비어 있으면 소켓(파이프 이름)의 기본값은 \\.\pipe\MySQL
입니다.
Windows 명명된 파이프 기반 연결이 아닌 Unix 도메인 소켓 기반 연결이 설정되지 않고 포트 매개변수 값이 설정되지 않은 경우 라이브러리는 기본적으로 포트 3306
으로 설정됩니다.
mysqlnd 라이브러리와 MySQL 클라이언트 라이브러리(libmysqlclient)는 기본값을 결정하기 위해 동일한 논리를 구현합니다.
연결 옵션
연결 옵션은 예를 들어 연결 시 실행되는 초기화 명령을 설정하거나 특정 문자 집합의 사용을 요청하는 데 사용할 수 있습니다. 네트워크 연결을 설정하기 전에 연결 옵션을 설정해야 합니다.
연결 옵션을 설정하려면 연결 작업을 mysqli_init() 또는 mysqli::__construct()로 연결 핸들 생성, mysqli::options()를 사용하여 요청된 옵션 설정, 네트워크 연결 설정의 세 단계로 수행해야 합니다. mysqli::real_connect()로.
Connection pooling
mysqli 확장은 특별한 종류의 풀링된 연결인 영구 데이터베이스 연결을 지원합니다. 기본적으로 스크립트에 의해 열린 모든 데이터베이스 연결은 런타임 중에 사용자가 명시적으로 닫거나 스크립트가 끝날 때 자동으로 해제됩니다. 지속적인 연결은 그렇지 않습니다. 대신 동일한 사용자 이름, 암호, 소켓, 포트 및 기본 데이터베이스를 사용하는 동일한 서버에 대한 연결이 열리면 나중에 재사용할 수 있도록 풀에 넣습니다. 재사용은 연결 오버헤드를 절약합니다.
모든 PHP 프로세스는 자체 mysqli 연결 풀을 사용합니다. 웹 서버 배포 모델에 따라 PHP 프로세스는 하나 이상의 요청을 처리할 수 있습니다. 따라서 풀링된 연결은 이후에 하나 이상의 스크립트에서 사용될 수 있습니다.
Persistent connection
호스트, 사용자 이름, 암호, 소켓, 포트 및 기본 데이터베이스의 주어진 조합에 대해 사용되지 않은 영구 연결을 연결 풀에서 찾을 수 없으면 mysqli는 새 연결을 엽니다. 영구 연결의 사용은 PHP 지시문 mysqli.allow_persistent를 사용하여 활성화 및 비활성화할 수 있습니다. 스크립트에 의해 열린 총 연결 수는 mysqli.max_links로 제한될 수 있습니다. PHP 프로세스당 최대 영구 연결 수는 mysqli.max_persistent로 제한할 수 있습니다. 웹 서버는 많은 PHP 프로세스를 생성할 수 있습니다.
영구 연결에 대한 일반적인 불만은 재사용 전에 상태가 재설정되지 않는다는 것입니다. 예를 들어 미결 트랜잭션과 완료되지 않은 트랜잭션은 자동으로 롤백되지 않습니다. 그러나 연결을 풀에 넣은 후 재사용하는 사이에 발생한 권한 부여 변경 사항도 반영되지 않습니다. 이것은 원치 않는 부작용으로 볼 수 있습니다. 반대로 persistent
라는 이름은 상태가 지속된다는 약속으로 이해될 수 있습니다.
mysqli 확장은 지속 연결에 대한 두 가지 해석을 모두 지원합니다. 즉, 지속 상태와 재사용 전 상태 재설정입니다. 기본값은 재설정입니다. 영구 연결이 재사용되기 전에 mysqli 확장은 암시적으로 mysqli::change_user()를 호출하여 상태를 재설정합니다. 영구 연결은 사용자에게 방금 열린 것처럼 나타납니다. 이전 사용의 아티팩트가 표시되지 않습니다.
mysqli::change_user() 호출은 비용이 많이 드는 작업입니다. 최상의 성능을 위해 사용자는 컴파일 플래그 MYSQLI_NO_CHANGE_USER_ON_PCONNECT
를 설정하여 확장을 다시 컴파일할 수 있습니다.
안전한 행동과 최상의 성능 사이에서 선택하는 것은 사용자의 몫입니다. 둘 다 유효한 최적화 목표입니다. 사용 편의성을 위해 최대 성능을 희생하면서 안전한 동작을 기본값으로 설정했습니다.