이 기사의 예에서는 PHP에서 mysql 작업 버퍼를 사용하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
php를 mysql, mysql, mysqli, pdo에 연결하는 방법은 세 가지가 있습니다. 어떤 방법을 사용하여 연결하더라도 버퍼를 사용하는 것과 버퍼를 사용하지 않는 것에는 차이가 있습니다.
버퍼를 사용하고 버퍼를 사용하지 않는다는 것은 무엇을 의미하나요?
클라이언트는 mysql 서버로 쿼리 작업을 수행합니다. 쿼리 작업 중에 얻은 데이터의 양이 상대적으로 많은 경우 쿼리 결과를 어디에 배치해야 합니까?
넣는 위치는 클라이언트 버퍼와 서버 버퍼 두 군데입니다.
여기서 말하는 버퍼는 클라이언트의 버퍼를 의미합니다. 쿼리 결과가 서버에서 얻어져 클라이언트의 버퍼에 배치되면 버퍼를 사용하여 호출합니다. 아직 서버 측의 버퍼에 저장되어 있는 경우에는 버퍼(unbuffer)를 사용하지 않는다고 합니다.
버퍼를 사용하는 것과 사용하지 않는 것의 차이점은 무엇인가요?
주로 메모리 측면에서 버퍼를 사용하면 클라이언트의 메모리 압박이 증가합니다. 반환된 데이터 결과가 특히 클 경우 클라이언트를 호출하는 비교적 큰 프로세스(실제로는 PHP 프로세스)를 차지할 수 있습니다. 버퍼를 사용하지 않으면 자연스럽게 서버에 더 많은 부담이 가해집니다(여기서는 mysql 서비스를 제공하는 서버에 대해 이야기하고 있습니다).
자세한 내용은 MySQL 대용량 데이터를 쿼리하는 PHP의 메모리 사용량 분석을 참조하세요
php의 3가지 모드에서 버퍼 사용 여부를 어떻게 설정하나요?
mysql의 기본 쿼리는 버퍼를 사용합니다. 버퍼를 사용하지 않는 경우에는 mysql_unbuffer_query를 사용해야 합니다
mysqli의 기본 쿼리는 버퍼를 사용하지 않습니다. 버퍼를 사용하려면 MYSQLI_STORE_RESULT를 설정해야 합니다.
pdo의 기본 쿼리는 버퍼를 사용하지 않습니다. 버퍼를 사용하려면 MYSQL_ATTR_USE_BUFFERED_QUERY를 설정해야 합니다.
관련 코드는 대략 다음과 같습니다.
<?php $dbConfig = array( 'host' => '10.128.11.101', 'port' => '3306', 'user' => 'test', 'pass' => 'test', 'db' => 'test', ); $sql = 'select * from so_topic_app'; //---------mysql----------// $db = mysql_connect($dbConfig['host'], $dbConfig['user'], $dbConfig['pass']); mysql_select_db($dbConfig['db'], $db); mysql_set_charset('utf8', $db); // mysql使用buffer $res = mysql_query($sql, $db); $data = array(); while($row = mysql_fetch_row($res)) { $data[] = $row; } // mysql不使用buffer $res = mysql_unbuffered_query($sql, $db); $data = array(); while($row = mysql_fetch_row($res)) { $data[] = $row; } mysql_close($db); //---------mysqli----------// $db = mysqli_connect($dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['db']); // mysqli不使用buffer $result = mysqli_query($db, $sql); $data = array(); while($row = $result->fetch_array()) { $data[] = $row; } // mysqli使用buffer $result = mysqli_query($db, $sql, MYSQLI_STORE_RESULT); $data = array(); while($row = $result->fetch_array()) { $data[] = $row; } mysqli_free_result($result); mysqli_close($db); //---------pdo----------// $dsn = "mysql:dbname={$dbConfig['db']};host={$dbConfig['host']}"; $pdo = new PDO($dsn, $dbConfig['user'], $dbConfig['pass']); // pdo不使用buffer $stmt = $pdo->prepare($sql); $stmt->execute(); $data = array(); $data = $stmt->fetchAll(); // pdo使用buffer $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $stmt = $pdo->prepare($sql); $stmt->execute(); $data = array(); $data = $stmt->fetchAll();
후속 조치
물론 데이터의 양이 매우 클 경우 대부분의 사람들은 여전히 배치 사용을 고려하여 데이터를 추출하고 처리할 것입니다. 따라서 실제로 버퍼 사용 여부에 관계없이 mysql에 주의를 기울이고 사용해야 하는 시나리오는 거의 없습니다.
이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.