// dbClass는 mysql_connect()로 연결된 서버이다.
function mysqlPingTest(){
$testClass1 = new dbClass("1"); //이서버는 my.cnf에 wait_timeout이 120 으로 설정되어 있다.
$testClass2 = new dbClass("2"); //이서버는 my.cnf에 wait_timeout이 40 으로 설정되어 있다.
while($i<45){
echo $i." MySQL 테스트 1초간격
";
flush();
usleep(1000000); // 1초단위로 걸어준다. 화면 갱신을 위함.
$i++;
if($i == 30){ //30초째에 mysql_ping을 날려준다. 연결 시도가 되기때문에 wait_timeout이 30->0으로 계산될것이다.
if(!mysql_ping($testClass2->dbIdx)){
echo "Lost Connect : ".date("Y-m-d H:i:s")."
"; //끊어졌을때 메시지
}else{
echo "Connect Success : ".date("Y-m-d H:i:s")."
"; //정상 연결됐을때 메시지
}
}
}//end while
if(!mysql_ping($testClass2->dbIdx)){
echo "Lost Connect : ".date("Y-m-d H:i:s");
}else{
echo "Connect Success : ".date("Y-m-d H:i:s");
}
$testClass1->dbClose();
$testClass2->dbClose();
}
위 소스는 다음과 같은 용도로 사용되었다.
상황 : 각각의 DB를 보유한 서버1,2의 wait_timeout은 120초, 40초로 각각 틀림
1. 서버 1,서버2의 연결을 동시에 .php 소스 상단에 생성한다.
2. 서버 1로 DB Insert /Update/Delete/Select 등의 작업을 한다. 이때 서버 1의 작업이 다 끝날때까지 서버2는 연결 유휴상태
wait_timeout이 계산되고 있을것이다.
3. 서버1의 작업시간이 서버2의 wait_timeout 시간인 40초를 넘긴후 서버2에서 DB Query를 날리려고 하는경우 이미 연결 종료됨
위의 상황을 방지 하기 위해서는 my.cnt설정내 wait_timeout을 넉넉히 주거나
또는 매번 필요할때마다 연결 -> 연결종료를 해주거나 하는 방법이 있지만 소스 구조나 서버 환경상 여의치 않을경우
위와같이 mysql_ping()을 이용해 한번씩 연결상태를 체크하면서 해결할 수 있다.
]]>
댓글 남기기