상세 PHP의 데이터베이스 연결 지속성

PHP의 데이터베이스 연결 지속성


데이터베이스의 최적화는 우리가 웹 개발을 하는 가장 중요한 부분이다. 심지어 많은 상황에서 사실 우리는 데이터베이스를 대상으로 프로그래밍을 하고 있다.물론 사용자의 모든 조작, 행위는 데이터의 형식으로 저장된다.그 중에서 데이터베이스 연결 생성 과정에 최적화할 수 있는 내용이 있습니까?답은 당연히 있다. 자바 등 언어에는 연결 탱크의 설정이 있는데 PHP는 일반 개발에서 연결 탱크라는 것이 없고 다중 스레드와 관련된 상황에서 연결 탱크의 기술을 사용하기 때문에 PHP가 실행될 때마다 새로운 연결을 만든다. 그러면 이런 상황에서 우리는 어떻게 데이터 연결을 최적화할 수 있을까?

데이터베이스 연결 지속화


먼저 데이터베이스 연결의 지속화에 대한 정의를 봅시다.
지속적인 데이터베이스 연결은 스크립트가 끝날 때 닫지 않는 연결을 가리킨다.지속적인 연결 요청을 받았을 때.PHP는 동일한 영구 연결이 이미 있는지 확인합니다.존재하면 이 연결을 직접 사용합니다.존재하지 않으면 새 연결을 만듭니다."같은"접속이란 동일한 사용자 이름과 비밀번호로 같은 호스트에 접속하는 것을 가리킨다.
웹 서버의 작업과 분포 부하를 완전히 이해하지 못한 독자들은 지속적인 연결의 작용을 잘못 이해할 수 있습니다.특히 지속적인 연결은 같은 연결에서'사용자 세션'을 구축하는 능력을 제공하지 않을 뿐만 아니라 업무를 효과적으로 구축하는 능력도 제공하지 않는다.실제로 엄격한 의미에서 볼 때 지속적인 연결은 비지속적인 연결이 제공할 수 없는 특수한 기능을 제공하지 않는다.
이것이 바로 PHP의 연결 지속화이지만, 지속 연결은 비지속 연결이 제공할 수 없는 특수한 기능을 제공하지 않는다고 지적했다.이것은 매우 의심스럽다. 이 방안이 성능 향상을 가져올 수 있다고 약속하지 않았느냐?

연결이 오래 지속되면 무슨 소용이 있습니까?


맞아요. 상기 정의에서 지적한 특수한 기능을 보면 지구화 연결은 확실히 새로운 기능이나 더 높은 기능을 가져오지 않았지만 가장 큰 용도는 바로 효율을 향상시키는 것입니다. 즉, 성능이 향상시키는 것입니다.
웹 서버가 SQL 서버에 생성하는 연결 비용(Overhead)이 비교적 높을 때(예를 들어 시간이 오래 걸리고 임시 메모리가 많이 소모될 때) 지속적인 연결은 더욱 효율적이다.
즉, 연결 비용이 높을 때 데이터베이스 연결을 만드는 비용도 커지고 시간도 길어진다.지속적인 연결을 사용하면 모든 하위 프로세스가 하나의 페이지를 처리할 때마다 SQL 서버에 연결 요청을 하지 않고 라이프 사이클에 한 번만 연결할 수 있습니다.즉, 모든 하위 프로세스는 서버에 대해 독립된 지속적인 연결을 구축할 것이다.
예를 들어 20개의 서로 다른 하위 프로세스가 스크립트를 실행하여 지속적인 SQL 서버의 지속적인 연결을 구축한다면 실제적으로 이 SQL 서버에 20개의 다른 지속적인 연결을 구축하여 각 프로세스가 하나를 차지한다.

효율성 비교


말이 많지 않으니 우리는 직접 코드를 통해 비교한다.우선, 우리는 현재의 밀리초 시간을 되돌려주는 통계 함수를 정의했다.또한 우리는 데이터의 연결 파라미터를 준비해야 한다.

function getmicrotime()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float) $usec + (float) $sec);
}

$db = [
    'server' => 'localhost:3306',
    'user' => 'root',
    'password' => '',
    'database' => 'blog_test',
];
다음은 일반적인 mysqli를 사용하여 테스트를 진행합니다.

$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $mysqli = new mysqli($db["server"], $db["user"], $db["password"], $db["database"]); // 
    $mysqli->close();
}
echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL;
// 6.5814000000
1000번의 순환으로 데이터베이스 연결을 만드는 과정에서 우리는 6초여의 시간을 소모했다.다음에 우리는 이 1000번의 데이터베이스 연결을 영구적으로 만드는 방식을 사용한다.mysqli의 $host 매개 변수 앞에 p: 하나만 추가하면 됩니다.

$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $mysqli = new mysqli('p:' . $db["server"], $db["user"], $db["password"], $db["database"]); // 
    $mysqli->close();
}
echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL;
// 0.0965000000
mysqli의 연결을 보면 효율 향상이 매우 뚜렷하다.물론 PDO 방식의 데이터베이스 연결도 지속적인 연결을 만드는 속성을 제공한다.

$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $pdo = new PDO("mysql:dbname={$db['database']};host={$db['server']}", $db['user'], $db['password']);
}
echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL;
// 6.6171000000

$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $pdo = new PDO("mysql:dbname={$db['database']};host={$db['server']}", $db['user'], $db['password'], [PDO::ATTR_PERSISTENT => true]); // 
}
echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL;
// 0.0398000000
PDO 방식으로 연결할 때 PDO::ATTR_PERSISTENT 매개변수를 true로 설정합니다.이렇게 하면 PDO가 구축한 연결도 지속적인 연결이 된다.

주의하다


데이터베이스의 지속화 연결이 이렇게 강력한데 왜 기본적으로 이런 지속화 연결 형식이 아니라 우리가 수동으로 파라미터를 늘려서 실현해야 합니까?PHP 개발자들은 당연히 걱정이 있지.
만약 지속적인 연결의 하위 프로세스 수가 설정된 데이터베이스 연결 수 제한을 초과하면 시스템에 문제가 발생할 것이다.데이터베이스의 동시 연결 수가 16으로 제한되어 있고 바쁜 세션 상황에서 17개의 스레드가 연결을 시도하면 하나의 스레드가 연결할 수 없습니다.만약 이때 스크립트에서 연결을 닫을 수 없는 오류 (예를 들어 무한순환) 가 발생하면 이 데이터베이스의 16개의 연결은 신속하게 영향을 받을 것이다.
시계 자물쇠와 사무에도 주의해야 할 점이 있다.
영구 연결에서 데이터 테이블 자물쇠를 사용할 때, 스크립트가 어떤 이유로든 이 데이터 테이블 자물쇠를 방출할 수 없다면, 그 다음에 같은 연결을 사용하는 스크립트는 영구적으로 막혀서 httpd 서비스나 데이터베이스 서비스를 다시 시작해야 합니다
사무 처리를 사용할 때, 만약 스크립트가 사무 차단이 발생하기 전에 끝난다면, 이 차단은 같은 연결을 사용하는 다음 스크립트에도 영향을 줄 것이다
따라서 시계 자물쇠와 사무를 사용하는 상황에서 지속적인 데이터베이스 연결을 사용하지 않는 것이 좋다.그러나 다행히도 지속적인 연결과 일반적인 연결은 언제든지 교환할 수 있다. 우리는 두 가지 연결 형식을 정의하고 서로 다른 상황에서 서로 다른 연결을 사용하면 유사한 문제를 해결할 수 있다.

총결산


사물은 항상 양면성이 있기 때문에 지속적인 연결은 한편으로는 효율의 향상을 가져왔지만 다른 한편으로는 업무 논리상의 문제를 가져올 수도 있다. 그리고 이런 문제는 지속적인 연결의 메커니즘을 이해하지 못하는 상황에서 조사하기 매우 어렵다.따라서 일상적인 개발에서 우리는 반드시 관련 기능 특성을 이해하는 상황에서 적합한 방식을 선택하여 필요한 기능 개발을 완성해야 한다.
테스트 코드:
github.com/zhangyue050…
이상은 PHP의 데이터베이스 연결 지속화에 대한 상세한 내용입니다. PHP 데이터베이스 연결 지속화에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기