깊이 연구:PHP 는 데이터베이스 영구 연결 방식 으로 MySQL 의 시비 조작

PHP 프로그래머 들 은 MySQL 데이터 베 이 스 를 연결 하면 my sql 을 사용 할 수 있다 는 것 을 알 고 있 을 것 이다.pconnect(영구 연결)함 수 는 데이터 베 이 스 를 영구적 으로 연결 하면 효율 을 높 일 수 있 지만 실제 응용 에서 데이터 베 이 스 를 영구적 으로 연결 하 는 데 문제 가 발생 할 수 있 습 니 다.일반적인 표현 은 큰 방 문 량 의 사이트 에서 데이터 라 이브 러 리 를 연결 할 수 없 는 상황 이 자주 발생 하고'Too many connections in...'과 같은 오류 알림 정보 가 발생 하 는 것 입 니 다.서버 를 다시 시작 하 는 것 은 정상 이 었 으 나 잠시 후 같은 고장 이 났 다.이러한 문제 의 발생 원인 에 대해 모든 사람 이 명확 하 게 말 할 수 있 는 것 은 아 닐 것 입 니 다.비록 PHP 문서 에 관련 자료 가 있 지만 설명 이 쉽 지 않 습 니 다.여기 서 저 는 뻔뻔 하 게 간단 한 토론 을 하려 고 합 니 다.상술 한 관점 이 모두 정확 한 것 은 아 닙 니 다.많은 사람들 이 의견 을 피드백 하 는 것 을 환영 합 니 다.
먼저 데이터베이스 영구 연결 의 정 의 를 보십시오.영구 데이터베이스 연결 은 스 크 립 트 가 끝 날 때 닫 지 않 는 연결 을 말 합 니 다.영구적 인 연결 요청 을 받 았 을 때PHP 는 같은 영구 연결 이 존재 하 는 지 확인 합 니 다.존재 한다 면 이 연결 을 직접 사용 합 니 다.존재 하지 않 으 면 새로운 연결 을 만 듭 니 다.'동일'연결 이란 같은 사용자 이름과 비밀번호 로 같은 호스트 에 연결 하 는 것 을 말한다.
PHP 가 영구적 인 연결 방식 으로 MySQL 을 조작 하 는 것 은 전제 가 있 습 니 다.즉,PHP 는 다 중 스 레 드 나 다 중 프로 세 스 웹 서버 의 플러그 인 이나 모듈 로 설치 해 야 합 니 다.가장 흔 한 형식 은 PHP 를 다 중 프로 세 스 아파 치 서버 의 모듈 로 사용 하 는 것 이다.다 중 프로 세 스 서버 의 전형 적 인 특징 은 부모 프로 세 스 와 하위 프로 세 스 가 조 화 롭 게 실행 되 고 있 으 며,실제 웹 페이지 를 만 드 는 것 은 하위 프로 세 스 입 니 다.클 라 이언 트 가 부모 프로 세 스에 요청 할 때마다 이 요청 은 다른 클 라 이언 트 가 요청 하지 않 은 하위 프로 세 스에 전 달 됩 니 다.이것 은 같은 클 라 이언 트 가 두 번 째 로 서버 에 요청 할 때 서로 다른 하위 프로 세 스에 의 해 처 리 될 수 있다 는 것 이다.영구적 인 연결 을 열 면 모든 하위 프로 세 스 가 SQL 서 비 스 를 요청 하 는 후계 페이지 는 이미 만들어 진 SQL 서버 연결 을 다시 사용 할 수 있 습 니 다.모든 하위 프로 세 스 가 한 페이지 를 처리 할 때마다 SQL 서버 에 연결 요청 을 하지 않 고 수명 주기 에 한 번 만 연결 작업 을 할 수 있 도록 합 니 다.모든 하위 프로 세 스 는 서버 에 각각 독립 된 영구 연결 을 만 들 것 입 니 다.PHP 자 체 는 데이터베이스 연결 풀 이라는 개념 이 없 지만 아파 치 는 프로 세 스 풀 이라는 개념 이 있 습 니 다.아파 치 하위 프로 세 스 가 끝나 면 프로 세 스 풀 로 되 돌아 갑 니 다.이것 은 my sql 을 사용 합 니 다.pconnect 에서 열 린 mysql 연결 자원 은 풀 리 지 않 고 아파 치 하위 프로 세 스에 붙 어서 프로 세 스 풀 에 저장 할 수 있 습 니 다.따라서 다음 연결 요청 시 재 활용 할 수 있 습 니 다.모든 것 이 정상 으로 보이 지만 아파 치 의 동시 방문 이 많 을 때 my sql 을 사용 하면pconnect,이전 아파 치 하위 프로 세 스 가 사용 하 던 MySQL 연결 이 close 가 없 기 때문에 MySQL 을 최대 연결 수 에 이 르 게 하여 다음 요청 에 응답 하지 못 할 수도 있 습 니 다.
위의 일부 문 자 는 PHP 문서 에서 발췌 한 것 입 니 다.보기에 약간 어색 하고 이해 하기 어 려 울 것 같 습 니 다.그러면 저 는 백화 로 예 를 들 어 문 제 를 설명 하 겠 습 니 다.
Apache 설정 의 최대 연결 수 는 1000 이 고 MySQL 설정 의 최대 연결 수 는 100 입 니 다.Apache 서버 가 200 개의 동시 방문 을 받 았 을 때 그 중 100 개 는 데이터베이스 접근 과 관련 되 고 나머지 100 개 는 데이터베이스 접근 과 관련 되 지 않 습 니 다.이 럴 때 사용 가능 한 데이터 라 이브 러 리 연결 이 존재 하지 않 기 때 문 입 니 다.따라서 이 안에 데이터 베 이 스 를 방문 하 는 100 개의 동시 다발 이 동시에 100 개의 데이터 베 이 스 를 영구적 으로 연결 하여 데이터 베 이 스 를 최대 로 연결 할 수 있 습 니 다.이런 작업 이 끝나 지 않 았 을 때 그 어떠한 연결 도 데이터 베 이 스 를 연결 할 수 없습니다.이런 작업 이 끝나 면 해당 하 는 연결 은 프로 세 스 풀 에 들 어 갑 니 다.이때 아파 치 의 프로 세 스 풀 에는 200 개의 남 은 하위 프로 세 스 가 있 습 니 다.그 중 100 개 는 데이터베이스 연결 이 있 습 니 다.아파 치 는 액세스 요청 을 위해 무 작위 로 남 은 하위 프로 세 스 를 선택 하기 때문에 받 은 하위 프로 세 스 는 데이터베이스 연결 이 포함 되 지 않 은 100 개 중 하나 일 수 있 습 니 다.데이터베이스 연결 은 최대 치 에 이 르 렀 습 니 다.당신 도 새로운 데이터 베 이 스 를 성공 적 으로 구축 할 수 없습니다.아,당신 은 끊임없이 페이지 를 새로 고 칠 수 밖 에 없습니다.언제 운 이 좋 았 는 지,공교롭게도 데이터 베 이 스 를 연결 하 는 하위 프로 세 스 가 배정 되 어야 페이지 를 정상적으로 조회 할 수 있 습 니 다.만약 에 큰 방 문 량 의 사이트 라면 언제든지 대량의 병발 이 존재 할 수 있 기 때문에 방문 자 들 은 데이터 베 이 스 를 연결 할 수 없 는 현상 을 끊임없이 발견 할 수 있다.
혹시 아파 치 와 MySQL 의 최대 연결 수 를 똑 같이 키 우 면 되 지 않 겠 습 니까?예,이 최대 연결 수 를 합 리 적 으로 조정 하면 어느 정도 에 이 문 제 를 피 할 수 있 습 니 다.그러나 아파 치 와 MySQL 의 부하 능력 은 다 릅 니 다.아파 치 의 부하 능력 에 따라 설정 하면 MySQL 에 있어 이 최대 연결 수 는 비교적 크 고 대량의 MySQL 데이터 베 이 스 를 영구적 으로 연결 할 수 있 습 니 다.예 를 들 어평화 로 운 시대 에 수백 만 명의 군 대 를 먹 여 살 려 야 하 는 것 처럼 씀 씀 이 가 득 보다 실 이 많다.한편,Mysql 의 부하 능력 에 따라 설정 하면 Apache 에 있어 이 최대 연결 수 는 비교적 작고 닭 잡 는 칼 같은 느낌 이 들 어 Apache 의 최대 효율 을 발휘 할 수 없다.
그래서 PHP 매 뉴 얼 에 따 르 면 동시 방문 이 크 지 않 은 사이트 에서 만 데이터 베 이 스 를 영구적 으로 연결 할 수 있 습 니 다.그러나 동시 방문 이 크 지 않 은 사이트 에 있어 데이터 베 이 스 를 사용 하여 영구적 으로 연결 하 는 효율 이 향상 되 는 것 은 큰 의미 가 없 는 것 같 습 니 다.이런 측면 에서 볼 때 저 는 PHP 중의 데이터 베 이 스 를 영구적 으로 연결 하 는 것 은 대체적으로 계 륵 역할 이 라 고 생각 합 니 다.데이터베이스 연결 풀 의 개념 을 사용 해 야 한다 면 sqlrelay 나 Apache 자체 가 제공 하 는 mod 를 시도 해 보 세 요.dbd,깜짝 놀 랄 지도 모른다 고.

좋은 웹페이지 즐겨찾기