Я написал дочерний элемент 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 и буду очень признателен за отзывы. Спасибо.
mysqli_result
использует буферизованные результаты из MySQL (акцент мой)
Запросы по умолчанию используют буферный режим. Это означает, что результаты запроса немедленно передаются с MySQL Server на PHP, а затем сохраняются в памяти процесса PHP. Это позволяет выполнять дополнительные операции, такие как подсчет количества строк и перемещение (поиск) указателя текущего результата. Это также позволяет выдавать дополнительные запросы по тому же соединению при работе с набором результатов. Недостатком буферизованного режима является то, что для больших наборов результатов может потребоваться достаточно много памяти. Память будет оставаться занятой до тех пор, пока все ссылки на набор результатов не будут сброшены или набор результатов не будет явно освобожден, что автоматически произойдет во время самого последнего запроса. Термин «результат сохранения» также используется для буферизованного режима, поскольку весь набор результатов сохраняется сразу.
Процесс такой
mysqli_query
а также mysqli_get_result
(подготовленные заявления) загрузит этот набор данных в mysqli_result
объектВы на самом деле должны изо всех сил выполнять асинхронные запросы
Похоже, что 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
……………………..
Поскольку оба запроса работают, данные должны быть помещены в буфер.