Использование генераторов с модельными объектами, которые сформированы ORM или гидратированы из базы данных - PullRequest
3 голосов
/ 04 октября 2019

Использование генераторов PHP позволяет более эффективно использовать память. Во всех руководствах используются примеры, в которых число увеличивается на единицу и * yield 'из цикла foreach ().

Но как использовать генераторы более сложным способом, описанным ниже.

class Book {
}

class Library 
{
    /**
     * @var Books[]
     */
    private $books;

    public function loadBooks()
    {
        // We load individual Books from database and form our "Book" objects
        // and push them into $this->books;
    }    

    public function getBooks()
    {
        foreach ($this->books as $book) {
            yield $book;
        }
    }
}

$library = new Library();
$library->loadBooks();

Вопрос :

Как использование yield вообще имеет какое-либо значение для требуемого объема памяти? Разве мы уже не тратим память, необходимую для хранения каждой книги внутри $this->books?

Полезны ли генераторы в таких случаях, когда вы имеете дело с объектами, состоящими из других объектов, которые поступают из базы данных / ORM?

1 Ответ

1 голос
/ 04 октября 2019

Хотя ваш пример не приносит прибыли от yield, ответ на ваш вопрос таков: это зависит.

Если вы держите в своем объекте указатель на результат, вы можете получить, если вместозагружая все записи в свойство, вы выдаете их.

Существуют также ORM, которые собирают реляционные данные на лету, так что, имея определенную связь между таблицами, они получают полный результат из таблицы 1, а затем строятОтдельный выбор для деталей таблицы 2, если это необходимо. В этом случае вы должны получать прибыль, особенно если вы пытаетесь отобразить коллекцию, достаточно большую, чтобы использовать всю память вашего процесса. Это возможно, потому что базы данных имеют свои внутренние «курсоры» для чтения данных назад и вперед, поэтому, если вы вместо загрузки всех данных в память используете эти курсоры, вы можете обрабатывать намного больше данных, чем сохранит ваша память. И доходность оказывается очень полезной, чем.

Тем не менее доходность не так уж полезна с ORM, потому что большинство популярных ORM созданы также для довольно оптимального использования ресурсов. В вашем случае я бы скорее сосредоточился на правильном использовании ваших ORM, чем на использовании причудливых техник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...