ПредишенСледващото

Използване на PHP-генератор, националното планиране
Въпреки факта, че на PHP-генератори се предлагат с PHP 5.5.0, те са все още почти не се използват. Освен това, повечето разработчици, които познавам, да разберат как да работят генераторите. но не го виждате, те могат да бъдат полезни в реалния живот.

Да, генератори определено изглеждат добре, но нали знаете. Аз не знам, където те могат да бъдат полезни за мен, освен за изчисляване на последователността на Фибоначи.

И те не са наред, защото дори и примери в PHP -dokumentatsii твърде опростенчески. Те само да обясни как ефективно изпълнение на поредица или обхождане файл линия.

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

Генераторите ви позволяват да въведете код, който използва foreach за да превъртате чрез множество данни, без необходимостта да се разпредели памет за масива.

Поддържане предвид този факт, аз ще се опитам да обясня защо генераторите и чудесни ми помогнаха да се реши проблема Аз съм работил във фирмата.

Първо, малко контекст

В повечето примери код за аз ще се позове на тази метаданни $ книги.

Повторение на голяма група от данни

По традиция, аз ще трябва да напиша нещо подобно:

Проблемът е лесно да се види: повече книги, толкова повече ще се нуждаят от памет за $ filteredEbooks.

Едно от решенията - да се създаде итератор, които ще повтори $ на книги и да се върнете подходящо. Но за да направите това, ние ще трябва да се създаде нов клас, в допълнение, итератори realiziruyutsya ухапало досаден. За щастие, с PHP 5.5.0, можем да използваме генераторите!

Да, метод рефакториране getEbooksEligibleToWebReader да използвате генератора е проста: на мястото на предаване на стойности за променливите $ filteredEbooks на добива на проектиране.

Ако приемем, че $ масив от не книги книги. и итератор, или генератор (още по-добре!), консумацията на памет в момента е постоянен, без значение колко книги искате да се върне, и ние сме уверени, че книгата ще се търси само, когато наистина е необходимо.

се използва RulerZ вътре в генератора: Бонус. така че можем да пренапише метод и ще остане със същата оптимизиране на разпределението на паметта.

Сумиране на различни източници на данни

А сега да разгледаме момента на получаване на $ книги. Аз не ви казвам, но те всъщност идват от различни източници: релационна база данни и Elasticsearch.

Можем да напишем един прост метод за обобщаване на тези два източника:

Но за пореден път, количеството памет консумират при използването на този подход е много зависим от броя на книгите, съхранявани в базата данни и Elasticsearch.

Можем да започнем да използва генераторите и да върне резултат:

Така че, разбира се, по-добре, но ние все още имаме проблем: нашия метод изпълнява getBooks твърде много работа! Ние трябва да се отделят две пасив (четене на данни от базата данни и предизвикателството Elasticsearch) в два метода:

Може би сте забелязали използването на добив от оператора (на разположение с PHP 7.0), която ви позволява да се делегира на използването на генератори. Той е идеален, например, за обединяване на няколко източници на данни, които се използват генератори.

добив от оператора работи с всеки, служеща обект, така че масиви и итератори могат да се използват с този оператор.

С помощта на тази структура, ние можем да се обединят различни източници на данни, няколко реда код:

Изискан мързелив (по заявка) хидратация на записите в базата данни

Друго изпълнение генератори използват - реализация ленив хидратация, което може да обработва комуникации.

Аз трябваше да внася стотици хиляди поръчки от старата ни система от база данни, за всяка поръчка съдържа няколко елемента.

Наличието на поръчките и "ред елементи" е предпоставка за какво трябва да направим. Написах един метод, който връща sgidrirovanye поръчки и в същото време става прекалено бавно или лаком.

Идеята за малко наивни: sdzhoynit поръчки с покупки и поръчки групи и елементи за поръчки в серия.

Използване генератори. Аз бях в състояние да прилагат метод, който получава заповеди от базата данни и добавя съответните елементи ред. Всичко това консумира стабилно количество памет. Generator да се отърват от необходимостта да се запази всички поръчки и техните елементи: текущия ред - това е всичко, което трябва да sagregirovat данни.

Имитации асинхронни задачи

И накрая, но не на последно място: генератори могат да бъдат използвани, за да симулират асинхронни задачи. Докато пишех този преглед, се натъкнах на един пост @nikita_ppv по същата тема, и тъй като той за първи път осъзнах, генераторите в PHP. Аз просто ще оставите линк към поста си.

Той бързо се обяснява, че такива генератори (подробно) как можем да се възползват от факта, че те могат да бъдат отрязани и изпращане / получаване на данни за изпълнение на coroutines, а дори и многозадачност.

резюмиране

  • . опростени итератори;
  • . може да се върне неограничени количества данни, без допълнителна консумация на памет;
  • . Те могат да бъдат обобщени чрез генератори делегиране;
  • . Те могат да бъдат използвани за изпълнение на многозадачност;
  • . просто забавно!

Свързани статии

Подкрепете проекта - споделете линка, благодаря!