PHP.mk документација

Управување со меморија

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

mysqlnd.memory.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека mysqlnd.memory.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
Управување со меморија

Референца за `mysqlnd.memory.php` со подобрена типографија и навигација.

mysqlnd.memory.php

Управување со меморија

Вовед

The MySQL Native Driver manages memory different than the MySQL Client Library. The libraries differ in the way memory is allocated and released, how memory is allocated in chunks while reading results from MySQL, which debug and development options exist, and how results read from MySQL are linked to PHP user variables.

MySQL Native Driver управува со меморијата различно од MySQL Client Library. Библиотеките се разликуваат во начинот на кој меморијата се распределува и ослободува, како меморијата се распределува во парчиња при читање резултати од MySQL, кои опции за дебагирање и развој постојат, и како резултатите прочитани од MySQL се поврзани со PHP корисничките променливи.

Следниве белешки се наменети како вовед и резиме за корисниците заинтересирани да го разберат MySQL Native Driver на ниво на C код.

Функции за управување со меморијата што се користат memory_get_usage()Целата распределба и ослободување на меморијата се врши со помош на PHP функциите за управување со меморијата. Затоа, потрошувачката на меморија на mysqlnd може да се следи со помош на PHP API повици, како што се

. Бидејќи меморијата се распределува и ослободува со помош на PHP управувањето со меморијата, промените можеби нема веднаш да станат видливи на ниво на оперативниот систем. PHP управувањето со меморијата дејствува како прокси што може да го одложи ослободувањето на меморијата кон системот. Поради ова, споредувањето на употребата на меморијата на MySQL Native Driver и MySQL Client Library е тешко. MySQL Client Library директно ги користи повиците за управување со меморијата на оперативниот систем, па затоа ефектите може да се забележат веднаш на ниво на оперативниот систем.

Секое ограничување на меморијата наметнато од PHP, исто така, влијае на MySQL Native Driver. Ова може да предизвика грешки „out of memory“ при преземање големи множества резултати што го надминуваат преостанатиот дел од меморијата што го прави достапен PHP. Бидејќи MySQL Client Library не ги користи PHP функциите за управување со меморијата, таа не се усогласува со ниту едно поставено PHP ограничување на меморијата. Ако се користи MySQL Client Library, во зависност од моделот на распоредување, меморискиот отпечаток на PHP процесот може да надмине над PHP ограничувањето на меморијата. Но, исто така, PHP скриптите можеби ќе можат да обработуваат поголеми множества резултати бидејќи делови од меморијата распределена за држење на множествата резултати се надвор од контролата на PHP моторот.

PHP функциите за управување со меморијата се повикуваат од MySQL Native Driver преку лесен обвивач. Меѓу другото, обвивачот го олеснува дебагирањето.

Ракување со множества резултати Различните MySQL Server и различните клиентски API се разликуваат помеѓу баферирани и не-баферирани

множества резултати. Не-баферираните множества резултати се пренесуваат ред по ред од MySQL до клиентот додека клиентот итерира низ резултатите. Баферираните резултати се преземаат во нивната целина од клиентската библиотека пред да им се предадат на клиентот.

MySQL Native Driver користи PHP Streams за мрежна комуникација со MySQL Server. Резултатите испратени од MySQL се преземаат од мрежните бафери на PHP Streams во баферот за резултати на mysqlnd. Баферот за резултати е составен од zvals. Во втор чекор, резултатите се прават достапни за PHP скриптата. Овој последен трансфер од баферот за резултати во PHP променливи влијае на потрошувачката на меморија и е најзабележлив кога се користат баферирани множества резултати.

Стандардно, MySQL Native Driver се обидува да избегне двојно држење на баферирани резултати во меморијата. Резултатите се чуваат само еднаш во внатрешните бафери за резултати и нивните zvals. Кога резултатите се преземаат во PHP променливи од PHP скриптата, променливите ќе ги реферираат внатрешните бафери за резултати. Резултатите од базата на податоци не се копираат и се чуваат во меморијата само еднаш. Ако корисникот ги измени содржините на променлива што ги држи резултатите од базата на податоци, мора да се изврши копирање при запишување за да се избегне менување на реферираниот внатрешен бафер за резултати. Содржините на баферот не смеат да се менуваат бидејќи корисникот може да одлучи да го прочита множеството резултати по втор пат. Механизмот за копирање при запишување е имплементиран со помош на дополнителна листа за управување со референци и употреба на стандардни бројачи на референци на zval. Копирање при запишување мора да се направи и ако корисникот прочита множество резултати во PHP променливи и ослободи множество резултати пред да се поништат променливите. statistics Генерално, овој модел добро функционира за скрипти што читаат множество резултати еднаш и не ги менуваат променливите што ги држат резултатите. Неговиот главен недостаток е меморискиот трошок предизвикан од дополнителното управување со референци што произлегува главно од фактот што корисничките променливи што ги држат резултатите не можат целосно да се ослободат додека mysqlnd управувањето со референци не престане да ги реферира. MySQL Native driver ја отстранува референцата кон корисничките променливи кога множеството резултати е ослободено или е извршено копирање при запишување. Набљудувачот ќе види како вкупната потрошувачка на меморија расте додека не се ослободи множеството резултати. Користете го

за да проверите дали скриптата експлицитно ослободува множества резултати или драјверот врши имплицитно ослободување и така меморијата се користи подолго отколку што е потребно. Статистиките исто така помагаат да се види колку операции за копирање при запишување се случиле. while ($row = $res->fetch_assoc()) { ... } PHP скрипта што чита многу мали редови од баферирано множество резултати користејќи код што е еднаков или еквивалентен на $row додека се итерира низ множеството на резултати и пред ослободувањето на самото множество на резултати. На оптоварен сервер, оптимизирањето на врвната употреба на меморијата може да помогне во подобрувањето на целокупните перформанси на системот, иако за поединечна скрипта, пристапот на копирање може да биде побавен поради дополнителни алокации и операции за копирање меморија.

Надзор и отстранување грешки

Постојат повеќе начини за следење на употребата на меморијата на MySQL Native Driver. Ако целта е да се добие брз преглед на високо ниво или да се провери мемориската ефикасност на PHP скрипти, тогаш проверете го statistics собрани од библиотеката. Статистиките ви овозможуваат, на пример, да фатите SQL изјави кои генерираат повеќе резултати отколку што се обработени од PHP скрипта.

На debug трагирачкиот лог може да се конфигурира за снимање повици за управување со меморијата. Ова помага да се види кога меморијата е алоцирана или ослободена. Сепак, големината на бараните парчиња меморија можеби не е наведена.

Некои, неодамнешни верзии на MySQL Native Driver имаат емулација на случајни ситуации со недостиг на меморија. Оваа функција е наменета за C програмерите на библиотеката или mysqlnd plugin автори само. Ве молиме, пребарајте го изворниот код за соодветните поставки за конфигурација на PHP и дополнителни детали. Функцијата се смета за приватна и може да се менува во секое време без претходна најава.

Белешки од корисници

Нема белешки од корисници за оваа страница.
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.