2009-09-23 3 views
11

PHP에서 mysqli 클래스를 사용하는 데 문제가 있으며 어디서나 답변을 찾을 수 없습니다.PHP mysqli 다시 연결 문제

내 스크립트에서는 클래스가 함수 전체에서 사용하는 mysqli 연결을 만듭니다. 그 후에이 스크립트가 실행됩니다. 연결은 아이들도 사용하지만 아이가 죽을 때 부모에게 연결이 끊어지는 문제 (MYSQL Server가 사라짐)에 직면하고 있습니다.

mysql을 mysql으로 바꾸기 전에 mysql_ping을 호출하여 상위 프로세스에서 쿼리를 수행하기 전에 db 연결이 있는지 확인했다. Mysqli는 비슷한 ping 기능을 가지고 있지만 연결이 끊어지면 실제로 다시 연결하지 않습니다. 나는 mysqli.reconnect = ON 전역 설정을 사용하지 않으려 고 노력했다. (php.ini와 ini_set 사용).

php mysql_connect 함수를 사용하면 이미 존재하는 연결을 잡을 수 있으므로 mysqli 대신 mysql을 사용하는 경우 fork 된 프로세스가 끝난 직후 자식에서 연결을 간단히 재사용 할 수있다. 하지만 mysqli는 그런 기능을 갖고 있지 않은 것 같습니다 ...

내가 할 수 있었던 유일한 일은 mysqli-> ping()을 호출하고 false를 반환 한 다음 부모의 데이터베이스에 다시 연결하는 것입니다. 이것은 대단히 비효율적이며, mysqli (그리고 수동 재 연결이 필요 없음)를 사용하여 올바르게 수행하는 방법을 알아내는 편이 낫다.

제안 사항이 있으십니까?

답변

13

mysqli_ping()의 문서는 (php.ini 파일에) 글로벌 옵션 mysqli.reconnect에게 1-를 설정하면이 연결이 사라 졌는지 감지하면 다음 mysqli_ping() 다시 연결 것이라고 말했다.

+3

그게 효과가 있어요. 나는이 변수를 변경하기 위해 ini_set을 사용할 수 없다는 것을 깨닫지 못했고, 나는 천재였습니다. 이미 php.ini에 라인을 추가했는데, 이미 mysli.reconnect = 줄을 더 내려 놓았습니다. 파일. 하지만 그걸 제거하고 mysqli.reconnect를 사용하면 mysqli-> ping()이 mysql_ping과 같이 작동한다. 도와 주셔서 감사합니다! –

-1

사용 http://www.php.net/manual/en/mysqli.real-connect.php ... PHP를 다시 설치하고 php.ini의 설정을 확인

+0

.... php.ini 파일 내에서 일을 한 PHP를 재설치 잔인한 될 것이라고 혼동. 웹에서 기본 php.ini 파일을 찾아 php.ini가 얼마나 변경되었는지 확인하십시오. – Phalgun

0

유 .. 대신 핑의 .. 조금 다른 것을 시도 ("지금은 선택과 같은 정말 간단 낮은 강도 쿼리를 보내려고 수 있습니다) "더 나은 결과를 얻을 수 있는지보십시오.

+0

도움이 될만한 이유는 ... mysql은 u를 활성 사용자로보고 대신 연결하고 리소스를 hogging하는 사용자를 봅니다. my.ini/my.cnf에 일부 시간 제한 설정이 있다고 생각하여 그 동작에 영향을줍니다 .. 당신이 그것에 접근 할 수 있다면, 그것도 들여다 볼 수 있습니다. –

0

영구 연결을 사용할 수 없습니까? 또한 fork()하는 것이 정말로 필요한가요?

-2

mysqli.reconnect를 my.cng에 설정해야한다고 생각합니다. mysqli.reconnect는 php.ini가 아닌 mysql 구성이며, ini_set을 통해 다시 연결을 변경할 수는 없지만 내 sysadmin은 my. cnf.

그래서, 조금 다른 사람들이

+0

사실이 아닙니다. 'my.cnf'는 MySQL 서버에만 관련이 있기 때문에 대개 PHP 클라이언트에는 영향을 미치지 않으며 mysqli는 PHP 내에 만 존재합니다. [mysqli.reconnect] (http://www.php.net/manual/ en/mysqli.configuration.php # ini.mysqli.reconnect) *는 PHP 설정 값입니다. – Synchro

1
function IsConnected() { 
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) { 
     return true; // still have connect 
    } 
    $this->_connectionID = false; 
    return false; // lose connection 
}