1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// 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초간격<br />"; 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")."<br />"; //끊어졌을때 메시지 }else{ echo "Connect Success : ".date("Y-m-d H:i:s")."<br />"; //정상 연결됐을때 메시지 } } }//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()을 이용해 한번씩 연결상태를 체크하면서 해결할 수 있다.
]]>
댓글 남기기