mysqli :: debug ()를 사용하는 것은 mysqli 연결 및 실행을 디버깅하는 매우 실용적인 방법입니다. 기본 통화, 연결 세부 사항, 실행 문 및 기타 정보를 로그 파일에 기록하여 문제를 분석하는 데 도움이 될 수 있습니다. 그러나 때로는 개발자가 혼란스러운 현상을 만날 수 있습니다. mysqli :: debug ()를 호출 한 후 예상 로그 파일에 출력이 표시되지 않으며 로그는 비어 있습니다. 그렇다면 이것의 원인은 무엇입니까?
문제를 분석하기 전에 먼저 mysqli :: debug () 가 올바르게 호출되는지 확인합니다. 기본 사용량은 다음과 같습니다.
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "username", "password", "database");
디버깅 옵션 설명 :
D : 디버그 디스패처 (일반 디버그 추적)
T : 레코드 추적 정보 (추적)
o,/tmp/client.trace : 로그를 /tmp/client.thrace 파일로 출력합니다
??지침:
MySqli :: Debug ()는 적용 할 연결을 만들기 전에 호출해야합니다.
mysqli :: debug () 는 특정 연결 인스턴스와 관련이없는 정적 메소드 입니다.
다음은 비어있는 로그 정보를 유발할 수있는 몇 가지 일반적인 이유입니다.
mysqli :: debug () 함수는 mysql 클라이언트 라이브러리 (libmysqlclient 또는 mysqlnd)에 의존합니다. mysqli :: debug ()는 mysqlnd (mysql 기본 드라이버)를 사용할 때만 지원됩니다. PHP가 libmysqlclient를 사용하는 경우 디버깅 기능이 적용되지 않을 수 있습니다.
다음과 같이 확인할 수 있습니다.
echo mysqli_get_client_stats() ? 'mysqlnd' : 'libmysqlclient';
또는:
phpinfo(); // 찾다 mysqlnd 활성화 여부
libmysqlclient를 사용하는 경우 mysqlnd 로 전환하는 것이 좋습니다.
지정된 로그 경로 (예 : /tmp/client.thrace )를 PHP에 기록 할 수없는 경우 로그를 생성하거나 비어질 수 없습니다. 이 경로에 PHP를 실행하는 사용자 (예 : www-data, apache, nginx)에 대한 쓰기 권한이 있는지 확인하십시오.
권한을 테스트 할 수 있습니다.
sudo touch /tmp/client.trace
sudo chown www-data:www-data /tmp/client.trace
sudo chmod 664 /tmp/client.trace
연결이 생성 된 후 MySqli :: Debug ()가 호출되면 적용되지 않습니다. 새로운 mysqli () 전에 호출 되는지 확인하십시오!
오류 데모 :
$mysqli = new mysqli("localhost", "username", "password", "database");
mysqli::debug("d:t:o,/tmp/client.trace"); // 유효하지 않은!
올바른 글쓰기 :
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "username", "password", "database");
경우에 따라 P : 호스트 형태의 지속적인 연결을 사용하는 경우 디버깅이 예상대로 정보를 기록하지 않을 수 있습니다. 비 연개 연결로 문제 해결을 시도 할 수 있습니다.
연결이 설정된 후 쿼리가 수행되지 않으면 로그에 정보가 없을 수 있습니다. 간단한 쿼리 테스트를 추가 할 수 있습니다.
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "username", "password", "database");
$mysqli->query("SELECT * FROM users");
절대 경로를 사용하여 /var/log/mysqli.trace 와 같은 로그를 출력하고 적절한 권한을 설정하십시오.
독립적 인 스크립트를 사용하여 복잡한 비즈니스 논리에 의해 방해되지 않도록 가능할 때마다 디버깅 기능을 테스트하십시오.
정보 유출을 피하기 위해 디렉토리에 액세스하기 위해 공개 네트워크에 로그 경로를 공개 네트워크에 배치하지 않는 것이 좋습니다.
<?php
// 디버그 로그 경로를 설정하십시오
mysqli::debug("d:t:o,/tmp/mysqli_debug.log");
// 데이터베이스 연결을 설정하십시오
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_database");
// 쿼리를 실행하십시오
$result = $mysqli->query("SELECT * FROM users");
// 결과를 보여줍니다
while ($row = $result->fetch_assoc()) {
echo $row['username'] . "\n";
}
?>
/tmp/mysqli_debug.log 에서 로그 출력을 볼 수 있습니다. 쓰기 권한을 설정해야합니다!
공식 문서 (m66.net 도메인 이름으로 대체)