Spec-Zone .ru
спецификации, руководства, описания, API

21.9.1.5. Понятия

Copyright 1997-2012 PHP Documentation Group.

Эти понятия являются определенными для драйверов MySQL для PHP.

21.9.1.5.1. Буферизованные и Небуферизованные запросы

Copyright 1997-2012 PHP Documentation Group.

Запросы используют буферизованный режим по умолчанию. Это означает, что результаты запроса были сразу переданы от MySQL Server to PHP в, тогда сохраняется в памяти процесса PHP. Это позволяет дополнительные операции как подсчет числа строк, и перемещения (поиска) текущего указателя результата. Это также позволяет выпускать дальнейшие запросы на том же самом соединении, работая над набором результатов. Нижняя сторона буферизованного режима - то, что большие наборы результатов могли бы потребовать довольно большого количества памяти. Память будет сохранена занятой, пока все ссылки на набор результатов не будут сброшены, или набор результатов был явно освобожден, который автоматически произойдет во время конца запроса последнее. Терминология "результат хранилища" также используется для буферизованного режима, поскольку целый набор результатов сохранен сразу.

Отметить

При использовании libmysqlclient, поскольку библиотека предел памяти PHP не будет считать память используемой для наборов результатов, если данные не будут выбраны в переменные PHP. С mysqlnd учтенная память будет включать полный набор результатов.

Небуферизованные запросы MySQL выполняют запрос и затем возвращают ресурс, в то время как данные все еще ожидают на сервере MySQL того, что были выбраны. Это использует меньше памяти на PHP-стороне, но может увеличить загрузку на сервере. Если полный набор результатов не был выбран от сервера, никакие дальнейшие запросы не могут быть отправлены по тому же самому соединению. Небуферизованные запросы могут также упоминаться как "результат использования".

После этих характеристик буферизованные запросы должны использоваться в случаях, где Вы ожидаете только ограниченный набор результатов или должны знать количество возвращенных строк прежде, чем считать все строки. Небуферизованный режим должен использоваться, когда Вы ожидаете большие результаты.

Поскольку буферизованные запросы являются значением по умолчанию, примеры ниже будут демонстрировать, как выполнить небуферизованные запросы с каждым API.

Пример 21.15. Небуферизованный пример запроса: mysqli

<?php$mysqli  = new mysqli("localhost", "my_user", "my_password", "world");$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);if ($uresult) {   while ($row = $uresult->fetch_assoc()) {       echo $row['Name'] . PHP_EOL;   }}$uresult->close();?>

Пример 21.16. Небуферизованный пример запроса: pdo_mysql

<?php$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);$uresult = $pdo->query("SELECT Name FROM City");if ($uresult) {   while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {       echo $row['Name'] . PHP_EOL;   }}?>

Пример 21.17. Небуферизованный пример запроса: mysql

<?php$conn = mysql_connect("localhost", "my_user", "my_pass");$db   = mysql_select_db("world");$uresult = mysql_unbuffered_query("SELECT Name FROM City");if ($uresult) {   while ($row = mysql_fetch_assoc($uresult)) {       echo $row['Name'] . PHP_EOL;   }}?>

21.9.1.5.2. Наборы символов

Copyright 1997-2012 PHP Documentation Group.

Идеально надлежащий набор символов будет установлен на уровне сервера, и выполнение этого описывается в пределах раздела Конфигурации Набора символов руководства MySQL Server. Альтернативно, каждый API MySQL предлагает метод, чтобы установить набор символов во времени выполнения.

Набор символов и символьный выход

Набор символов должен быть понят и определен, поскольку он имеет влияние на каждом действии, и включает импликации безопасности. Например, механизм выхода (например, mysqli_real_escape_string для mysqli, mysql_real_escape_string для mysql, и PDO::quote для PDO_MySQL), будет придерживаться этой установки. Важно понять, что эти функции не будут использовать набор символов, который определяется с помощью запроса, таким образом, например следующее не будет иметь эффекта на них:

Пример 21.18. Проблемы с установкой набора символов с SQL

<?php$mysqli = new mysqli("localhost", "my_user", "my_password", "world");// Will not affect $mysqli->real_escape_string();$mysqli->query("SET NAMES utf8");// Will not affect $mysqli->real_escape_string();$mysqli->query("SET CHARACTER SET utf8");// But, this will affect $mysqli->real_escape_string();$mysqli->set_charset('utf8');?>

Ниже примеры, которые демонстрируют, как должным образом изменить набор символов во времени выполнения, используя каждый каждый API.

Пример 21.19. Подавание примера набора символов: mysqli

<?php$mysqli = new mysqli("localhost", "my_user", "my_password", "world");if (!$mysqli->set_charset('utf8')) {    printf("Error loading character set utf8: %s\n", $mysqli->error);} else {    printf("Current character set: %s\n", $mysqli->character_set_name());}print_r( $mysqli->get_charset() );?>

Пример 21.20. Установка набора символов example:pdo_mysql

Отметьте: Это только работает с PHP 5.3.6.

<?php$pdo = new PDO("mysql:host=localhost;dbname=world;charset=utf8", 'my_user', 'my_pass');?>

Пример 21.21. Подавание примера набора символов: mysql

<?php$conn = mysql_connect("localhost", "my_user", "my_pass");$db   = mysql_select_db("world");if (!mysql_set_charset('utf8', $conn)) {    echo "Error: Unable to set the character set.\n";    exit;}echo 'Your current character set is: ' .  mysql_client_encoding($conn);?>