<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/mysqlinfo.concepts.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'mysqlinfo.concepts.buffering.php',
    1 => 'Буферизированные и небуферизированные запросы',
    2 => 'Буферизированные и небуферизированные запросы',
  ),
  'up' => 
  array (
    0 => 'mysqlinfo.concepts.php',
    1 => 'Основные понятия',
  ),
  'prev' => 
  array (
    0 => 'mysqlinfo.concepts.php',
    1 => 'Основные понятия',
  ),
  'next' => 
  array (
    0 => 'mysqlinfo.concepts.charset.php',
    1 => 'Кодировки символов',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/mysqlinfo/concepts.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqlinfo.concepts.buffering" class="section">
  <h2 class="title">Буферизированные и небуферизированные запросы</h2>

  <p class="simpara">
   По умолчанию запросы используют режим буферизации. Это значит, что результаты запроса
   немедленно поступают от сервера MySQL к PHP и сохраняются в памяти PHP-процесса. Это позволяет
   делать дополнительные операции, такие как подсчёт количества строк и перемещение (поиск) текущего
   указателя результата. Это также даёт возможность выполнять новые
   запросы в том же соединении во время работы над результатом последнего запроса.
   Недостаток режима буферизации является то, что большие наборы результатов могут потребовать
   довольно много количество оперативной памяти.
   Память остаётся занятой до тех пор, пока все указатели на результирующий набор не будут
   удалены или результирующий набор не будет явно освобождён, что автоматически происходит
   во время окончания последнего запроса.
   Термин &quot;результат сохранения&quot; (&quot;store result&quot;) также используется для режима буферизации,
   так как весь результирующий набор сохраняется сразу.
  </p>

  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    При использовании libmysqlclient в качестве библиотеки ограничение памяти PHP
    не будет учитывать память используемую для результирующих наборов, если
    данные не будут сохранены в переменные PHP.
    С mysqlnd учёт памяти также будет включать в себя размер результирующего набора.
   </span>
  </p></blockquote>

  <p class="simpara">
   Небуферизованные MySQL запросы выполняются, а затем ожидают получения
   данных с сервера MySQL. Это использует меньше памяти
   на стороне PHP, но может увеличить нагрузку на сервер. Пока полный результирующий набор
   не будет передан с сервера, никакие дальнейшие запросы не могут быть отправлены через это же
   соединение. Небуферизированные запросы также могут быть отложены как &quot;use result&quot;.
   Когда все строки из набора результатов извлечены, набор результатов исчезает
   и его нельзя повторно итерировать.
  </p>

  <p class="simpara">
   Исходя из этих характеристик, небуферизированные запросы следует использовать только в тех случаях,
   когда ожидается большой набор результатов, который будет обрабатываться последовательно.
   Небуферизованные запросы содержат ряд подводных камней, что усложняет их использование,
   например, количество строк в наборе результатов неизвестно до тех пор,
   пока не будет извлечена последняя строка.
   Буферизованные запросы - более простой и гибкий способ обработки наборов результатов.
  </p>

  <p class="simpara">
   Поскольку буферизированные запросы применяются по умолчанию, следующие примеры продемонстрируют
   как выполнить небуферизированные запросы в каждом из API
  </p>

  <div class="example" id="example-1">
   <p><strong>Пример #1 Пример небуферизированного запроса: mysqli</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$mysqli  </span><span style="color: #007700">= new </span><span style="color: #0000BB">mysqli</span><span style="color: #007700">(</span><span style="color: #DD0000">"localhost"</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_user"</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_password"</span><span style="color: #007700">, </span><span style="color: #DD0000">"world"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$unbufferedResult </span><span style="color: #007700">= </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"SELECT Name FROM City"</span><span style="color: #007700">, </span><span style="color: #0000BB">MYSQLI_USE_RESULT</span><span style="color: #007700">);<br /><br />foreach (</span><span style="color: #0000BB">$unbufferedResult </span><span style="color: #007700">as </span><span style="color: #0000BB">$row</span><span style="color: #007700">) {<br />    echo </span><span style="color: #0000BB">$row</span><span style="color: #007700">[</span><span style="color: #DD0000">'Name'</span><span style="color: #007700">] . </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <div class="example" id="example-2">
   <p><strong>Пример #2 Пример небуферизированного запроса: pdo_mysql</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$pdo </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">"mysql:host=localhost;dbname=world"</span><span style="color: #007700">, </span><span style="color: #DD0000">'my_user'</span><span style="color: #007700">, </span><span style="color: #DD0000">'my_password'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$pdo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setAttribute</span><span style="color: #007700">(</span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">MYSQL_ATTR_USE_BUFFERED_QUERY</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$unbufferedResult </span><span style="color: #007700">= </span><span style="color: #0000BB">$pdo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"SELECT Name FROM City"</span><span style="color: #007700">);<br />foreach (</span><span style="color: #0000BB">$unbufferedResult </span><span style="color: #007700">as </span><span style="color: #0000BB">$row</span><span style="color: #007700">) {<br />    echo </span><span style="color: #0000BB">$row</span><span style="color: #007700">[</span><span style="color: #DD0000">'Name'</span><span style="color: #007700">] . </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div><?php manual_footer($setup); ?>