Расширить mysqli_result — Использует ли он store_result () или use_result ()

Я написал дочерний элемент mysqli с методом запроса, который возвращает дочерний элемент mysqli_result. Этот результат ребенок будет иметь дополнительные методы, уникальные для моего приложения.

public MySQL extends mysqli
{
public function query($query)
{
if ($this->real_query($query)) {
if ($this->field_count > 0) {
return new MySQL_Result($this);
}
return true;
}
return false;
}

}

class MySQL_Result extends mysqli_result
{
public function fetch_objects() {
$rows = array();
while($row = $this->fetch_object())
$rows[$row->id] = $row;
return $rows;
}
}

Что я не могу понять, так это fetch_object() использует буферизованные или небуферизованные данные SQL.

Конструктор mysqli_result не видно в mysqli.phpтак что я не могу увидеть, если это зовет $mysqli->store_result() или же $mysqli->use_result(),

Я пытался добавить эти методы в MySQL но ни одна из функций не отражена.

    public function store_result($option='a') {
echo "STORE RESULT<br/>";
}

public function use_result($option='a') {
echo "USE RESULT<br/>";
}

Значит ли это, что mysqli_result конструктор тоже не вызывает? Если да, то как он получает доступ к данным SQL, когда fetch_object называется?

…………….

Я хочу буферизованные данные SQL. Если я не могу понять, что делает дочерний конструктор, мне, возможно, придется заменить полученный дочерний класс декоратором, который вызывает $mysqli->store_result(),

Я новичок в PHP / OOP и буду очень признателен за отзывы. Спасибо.

4

Решение

mysqli_result использует буферизованные результаты из MySQL (акцент мой)

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

Процесс такой

  1. Вы выполняете запрос. MySQL отправляет обратно результат
  2. mysqli_query а также mysqli_get_result (подготовленные заявления) загрузит этот набор данных в mysqli_result объект

Вы на самом деле должны изо всех сил выполнять асинхронные запросы

0

Другие решения

Похоже, что mysqli_result использует буферизованные данные SQL.

Я написал тестовый пример, который попеременно обращается к строкам из двух запросов. Если данные не были буферизованы, сервер SQL был бы занят и не смог ответить на 2-й запрос.

/* Open a connection */
$mysqli = new MysqlDB("127.0.0.1", "phpuser", "phpuserpw", "wishlist");
if (mysqli_connect_errno())
return;

if ($result = $mysqli->query("SELECT * FROM wishers")) {

$res2 = $mysqli->query("SELECT * FROM wishes");

echo "Mem = ".memory_get_usage()."<br/>";

while($row = $result->fetch_row()) {
$row2 = $res2->fetch_row();

printf ("1: ID=%s,  Name=%s, Pass=%s<br/>",$row[0],$row[1], $row[2]);
printf ("2: ID=%s,  WisherID=%s<br/>", $row2[0], $row2[1]);

echo "Row Mem = ".memory_get_usage()."<br/>";
}

1: ID = 1, Имя = Том, Пасс = Кот

2: ID = 3, WisherID = 2

1: ID = 2, Имя = Джерри, Pass = Jerrymouse

2: ID = 4, WisherID = 2

1: ID = 6, Имя = Томми, Пасс = Кот

2: ID = 5, WisherID = 1

……………………..

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

0

По вопросам рекламы [email protected]