PHP 연결 MySQL은 주로 MySql이 제공하는 libmysqlclient를 사용하는 클라이언트 라이브러리이며, mysql과 mysqli 두 세트의 PHP 확장도 함께 이루어지며, 상대적으로 mysqli가 mysql보다 좋고 안정적입니다.
현재 두 클라이언트 확장 라이브러리 연결 시간 초과는 mysqli와 같은 옵션을 설정할 수 있습니다
<?php
// 개체 만들기
$mysqli = mysqli_init(;)
//시간 초과 옵션 설정
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)
//연결
$mysqli->real_connect('localhost', 'my')_user', 'my_password', 'world';
//시간 초과 또는 기타 연결이 끊긴 하지만인쇄 오류 메시지 실패
if (mysqli_co)nnect_errno()) {
printf("C")Connect failed:%s/n, mysqli_connect_error( ));
exit(;)
}
// 연결 정보 출력 성공
printf ("Conn"ection:%s/n.", $mysqli->host_info);
$mysqli->close();
?>
이것은 연결 시간 초과입니다. 그러나 때때로 우리가 읽기/쓰기 시간 초과를 조회해야 할 때가 있습니다. 예를 들어, 우리는 하나의 데이터베이스에 스트레스를 많이 받거나 많은 연결을 하면 데이터베이스 조회가 느리지만, 나는 일부 중요하지 않은 데이터를 원합니다. 예를 들어, 문장 조회 수처럼 만약 조회가 시간 초과되면 표시되지 않습니다. 적어도 본체 페이지가 올바르게 표시되도록 보장할 수 있습니다. 그러나 PHP 매뉴얼을 검색하면 이 조작 옵션이나 함수를 찾을 수 없습니다.
수첩에는 이렇게 네 가지 옵션밖에 없어요
mysqli의 확장 소스 코드를 추적하면 libmysqlclient의 mysql_options가 호출됩니다
또한 mysqli의 PHP 확장에서는 몇 가지 변수만 도출되었다
libmysqlclient 코드를 대충 읽어보니 읽기/쓰기 시간 초과 설정이 되어있더군요:
php 확장에는 다음이 없을 뿐, 스스로 많은 옵션을 정의하기 때문이다
mysql에서 읽기/쓰기 시간 초과가 어떻게 실현되는지 확인하십시오
이제 거의 결론이 났다.
위에서 살펴본 코드를 보면현재 PHP는 MySQL 조회에 대해 다음과 같은 제한 시간을 초과하고 있습니다.
1. 타임아웃 설정 단위는 초입니다.,최소 1초 설정
2. 하지만 mysql 밑바닥레드는 두 번 다시 시도하기 때문에 실제로는 3초입니다.
두 번 다시 시도 + 혼자 한 번 = 3배 타임아웃.
그러면 최소 타임아웃 시간3초로 이보다 낮지 않아 대부분의 응용 프로그램에서는 허용되지만 작은 응용 프로그램에서는 허용됩니다.최적화가 필요하다.
이제 우리가 만약에타임아웃을 설정할 경우, MYSQL_OPT_READ_TIMEO를 직접 눌러줍니다.UT도 읽고 쓰는 데 시간 초과 효과를 낼 수 있어, 한 단락 써라.코드를 테스트합니다.
<?php
//사용자 정의 읽기 및 쓰기 시간 초과
if (!defined('MYSQL_OPT_READ_TIMEOUT')) {
define('MYSQL_OPT_READ_TIMEOUT', 11);
}
if (!defined('MYSQL_OPT_WRITE_TIMEOUT')) {
define('MYSQL_OPT_WRITE_TIMEOUT', 12);
}
//설정 시간 초과
$mysqli = mysqli_init();
$mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);
//데이터베이스 연결
$mysqli->real_connect("localhost", "root", "root", "test");
if (mysqli_connect_errno()) {
printf("Connect failed: %s/n", mysqli_connect_error());
exit();
}
//쿼리 실행 sleep 1초 동안 시간 초과 안 함
printf("Host information: %s/n", $mysqli->host_info);
if (!($res=$mysqli->query('select sleep(1)'))) {
echo "query1 error: ". $mysqli->error ."/n";
} else {
echo "Query1: query success/n";
}
//쿼리 실행 sleep 9초 동안 시간이 초과됨
if (!($res=$mysqli->query('select sleep(9)'))) {
echo "query2 error: ". $mysqli->error ."/n";
} else {
echo "Query2: query success/n";
}
$mysqli->close();
echo "close mysql connection/n";
?>
위 코드의 실행 결과를 보고, 위의 관점을 확인했습니다. 첫 번째 쿼리는 성공했고, 두 번째 쿼리는 연결이 끊겼습니다
밀리초 단위의 타임아웃과 같이 이 초 단위의 타임아웃을 수정해야 하는 경우, 두 곳만 수정할 수 있습니다.
1. mysqli의 query 코드와 같은 클라이언트 수정, 타이머 삽입,시간을 초과하면 돌아온다
2. Mysql에서 vio 코드를 수정합니다. Mysql의 네트워크 처리 하위 계층은 다음과 같습니다.vio 작업을 거쳤습니다.
MySQL 관련 vio 코드:
폴 타임아웃:
tsockopt 타임아웃:
기본적으로 여기까지만 해도 MySQL에 대한 PHP의 읽기/쓰기 조회 작업 시간 초과 처리를 거의 해결할 수 있어 도움이 되었으면 합니다
'개발 꿀팁 > PHP' 카테고리의 다른 글
Docker의 PHP 설치 방법 (0) | 2022.07.26 |
---|---|
PHP 구현 이분 검색 알고리즘 (0) | 2022.07.26 |
phpset_error_handler() 중요 사용법 (0) | 2022.07.26 |
PHP 배열 필터 null 값 array_filter (0) | 2022.07.26 |
php 조작 redis의 상용 방법은 어떤 것이 있습니까?php조작레디스방법정리(코드첨부) (0) | 2022.07.26 |