php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта

memory_get_usage

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

memory_get_usage β€” Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ для PHP

ОписаниС

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство памяти Π² Π±Π°ΠΉΡ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ PHP-скрипту Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

PHP Π½Π΅ отслСТиваСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая Π²Ρ‹Π΄Π΅Π»ΡΠ»Π°ΡΡŒ Π½Π΅ emalloc()

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство памяти Π² Π±Π°ΠΉΡ‚Π°Ρ….

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования memory_get_usage()

// Π­Ρ‚ΠΎ просто ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ†ΠΈΡ„Ρ€Ρ‹ Π½ΠΈΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚
// ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ вашСй систСмы

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

User Contributed Notes 15 notes

To get the memory usage in KB or MB

echo convert ( memory_get_usage ( true )); // 123 kb
?>

Note, that the official IEC-prefix for kilobyte, megabyte and so on are KiB, MiB, TiB and so on.

At first glance this may sound like «What the hell? Everybody knows, that we mean 1024 not 1000 and the difference is not too big, so what?». But in about 10 years, the size of harddisks (and files on them) reaches the petabyte-limit and then the difference between PB and PiB is magnificent.

Better to get used to it now. πŸ™‚

To get the memory usage in KB or MB

function echo_memory_usage () <
$mem_usage = memory_get_usage ( true );

memory_get_usage() is used to retrieve the memory allocated to PHP only (or your running script). But intuitively, many people expect to get the memory usage of the system, based on the name of the function.

So if you need the overall memory usage, following function might be helpful. If retrieves the memory usage either in percent (without the percent sign) or in bytes by returning an array with free and overall memory of your system. Tested with Windows (7) and Linux (on an Raspberry Pi 2):

//
// Extract size (TODO: It seems that (at least) the two values for total and free memory have the unit «kB» always. Is this correct?
//

?>

The function getNiceFileSize() is not required. Just used to shorten size in bytes.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π°Π»ΡŒΠ½Π°Ρ очистка памяти PHP?

Бтолкнулся с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ бСсконСчноС количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ. Но с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ возрастаСт количСство потрСбляСмой скриптом памяти. Π’ΠΎΡ‚ нСбольшой тСст.

ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΅Π΄Π°Π΅Ρ‚ Test::create($text);

Понимаю Ρ‡Ρ‚ΠΎ Ссли Ρ‚Π°ΠΌ Π² дСструкторС класса Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ очистки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°ΡΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ класс анслСдуСт класс Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Ρ‰Π΅ класс, Π² ΠΎΠ±Ρ‰Π΅ΠΌ сного Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° задСйстовано, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ.

php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. 2d9ab0d074280135ed55587fd3caeecc. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта Ρ„ΠΎΡ‚ΠΎ. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта-2d9ab0d074280135ed55587fd3caeecc. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° 2d9ab0d074280135ed55587fd3caeecc. (PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти Π² PHP. Ρ‚ΠΎ это, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π΅ Π±Π°Π³ PHP. НавСрняка Π³Π΄Π΅-Ρ‚ΠΎ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅, Π΅ΡΡ‚ΡŒ Π»ΠΎΠ³ ΠΈΠ»ΠΈ кСш ΠΈ ΠΎΠ½ копится, Π½Π΅ освобпТдаясь (Π±Ρ‹Π» случай, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° всС SQL-запросы Π»ΠΎΠ³Π³ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ Π² массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ очищался).

НапримСр, Π΅ΡΡ‚ΡŒ такая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° phpQuery, ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ я ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» Π΅ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΎΠ½Π° потрСбляла ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² нСмСрянных количСствах.

Π’Π°ΠΊΠΆΠ΅ ΡƒΡ‚Π΅ΠΊΠ°Ρ‚ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π²Ρ€ΠΎΠ΄Π΅ DOM.

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ ΠΏΠΎΠΈΡ‰ΠΈΡ‚Π΅ ΡΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ мСста.

Π₯очСтся ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π»ΡƒΡ‡Π΅ΠΉ нСнависти всСм, ΠΊΡ‚ΠΎ, Π½Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π²ΡˆΠΈΡΡŒ Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, ΠΏΠΈΡˆΠ΅Ρ‚ глупости Π²Ρ€ΠΎΠ΄Π΅ Β«PHP Ρ‚Π΅Ρ‡Π΅Ρ‚Β». Π’ PHP систСма управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π»ΡƒΡ‡ΡˆΠ΅ Ρ‡Π΅ΠΌ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ ΠΈ Copy-on-Write, ΠΈ счСтчик ссылок, ΠΈ сборщик мусора. НС Π²ΠΎ всСх языках это доступно.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ врСмя для PHP скриптов

Настройки потрСблСния рСсурсов Π² PHP скриптах ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ php.ini, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² самих скриптах.

Π’ Ρ„Π°ΠΉΠ»Π΅ php.ini Π·Π° это ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° Resource Limits (ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ потрСблСния рСсурсов).

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для PHP скриптов

Для этого Π² Ρ„Π°ΠΉΠ»Π΅ php.ini Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΈ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ:

Π­Ρ‚Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π·Π°Π΄Π°Ρ‘Ρ‚ максимальноС врСмя Π² сСкундах, Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ скрипт Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ. Если этого Π½Π΅ происходит, парсСр Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ скрипта. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ зависаниС сСрвСра ΠΈΠ·-Π·Π° ΠΏΠ»ΠΎΡ…ΠΎ написанного скрипта. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ даётся 30 сСкунд. Если PHP Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½ΠΎ 0.

На максимальноС врСмя выполнСния Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Ρ‚.ΠΏ.

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π² бСзопасном Ρ€Π΅ΠΆΠΈΠΌΠ΅ эту настройку нСльзя ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ini_set(). Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ всС ΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Π½Π°Π΄ΠΎ Π»ΠΈΠ±ΠΎ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ бСзопасный Ρ€Π΅ΠΆΠΈΠΌ, Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прямо Π² php.ini.

Π’Π΅Π±-сСрвСры ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ свои настройки Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°, ΠΏΠΎ истСчСнии ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ сами Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ скрипта PHP. Π’ Apache Π΅ΡΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Timeout, Π² IIS Π΅ΡΡ‚ΡŒ функция CGI timeout. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ установлСно 300 сСкунд. Π’ΠΎΡ‡Π½Ρ‹Π΅ значСния ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ Π²Π΅Π±-сСрвСру.

Ѐункция для увСличСния ΠΈ ограничСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния PHP

Ѐункция set_time_limit ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ врСмя выполнСния скрипта.

Она Π·Π°Π΄Π°Π΅Ρ‚ врСмя Π² сСкундах, Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ скрипт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Если скрипт Π½Π΅ успСваСт, вызываСтся Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Π°Ρ ошибка. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ даСтся 30 сСкунд, Π»ΠΈΠ±ΠΎ врСмя, записанноС Π² настройкС max_execution_time Π² php.ini (Ссли такая настройка установлСна).

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ set_time_limit() пСрСзапускаСт счСтчик с нуля. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π±Ρ‹Π» 30 сСкунд, ΠΈ Ρ‡Π΅Ρ€Π΅Π· 25 сСкунд послС запуска скрипта Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° функция set_time_limit(20), Ρ‚ΠΎ скрипт Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ максимум 45 сСкунд.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния: Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE Π² случаС успСха, ΠΈΠ½Π°Ρ‡Π΅ FALSE.

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: эта функция Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ссли PHP Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² бСзопасном Ρ€Π΅ΠΆΠΈΠΌΠ΅. ΠžΠ±ΠΎΠΉΡ‚ΠΈ это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΠ² бСзопасный Ρ€Π΅ΠΆΠΈΠΌ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ настройки Π² php.ini.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: функция set_time_limit() ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° max_execution_time Π²Π»ΠΈΡΡŽΡ‚ Π½Π° врСмя выполнСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ самого скрипта. ВрСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ дСйствия Π²Π½Π΅ скрипта, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ system(), ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, запросы ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚.ΠΏ. Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² расчСт Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния скрипта. Π­Ρ‚ΠΎ Π½Π΅ относится ΠΊ систСмам Windows, Π³Π΄Π΅ расчитываСтся Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ врСмя выполнСния.

ОбС set_time_limit(…) ΠΈ ini_set(‘max_execution_time’,…); Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ врСмя, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ функциями sleep, file_get_contents, shell_exec, mysql_query ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ.

Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти для PHP скриптов

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π² Ρ„Π°ΠΉΠ»Π΅ php.ini

Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ объСм памяти Π² Π±Π°ΠΉΡ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скрипту. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ»ΠΎΡ…ΠΎ написанный скрипт ΡΡŠΠ΅Π΄Π°Π΅Ρ‚ всю Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ сСрвСра. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ограничСния, установитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Π² -1.

Π’ вСрсиях Π΄ΠΎ PHP 5.2.1 для использования этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Π»Π° Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π° Π½Π° этапС компиляции. Π’Π°ΠΊ, ваша строка ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Π»Π° Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ: —enable-memory-limit. Π­Ρ‚Π° опция компиляции Π±Ρ‹Π»Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ memory_get_usage() ΠΈ memory_get_peak_usage() Π΄ΠΎ вСрсии 5.2.1.

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ†Π΅Π»ΠΎΠ΅ число, Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ измСряСтся Π±Π°ΠΉΡ‚Π°ΠΌΠΈ. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΡƒΡŽ запись.

ДоступныС ΠΎΠΏΡ†ΠΈΠΈ: K (для ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚), M (для ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚) ΠΈ G (для Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚; доступна начиная с PHP 5.1.0); ΠΎΠ½ΠΈ рСгистронСзависимы. ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ считаСтся Π±Π°ΠΉΡ‚Π°ΠΌΠΈ. 1M Ρ€Π°Π²Π½ΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Ρƒ ΠΈΠ»ΠΈ 1048576 Π±Π°ΠΉΡ‚Π°ΠΌ. 1K Ρ€Π°Π²Π½ΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚Ρƒ ΠΈΠ»ΠΈ 1024 Π±Π°ΠΉΡ‚Π°ΠΌ. Π­Ρ‚ΠΈ сокращСния Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² php.ini ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ini_set(). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ приводится ΠΊ Ρ‚ΠΈΠΏΡƒ integer; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 0.5M интСрпрСтируСтся ΠΊΠ°ΠΊ 0.

Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ парсинга Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· запроса.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π² Ρ„Π°ΠΉΠ»Π΅ php.ini

Π·Π°Π΄Π°Ρ‘Ρ‚ максимальноС врСмя Π² сСкундах, Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ скрипт Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ всС Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ запросами Π²Ρ€ΠΎΠ΄Π΅ POST ΠΈΠ»ΠΈ GET. Π­Ρ‚ΠΎ врСмя измСряСтся ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° PHP Π²Ρ‹Π·Π²Π°Π½ Π½Π° сСрвСрС Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° скрипт Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ -1, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ max_execution_time. Если ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ΠΌ 0, Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΡ€ΠΈ запускС Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ установлСно Π½Π° -1 (Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎ).

Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ влоТСнности Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π² Ρ„Π°ΠΉΠ»Π΅ php.ini

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° количСство Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π² Ρ„Π°ΠΉΠ»Π΅ php.ini

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: послС внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ„Π°ΠΉΠ» php.ini Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π²Π΅Π±-сСрвСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ измСнСния вступили Π² силу.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° использованиС рСсурсов

Ѐункция getrusage ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± использовании Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ рСсурса.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния: Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ассоциативный массив, содСрТащий Π΄Π°Π½Π½Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½Ρ‹Π΅ ΠΈΠ· систСмного Π²Ρ‹Π·ΠΎΠ²Π°. ИмСна элСмСнтов ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠΎΠ»Π΅ΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования getrusage():

php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. getrusage. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта Ρ„ΠΎΡ‚ΠΎ. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта-getrusage. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° getrusage. (PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»ΠΎΠ² для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° сСрвСр

ΠšΡ€ΠΎΠΌΠ΅ описанных ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ нСпосрСдствСнных рСсурсов Π²Π΅Π±-сСрвСра, Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ограничСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ косвСнноС воздСйствиС Π½Π° рСсурсы: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° слишком большого Ρ„Π°ΠΉΠ»Π° Π½Π° сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ большого количСства рСсурсов для Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π»ΠΈΠ±ΠΎ привСсти ΠΊ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ дискового Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° сСрвСра. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΠΌΠΈΡ‚Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹Π΅ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΠΌΠΈΠΌΠΎ Resource Limits.

Π’ частности, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°

устанавливаСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ†Π΅Π»ΠΎΠ΅ число, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ измСряСтся Π±Π°ΠΉΡ‚Π°ΠΌΠΈ. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΡƒΡŽ запись, которая описана Ρ‡ΡƒΡ‚ΡŒ Π²Ρ‹ΡˆΠ΅.

Максимально допустимый Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ…, отправляСмых ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ POST

ΠœΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ пост ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ тСкстовыС Π΄Π°Π½Π½Ρ‹Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ коммСнтария Π½Π° сайт), Ρ‚Π°ΠΊ ΠΈ Ρ„Π°ΠΉΠ»Ρ‹. Если Π²Ρ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ upload_max_filesize Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ большСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° сайт, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹:

которая устанавливаСт максимально допустимый Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ…, отправляСмых ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ POST. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ влияСт Π½Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Ρ„Π°ΠΉΠ»ΠΎΠ². Для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ большС значСния Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ upload_max_filesize. Π’ сущности, memory_limit Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ большС Ρ‡Π΅ΠΌ post_max_size. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ integer, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ измСряСтся Π±Π°ΠΉΡ‚Π°ΠΌΠΈ. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΡƒΡŽ запись, которая описана Π²Ρ‹ΡˆΠ΅. Если Ρ€Π°Π·ΠΌΠ΅Ρ€ POST-Π΄Π°Π½Π½Ρ‹Ρ… большС Ρ‡Π΅ΠΌ post_max_size, ΡΡƒΠΏΠ΅Ρ€Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ $_POST ΠΈ $_FILES Π±ΡƒΠ΄ΡƒΡ‚ пустыми. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Π² $_GET ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² скрипт, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚.Π΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π Π°Π±ΠΎΡ‚Π° с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (ΠΈ всё ΠΆΠ΅ ΠΎΠ½Π° Π΅ΡΡ‚ΡŒ)

php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. a72e14e8. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта Ρ„ΠΎΡ‚ΠΎ. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта-a72e14e8. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° a72e14e8. (PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)БущСствуСт распространСнноС ΠΌΠ½Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ «рядовому» PHP Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ практичСски Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΎΠ΄Π½Π°ΠΊΠΎ Β«Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡΒ» ΠΈ Β«Π·Π½Π°Ρ‚ΡŒΒ» всё ΠΆΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ понятия. ΠŸΠΎΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΎΡΠ²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ аспСкты ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ массивами, Π° Ρ‚Π°ΠΊΠΆΠ΅ интСрСсныС Β«ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈΒ» Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ PHP. Как Π²Ρ‹ смоТСтС ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, оптимизация это Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Ссли Π½Π΅ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½Π° Β«ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Β», Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Β«Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ граблями», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ вас Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ изрядно ΠΏΠΎΠ½Π΅Ρ€Π²Π½ΠΈΡ‡Π°Ρ‚ΡŒ.

ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния

НСбольшой ликбСз

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Π² PHP ΠΊΠ°ΠΊ Π±Ρ‹ состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй: «ΠΈΠΌΠ΅Π½ΠΈ«, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ хранится Π² hash_table symbol_table, ΠΈ «Π·Π½Π°Ρ‡Π΅Π½ΠΈΡ«, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ хранится Π² zval ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅.
Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ нСсколько ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… случаях позволяСт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти. О Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ это выглядит Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ написано Π΄Π°Π»Π΅Π΅.

НаиболСС частыми элСмСнтами ΠΊΠΎΠ΄Π°, Π±Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слоТно сСбС ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ скрипт, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:
β€” созданиС, присвоСниС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (чисСл, строк ΠΈ Ρ‚.ΠΏ.),
β€” созданиС массивов ΠΈ ΠΈΡ… ΠΎΠ±Ρ…ΠΎΠ΄ (Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ использована функция foreach),
β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ/ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

ИмСнно ΠΎΠ± этих аспСктах Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ описаниС. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ достаточно объСмно, Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΌΠ΅Π³Π°-слоТного Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈ всё Π±ΡƒΠ΄Π΅Ρ‚ достаточно просто, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ ΠΈ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ

И простой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ тСста потрСблСния памяти для строки:

include ( ‘func.php’ ) ;
echo «String memory usage test.\n\n» ;
$base_memory_usage = memory_get_usage ( ) ;
$base_memory_usage = memory_get_usage ( ) ;

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: нСсомнСнно ΠΊΠΎΠ΄ являСтся Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния работоспособности, Π½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π°ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π°ΠΆΠ½Π° Π½Π°Π³Π»ΡΠ΄Π½ΠΎΡΡ‚ΡŒ потрСблСния памяти, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π΄Π°Π½Π½ΠΎΠ΅ прСдставлСниС.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΠ΄Π° Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½:

Start
Bytes diff: 0
String value setted
Bytes diff: 15448
String value unsetted
Bytes diff: 0

Π’ΠΎΡ‚ ΠΆΠ΅ самый ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎ вмСсто unset($a) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ $a=null;:

Start
Bytes diff: 0
String value setted
Bytes diff: 15448
String value set to null
Bytes diff: 76

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, пСрСмСнная Π½Π΅ Π±Ρ‹Π»Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Π°. Под Π½Π΅Π΅ остаСтся Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π΅Ρ‰Π΅ 76 Π±Π°ΠΉΡ‚.
Достаточно ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ, Ссли ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ²Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ выдСляСтся ΠΈ ΠΏΠΎΠ΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° boolean, integer, float. Π Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ Π½Π΅ ΠΎΠ± объСмС памяти, выдСляСмой ΠΏΠΎΠ΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠΈ памяти для хранСния свСдСний ΠΎ присвоСнной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (zval ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈ само имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ).
Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ присвоСния, Ρ‚ΠΎ Π½Π΅ являСтся ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ присвоСниС ΠΈΠΌΠ΅Π½Π½ΠΎ null значСния. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ $a=10000; даст Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ для расхода памяти.

Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ PHP сказано, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ null ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ скрипту Π²ΠΈΠ΄Π½ΠΎ Ρ‡Ρ‚ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ собствСнно являСтся Π±Π°Π³ΠΎΠΌ (Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ).

Π—Π°Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ присвоСниС null, Ссли ΠΌΠΎΠΆΠ½ΠΎ unset()?
ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ β€” это присвоСниС, (спасибо КО), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ измСняСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, соотвСтствСнно, Ссли Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ мСньшС памяти, Ρ‚ΠΎ ΠΎΠ½Π° высвобоТдаСтся сразу, ΠΎΠ΄Π½Π°ΠΊΠΎ это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов (ΠΏΡƒΡΡ‚ΡŒ ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ).
unset() Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ освобоТдаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Ρ‡Ρ‚ΠΎ unset() ΠΈ присвоСниС null ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ со ссылками Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Unset() ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ссылку, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ присвоСниС null ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, соотвСтствСнно всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ станут ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:
ВстрСчаСтся Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ unset() являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ, это Π½Π΅ Π²Π΅Ρ€Π½ΠΎ. unset() β€” это языковая конструкция (ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ if), ΠΎ Ρ‡Π΅ΠΌ прямо сказано Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, соотвСтствСнно Π΅Π΅ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для обращСния Ρ‡Π΅Ρ€Π΅Π· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

НСмного Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для ΠΏΡ€Π°Π·Π΄Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΠΉ (ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹ΡˆΠ΅):
$a = array();
Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ 164 Π±Π°ΠΉΡ‚Π°, unset($a) всё Π²Π΅Ρ€Π½Π΅Ρ‚.

class A < >
$a = new A();
Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ 184 Π±Π°ΠΉΡ‚Π°, unset($a) всё Π²Π΅Ρ€Π½Π΅Ρ‚.

$a = new stdClass();
Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ 272 Π±Π°ΠΉΡ‚Π°, Π½ΠΎ послС unset($a) Β«ΡƒΡ‚Π΅ΠΊΡƒΡ‚Β» 88 Π±Π°ΠΉΡ‚ (ΠΊΡƒΠ΄Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ ΡƒΡ‚Π΅ΠΊΠ»ΠΈ, ΠΌΠ½Π΅ ΠΏΠΎΠΊΠ° Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ).

Пока ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π² ΠΏΠ»Π°Π½Π΅ потрСблСния памяти, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ строковыС ΠΈ числовыС значСния достаточно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ хранятся ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ. Всё становится Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΡƒΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° Π² Ρ…ΠΎΠ΄ ΠΈΠ΄ΡƒΡ‚ массивы (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ†Π΅Π»Ρ‹ΠΉ ряд особСнностСй, ΠΎΠ΄Π½Π°ΠΊΠΎ для этого ΡƒΠΆΠ΅ потрСбуСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ).

ΠœΠ°ΡΡΠΈΠ²Ρ‹

ΠœΠ°ΡΡΠΈΠ²Ρ‹ Π² PHP Β«ΡΡŠΠ΅Π΄Π°ΡŽΡ‚Β» достаточно памяти, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Π½ΠΈΡ… ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ хранят Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΌΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, поэтому слСдуСт ΠΎΡ‡Π΅Π½ΡŒ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½ΠΈΠΌΠΈ. Однако, Ρ€Π°Π±ΠΎΡ‚Π° с массивами Π² PHP ΠΈΠΌΠ΅Π΅Ρ‚ свои «прСлСсти ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈΒ» ΠΈ ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², связанных с ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ΠΌ памяти, стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ.

? php
include ( ‘func.php’ ) ;
echo «Array memory usage example.» ;
$base_memory_usage = memory_get_usage ( ) ;
$base_memory_usage = memory_get_usage ( ) ;

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° Π²Ρ‹Π²ΠΎΠ΄:

Array memory usage example.Base usage.
Bytes diff: 0
Array is set.
Bytes diff: 61940
In FOREACH cycle.
Bytes diff: 77632
In FOREACH cycle.
Bytes diff: 93032
In FOREACH cycle.
Bytes diff: 108432
In FOREACH cycle.
Bytes diff: 123832
Usage right after FOREACH.
Bytes diff: 61940
Array unset.
Bytes diff: 0

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π² послСднСй ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° foreach Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ массивом памяти возросло Π² Π΄Π²Π° Ρ€Π°Π·Π°, хотя ΠΏΠΎ самому ΠΊΠΎΠ΄Ρƒ это Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ. Но сразу послС Ρ†ΠΈΠΊΠ»Π°, ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти Π²Π΅Ρ€Π½ΡƒΠ»ΠΎΡΡŒ ΠΊ ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. ЧудСса Π΄Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ.
ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΠΌΡƒ являСтся оптимизация использования массива Π² Ρ†ΠΈΠΊΠ»Π΅. На врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ†ΠΈΠΊΠ»Π°, ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ исходный массив, нСявно создаСтся копия структуры массива (Π½ΠΎ Π½Π΅ копия Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ), которая ΠΈ становится доступной ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ Ρ†ΠΈΠΊΠ»Π°, Π° исходная структура уничтоТаСтся. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ссли Π²Ρ‹ присваиваСтС Π½ΠΎΠ²Ρ‹Π΅ значСния исходному массиву, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ сразу, Π° для Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π° ΠΏΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°.
Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΡŽ памяти Π½Π° врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ†ΠΈΠΊΠ»Π° с большими массивами Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ ΠΈΠ· Π‘Π”.

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ zibada (Π² ΠΊΡ€Π°Ρ‚Ρ†Π΅):
Π’Π°ΠΆΠ½ΠΎ ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ Π½ΠΎΠ²Ρ‹ΠΉ Β«Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ массив» Π² случаС внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π΅Π΄ΠΈΠ½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ для всСй структуры массива, Π½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ измСняСмого элСмСнта. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли имССтся массив с большим количСством элСмСнтов, (Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ с большими значСниями), Ρ‚ΠΎ Π΅Π΄ΠΈΠ½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ сущСствСнно.

ΠšΠΎΠ²Π°Ρ€Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β„–2
Π§ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΊΠΎΠ΄.

Π‘Π°ΠΌ ΠΊΠΎΠ΄ Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ мСняли, СдинствСнноС Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ, это ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΈ счСтчик ссылок Π½Π° исходный массив, Π½ΠΎ это Π² ΠΊΠΎΡ€Π½Π΅ помСняло Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ†ΠΈΠΊΠ»Π°:

Bytes diff: 0
Array is set.
Bytes diff: 61940
In FOREACH cycle.
Bytes diff: 61988
In FOREACH cycle.
Bytes diff: 61988
In FOREACH cycle.
Bytes diff: 61988
In FOREACH cycle.
Bytes diff: 61988
Usage right after FOREACH.
Bytes diff: 61940
Array unset.
Bytes diff: 0

Bytes diff: 0
Array is set.
Bytes diff: 61940
In FOREACH cycle.
Bytes diff: 61940
In FOREACH cycle.
Bytes diff: 61940
In FOREACH cycle.
Bytes diff: 61940
In FOREACH cycle.
Bytes diff: 61940
Usage right after FOREACH.
Bytes diff: 61940
Array unset.
Bytes diff: 0

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠΎ ссылкС ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Рассмотрим случай, Β«Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒΒ» Ссли трСбуСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (ΠΈΠ»ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΠ· Π½ΠΈΡ…), ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΎΡ‡Π΅Π½ΡŒ большоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ использованиС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ/возвращСния ΠΏΠΎ ссылкС.
Однако Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ PHP сказано: НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΏΠΎ ссылкС для увСличСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π―Π΄Ρ€ΠΎ PHP само занимаСтся ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.
ΠŸΠΎΠΏΡ‹Ρ‚Π°Π΅ΠΌΡΡ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ это Π·Π° «оптимизация».

Для Π½Π°Ρ‡Π°Π»Π° самый простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (ΠΏΠΎΠΊΠ° Π±Π΅Π· ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²):

Start
Bytes diff: 0
String value setted
Bytes diff: 15496
String value unsetted
Bytes diff: 0

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π²Ρ‹Π²ΠΎΠ΄:

Bytes diff: 0
String value setted
Bytes diff: 30896
String value unsetted
Bytes diff: 0

Данная оптимизация дСйствуСт для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΠΈΠΌΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния массива.
Π§Ρ‚ΠΎΠ±Ρ‹ это Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, взглянСм Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅:

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ даст Π²Ρ‹Ρ…ΠΎΠ΄:

Bytes diff: 0
String value setted
Bytes diff: 46704
String value unsetted
Bytes diff: 0

Всё Π²Ρ‹ΡˆΠ΅ описанноС дСйствуСт Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΈ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ/Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· Β«ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β» Π²Π½ΡƒΡ‚Ρ€ΡŒ/ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Если Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²Ρ‹ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Β«Ρ‚Ρ€ΠΎΠ³Π°Π΅Ρ‚Π΅Β» ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ для Π½Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти (ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Π΅Π΅ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ). Если ΠΆΠ΅ Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ Β«Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β» ΠΈ измСняСтС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ создана Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ полная копия значСния.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ PHP Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ избавляСт ΠΎΡ‚ нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠΎ ссылкС для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ использования памяти. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠΎ ссылкС ΠΈΠΌΠ΅Π΅Ρ‚ практичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ трСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ с ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ этих ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈΠ·Π²Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

echo «Array memory usage example.» ;
$base_memory_usage = memory_get_usage ( ) ;
$base_memory_usage = memory_get_usage ( ) ;

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π±Ρ‹Π»Π° создана копия массива, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ фактичСски ΠΈΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° значСния Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. И Π΄Π°ΠΆΠ΅ частичная модификация ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ массива Π½Π΅ создала ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ копию, Π° Π²Ρ‹Π΄Π΅Π»ΠΈΠ»Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ Π½ΠΎΠ²Ρ‹Π΅ значСния.

Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² ΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… цСлях, стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° эти Π΄Π²Π° значСния:

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:
Π’ PHP5 (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ PHP4), всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ссылкС, хотя ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ, это нСполноцСнная ссылка. Π‘ΠΌ. эту ΡΡ‚Π°Ρ‚ΡŒΡŽ.

ΠšΡ€Π°Ρ‚ΠΊΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Ρ‹

НСсомнСнно ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ использования памяти Π² PHP лишь «капля Π² ΠΌΠΎΡ€Π΅Β», ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ самыС частыС случаи, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ расход памяти ΠΈ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒ сСбя ΠΎΡ‚ лишнСй Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ Π±ΠΎΠ»ΠΈ.

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ стоило Π±Ρ‹ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ расходования ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ памяти ΠΏΡ€ΠΈ использовании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠ΄Π½Π°ΠΊΠΎ Π²Π²ΠΈΠ΄Ρƒ обилия Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ.

PS: МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ это Π½Π° нСсколько статСй, Π½ΠΎ Π½Π΅ Π²ΠΈΠΆΡƒ Π² этом смысла, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π»ΡƒΡ‡ΡˆΠ΅ всё ΠΆΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ «вмСстС». Полагаю Ρ‚Π΅ΠΌ, ΠΊΠΎΠΌΡƒ данная информация нСсСт практичСский смысл, Ρ‚Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅. Π’Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ Π½Π° PHP 5.3.2 (Ubuntu 32bit), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ваши значСния ΠΏΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π±Π°ΠΉΡ‚Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ.

UPD
Π’ основной части ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π΅ Π±Ρ‹Π» освСщСн Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.
Если Π΅ΡΡ‚ΡŒ пСрСмСнная Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ создана ссылка, Ρ‚ΠΎ ΠΏΡ€ΠΈ Π΅Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ скопирована сразу, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° copy-on-write оптимизация.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² PHP

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚. БСгодня Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π² PHP Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π½Π° самом Π΄Π΅Π»Π΅ скрываСт Π·Π° собой довольно простой ΠΊΠΎΠ΄. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ большС ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, опуская ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Π΅Ρ‚Π°Π»ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. На ΠΌΠΎΠΉ взгляд, для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π½Π° языкС PHP Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ знания ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° PHP, Π½Π΅ΠΆΠ΅Π»ΠΈ всё Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ устройство ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°. Ну Π° Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Π²ΡˆΠΈΠ΅ΡΡ Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠΎΠΉ люди Π»Π΅Π³ΠΊΠΎ нагуглят ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅. Π˜Ρ‚Π°ΠΊ, приступим.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π°Π½Π°Π»ΠΈΠ·Π° памяти

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ стоит ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ функциями, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌΠΈ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎΠ± использовании памяти. Начнём с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ memory_get_usage($real_usage = null).

Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство памяти Π² Π±Π°ΠΉΡ‚Π°Ρ…, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ скрипту Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Π±Π΅Π· ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²), ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство памяти, Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ΅ процСссом для Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹:

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΅ΠΉ СдинствСнно Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ‚ΠΈΠΏΠ° boolean, Ρ€Π°Π²Π½ΠΎΠ³ΠΎ true, функция Π²Π΅Ρ€Π½Ρ‘Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ количСство памяти, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ всСгда большС, Ρ‡Π΅ΠΌ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

ΠŸΠΎΠΈΠ³Ρ€Π°Π΅ΠΌΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ с этими функциями, напишСм нСбольшой скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ сначала Π·Π°Π±ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒ ΠΈΡ…:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ скрипта:

Requested: 343 KB
Allocated: 2048 KB

Requested: 10583 KB
Allocated: 12288 KB

Requested: 343 KB
Allocated: 2048 KB

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ скрипта количСство Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти сначала ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎΡΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Π΅Ρ€Π½ΡƒΠ»ΠΎΡΡŒ Π² исходноС состояниС.

Рассмотрим Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ memory_get_peak_usage($real_usage = null)
Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ объСм памяти Π² Π±Π°ΠΉΡ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π²Ρ‹Π΄Π΅Π»Π΅Π½ PHP скрипту Π·Π° всё ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя выполнСния Π΄ΠΎ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°. Как ΠΈ Ρƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ рассмотрСнной Π½Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρƒ Π½Π΅Ρ‘ Π΅ΡΡ‚ΡŒ СдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ смысл. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΠΌ наш скрипт Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ:

Requested: 344 KB
Allocated: 2048 KB

Requested: 10584 KB
Allocated: 12288 KB

Requested: 344 KB
Allocated: 2048 KB

Peak requested: 10584 KB
Peak allocated: 12288 KB

Ѐункция ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π•Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ скрипта ΠΊΠ°ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ быстрого Π°Π½Π°Π»ΠΈΠ·Π° эффСктивности ΠΊΠΎΠ΄Π° ΠΏΠΎ памяти.

Π§Ρ‚ΠΎ происходит Π½Π° самом Π΄Π΅Π»Π΅?

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΡƒΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΎΠ± использовании памяти. Рассмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½Π°ΠΌ всё ΠΆΠ΅ придётся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ³Π»ΡƒΠ±ΠΈΡ‚ΡŒΡΡ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ языка PHP. ВсС значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ структурой zval. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° zval состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΏΠΎΠ»Π΅ΠΉ. НС Π±ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΎΡΡ‚Ρ€ΡΡ‚ΡŒ своё Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ это всё устроСно. Нам лишь достаточно Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это Π·Π° поля, ΠΈ для Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹. Π˜Ρ‚Π°ΠΊ, эти поля:

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС нашСго ΠΊΠΎΠ΄Π° происходит созданиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² ΠΊΡƒΡ‡Π΅ выдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, создаётся структура zval ΠΈ заполняСтся ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 123. Π—Π°Ρ‚Π΅ΠΌ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ мСстС, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ символов, создаётся имя Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $var. НаконСц, устанавливаСтся связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π² памяти. Π’Π΅ΠΏΠ΅Ρ€ΡŒ пСрСмСнная $var ссылаСтся Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 123.

php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. 73b62b51ad6870817a7e8aafbca634d76404bc86df870e235e5965c79b7c832c. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта Ρ„ΠΎΡ‚ΠΎ. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта-73b62b51ad6870817a7e8aafbca634d76404bc86df870e235e5965c79b7c832c. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° 73b62b51ad6870817a7e8aafbca634d76404bc86df870e235e5965c79b7c832c. (PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ поля структуры zval ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

Π§Ρ‚ΠΎ ΠΆΠ΅ происходит, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ unset($var)? Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ символов удаляСтся имя $var, послС Ρ‡Π΅Π³ΠΎ Π² структурС zval Π² ΠΏΠΎΠ»Π΅ число ссылок устанавливаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π° это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ большС Π½Π΅ ссылаСтся Π½ΠΈ ΠΎΠ΄Π½ΠΎ имя. PHP, видя это, ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, освобоТдая Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ ΠΈΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ.
Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, Ссли вмСсто unset, ΠΌΡ‹ присвоим Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null? ΠŸΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ€Π°Π·Ρ€Ρ‹Π² связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌΠ΅Π½Π΅ΠΌ $var ΠΈ Π΅Ρ‘ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. $var пСрСстаёт ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ $var – это просто имя, ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΊΡ€ΠΎΠΌΠ΅. Число ссылок Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² этом случаС Ρ‚ΠΎΠΆΠ΅ станСт Ρ€Π°Π²Π½ΠΎ 0 ΠΈ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΎ.

Бсылки

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС ΠΌΡ‹ создаём ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ присваиваСм Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ΡƒΡ‚ всё понятно, это ΠΌΡ‹ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠ»ΠΈ.
На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $var2 присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $var1. Однако, Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅ всё Ρ‚Π°ΠΊ просто, ΠΊΠ°ΠΊ каТСтся. ΠœΡ‹ ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΊΡƒΡ‡Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ скопировано, ΠΈ Π½ΠΎΠ²ΠΎΠ΅ имя Π½Π°Ρ‡Π½Ρ‘Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π½ΠΎΠ²ΠΎΠ΅ созданноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ πŸ™‚
На самом Π΄Π΅Π»Π΅, послС выполнСния Π²Ρ‚ΠΎΡ€ΠΎΠΉ строки имя $var2 Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ всё Π΅Ρ‰Ρ‘ Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ zval. ΠŸΡ€ΠΈ этом Ρƒ этого zval Π² ΠΏΠΎΠ»Π΅ число ссылок Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ число 2. ΠŸΡ€ΠΎΡˆΡƒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ ссылками ΠΌΡ‹ сСйчас ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅ΠΌ Π½Π΅ ссылки PHP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ со Π·Π½Π°ΠΊΠ° &, Π° связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² этом zval Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚.
ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ ΠΊ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ строкС. А Π²ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ создан Π½ΠΎΠ²Ρ‹ΠΉ zval! Назовём Π΅Π³ΠΎ zval2, Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ β€” zval1. Рассмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ. А ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 12345 ΠΈ создан Π½ΠΎΠ²Ρ‹ΠΉ zval (zval2) с этим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, имя $var1 Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ссылаСтся Π½Π° zval2. $var2 ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° zval1, число ссылок Π½Π° zval1 ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΎΡΡŒ ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ равняСтся 1. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ называСтся copy-on-write. Благодаря Π΅ΠΌΡƒ PHP создаёт Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. НадСюсь, Ρ‚ΡƒΡ‚ всё понятно.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹:

Рассмотрим Π²Ρ‚ΠΎΡ€ΡƒΡŽ строку. Благодаря символу & ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $var2 происходит присваиваниС ΠΏΠΎ ссылкС значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $var1. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этого появляСтся лишь Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ имя, ΡΡΡ‹Π»Π°ΡŽΡ‰Π΅Π΅ΡΡ Π½Π° Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΡˆΠ»Π° ΠΏΠΎΡ€Π° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚ΠΎΠΌ ΠΏΠΎΠ»Π΅ Π² структурС zval, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π²Ρ‹ΡˆΠ΅ всСгда Π±Ρ‹Π»ΠΎ Ρ€Π°Π²Π½ΠΎ 0. Π—Π΄Π΅ΡΡŒ-Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΈ прСвращаСтся Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. И значСния ΠΏΠΎΠ»Π΅ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ zval становятся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ:

Благодаря этому Ρ„Π»Π°Π³Ρƒ PHP опрСдСляСт, Ρ‡Ρ‚ΠΎ этот zval Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ скопирован ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ, Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ лишь Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этого, ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ строкС, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ссылаСтся имя $var1 Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° 12345. На это ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ссылаСтся имя $var2. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этого ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ значСния $var2 ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” 12345.
Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ unset($var1), Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ удалится, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ доступно ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ $var2. Π’ zval ΠΏΡ€ΠΈ этом число ссылок ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡΡ Π΄ΠΎ 1, Π° ΠΏΠΎΠ»Π΅, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅ Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ являСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌΡΡ ΠΏΠΎ ссылкС станСт Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² PHP

php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. d8cb840391e0fa43cb1740a3216539c8ae28be40a4b3e6b461def3d7a6a66003. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта Ρ„ΠΎΡ‚ΠΎ. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта-d8cb840391e0fa43cb1740a3216539c8ae28be40a4b3e6b461def3d7a6a66003. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° d8cb840391e0fa43cb1740a3216539c8ae28be40a4b3e6b461def3d7a6a66003. (PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΆΠ΅ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΈ присваивании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ массивов, вСдь ΠΎΠ½ΠΈ, ΠΊΠ°ΠΊ Π’Ρ‹ ΡƒΠΆΠ΅ Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅ догадались, Π²Π΅Π΄ΡƒΡ‚ сСбя нСсколько ΠΈΠ½Π°Ρ‡Π΅.

Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Ρ‘ΠΌ. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ символов, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранятся ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…? Π’Π°ΠΊ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ† Π½Π° самом Π΄Π΅Π»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ΄Π½Π° ΠΈΠ· этих Ρ‚Π°Π±Π»ΠΈΡ† ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для хранСния ΠΈΠΌΡ‘Π½ Π² глобальной области видимости, Π° вторая Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ func().
Π§Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ func()? А ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° присваиваниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΡƒΠΆΠ΅ рассматривали. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ символов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, это имя Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ глобальная пСрСмСнная $var.

php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. e51cfa0a16593335a359dbdf277896470a151ea7d71070d30e9bb43944ef2032. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта Ρ„ΠΎΡ‚ΠΎ. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта-e51cfa0a16593335a359dbdf277896470a151ea7d71070d30e9bb43944ef2032. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° e51cfa0a16593335a359dbdf277896470a151ea7d71070d30e9bb43944ef2032. (PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° zval ΠΏΡ€ΠΈ этом сСйчас содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π΄Π²ΡƒΡ… ссылках Π½Π° Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. И лишь Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ скопировано ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ, Π° имя ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ символов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°Ρ‡Π½Ρ‘Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° это Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ происходит Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° процСсс присваивания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈ снова Π² дСйствии ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ copy-on-write.

Рассмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ΠžΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° отличаСтся лишь Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ Π·Π½Π°ΠΊΠ° & ΠΏΠ΅Ρ€Π΅Π΄ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Рассмотрим, Ρ‡Ρ‚ΠΎ происходило со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ zval. ПослС опрСдСлСния глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $x происходит Π΅Ρ‘ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎ ссылкС. Число ссылок Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡŒ Ρ€Π°Π²Π½Ρ‹ΠΌ Π΄Π²ΡƒΠΌ, Π° Ρ„Π»Π°Π³, говорящий ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ссылкС, Π΄Π°Ρ‘Ρ‚ PHP ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π° стоит ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ нСпосрСдствСнно Π΅Π³ΠΎ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, история Ρ‚Π° ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ с простым присваиваниСм ΠΏΠΎ ссылкС.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

Рассмотрим Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:

Π’Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

ПослС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ измСнСнию Π΅Π³ΠΎ свойства Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Ρ‘, ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ свойство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° измСнилось ΠΈ Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΡ‚ΡΡŽΠ΄Π°, ΠΊΠ°ΠΊ Π’Ρ‹ ΡƒΠΆΠ΅ догадались, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ всСгда ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ссылкС, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π±Ρ‹Π» Π»ΠΈ Π·Π½Π°ΠΊ & ΠΏΠ΅Ρ€Π΅Π΄ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π”Π° ΠΈ навСрняка Π’Ρ‹ ΡƒΠΆΠ΅ Π΄ΠΎ этого ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² PHP всСгда ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ссылкС. Π’Π°ΠΊ Π²ΠΎΡ‚ это Π½Π΅ Ρ‚Π°ΠΊ πŸ™‚
Но ΠΌΡ‹ ΠΆΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅, ΠΊΠ°ΠΊ это Π½Π΅ Ρ‚Π°ΠΊ? Объясняю. Π’ΠΈΠ΄Π΅Π»ΠΈ Π½Π° самом Π΄Π΅Π»Π΅ ΠΌΡ‹ лишь ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ свойства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² PHP прСдставляСт собой лишь ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для поиска Π΄Π°Π½Π½Ρ‹Ρ… этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° поля zval ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

А Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ обращСния ΠΊ свойству. ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° происходит поиск свойства ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π΅Π³ΠΎ модификация. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ самого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΈ этом остаётся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ:

Π’Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

Как Π²ΠΈΠ΄ΠΈΠΌ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ измСнился. А всё Π΄Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ присваивания ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ символов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ значСния ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния, Π° Ρƒ zval ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° число ссылок ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΎΡΡŒ Π΄ΠΎ 1.
Если Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ всё ΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ & ΠΏΠ΅Ρ€Π΅Π΄ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π’ΠΎ Π²Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

ΠžΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ, Π΄ΡƒΠΌΠ°ΡŽ, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠΎ ссылкС, рассмотрСнноС Ρ€Π°Π½Π΅Π΅.
Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ присваивании ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΅Π³ΠΎ свойствами, Π½Π΅ производя ΠΏΡ€ΠΈ этом Π΅Π³ΠΎ копирования позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² PHP эффСктивноС Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй (dependency injection).
ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Π—Π΄Π΅ΡΡŒ Π² конструкторС класса Db происходит ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Config. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ свойства (ΠΊΠ°ΠΊ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ) Π½Π΅ выполняя ΠΏΡ€ΠΈ этом копирования ΠΈ Π½Π΅ расходуя ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π”Π°, Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ Π²ΠΎΡ‚ PHP ΡƒΠΌΠ½Ρ‹ΠΉ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ.
Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΅Π³ΠΎ ΠΊΠΎΠΏΠΈΠ΅ΠΉ, внося измСнСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π΅ΠΉ. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ конструкция clone.
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊ:

Или Π΄Π°ΠΆΠ΅ нСпосрСдствСнно ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

ΠœΠ°ΡΡΠΈΠ²Ρ‹

ПослС выполнСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ создан Π½ΠΎΠ²Ρ‹ΠΉ массив $arr2, содСрТащий Π² сСбС элСмСнты $arr1, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π½Π° 2. ΠŸΡ€ΠΈ этом Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ значСния массива $arr1 ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΈ Π² ΠΈΡ‚ΠΎΠ³Π΅ заняли Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ количСство памяти, Ρ‡Ρ‚ΠΎ ΠΈ исходный массив.

Π”Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ пройдётся ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ $arr1 ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ нСпосрСдствСнно Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎ памяти, этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»Π΅Π½.
Аналогично ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΈ с foreach. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты массива ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ:

ЦикличСскиС ссылки ΠΈ сборщик мусора Π² PHP

php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. aa103a0eff9f14ecd03d3cdfb1bab896aed5f5a093ead7485d56609ebe12e3ae. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта Ρ„ΠΎΡ‚ΠΎ. php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта-aa103a0eff9f14ecd03d3cdfb1bab896aed5f5a093ead7485d56609ebe12e3ae. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° php ΠΏΠ°ΠΌΡΡ‚ΡŒ выполнСния скрипта. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° aa103a0eff9f14ecd03d3cdfb1bab896aed5f5a093ead7485d56609ebe12e3ae. (PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

Π’ ΠΏΡ€ΠΎΡˆΠ»Ρ‹Ρ… частях ΡƒΡ€ΠΎΠΊΠ° ΠΌΡ‹ рассмотрСли структуру zval, Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ происходит присваиваниС ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, рассмотрСли Ρ€Π°Π·Π½ΠΈΡ†Ρƒ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΡƒΡ€ΠΎΠΊΠ°Ρ… ΠΌΡ‹ рассматривали ситуации, ΠΊΠΎΠ³Π΄Π° вмСстС с ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ всСх ΠΈΠΌΡ‘Π½ для ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ значСния происходило ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ числа ссылок Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎ 0. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡƒΡ‡Π½ΠΎ ΡƒΠ΄Π°Π»ΡΠ»ΠΎΡΡŒ. Однако Ρ‚Π°ΠΊ происходит Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всСгда, ΠΈ ΠΎΠ± этих ситуациях ΠΌΡ‹ сСйчас ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ.

Для Π½Π°Ρ‡Π°Π»Π° Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒ вас с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ xdebug_debug_zval($var_name);

Она становится доступной послС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Xdebug.
Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Π² ΠΏΡ€ΠΎΡˆΠ»Ρ‹Ρ… ΡΡ‚Π°Ρ‚ΡŒΡΡ… ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ полях структуры zval, ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° количСство ссылок Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π½Π΅ ссылок Ρ‡Π΅Ρ€Π΅Π· &, Π° связСй ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ), Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ссылкС (здСсь ΡƒΠΆΠ΅ Π² Ρ‚ΠΎΠΌ смыслС, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ &).

ЦикличСскиС ссылки

Π’Π°ΠΊ Π²ΠΎΡ‚ ΠΎ Ρ‡Ρ‘ΠΌ это я Π½Π°Ρ‡Π°Π» Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅. Как Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ситуация, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ всСх ΠΈΠΌΡ‘Π½, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, число ссылок Π½Π° это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ останСтся большС 0 ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² памяти.
НапишСм ΠΊΠΎΠ΄, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² массив Π½ΠΎΠ²Ρ‹ΠΌ элСмСнтом самого сСбя ΠΈ вывСсти ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π΅ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ zval.
ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

a: (refcount=2, is_ref=1)=array (0 => (refcount=2, is_ref=1)=…)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли ΠΌΡ‹ сдСлаСм unset($a), refcount ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡΡ Π΄ΠΎ 1, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСстанСт Π±Ρ‹Ρ‚ΡŒ доступным Π½Π°ΠΌ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Π»ΠΈΠ±ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ повиснСт Π² памяти. К соТалСнию, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΡΡ‚Π°Π²ΡˆΠ΅ΠΉ извСстной для нас Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ β€” ΠΈΠΌΠ΅Π½ΠΈ-Ρ‚ΠΎ Π½Π΅Ρ‚. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ этого заявлСния ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΡ‚ΡŒ ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ Π½Π°ΠΌΠΈ Ρ€Π°Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ memory_get_usage(). Для этого помСстим Π² массив элСмСнт, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΈΠ· сСбя строку ΠΈΠ· 100 000 символов. Π­Ρ‚ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ измСнСния Π² памяти. Для создания Ρ‚Π°ΠΊΠΎΠΉ строки ΠΏΡ€ΠΈΠ±Π΅Π³Π½Π΅ΠΌ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ str_repeat(). Код получится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ освободилась. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² массив элСмСнт, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠΉΡΡ Π½Π° этот массив:

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ скриптом памяти вСрнулся ΠΊ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΆΠ΅ случаС этого Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΡ€ΠΈ этом Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ эти Β«Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅Β» Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚ΠΎ здСсь ΠΈΠΌΠ΅Π΅Ρ‚ мСсто Π±Ρ‹Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π΄Π°Π½Π½ΠΎΠΌΡƒ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄Π΅ довольно часто. ОсобСнно ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… β€” Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… мСстах происходит ΠΈΡ… нСявноС использованиС ΠΏΠΎ ссылкС, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· своих свойств ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ссылку Π½Π° сСбя самого.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, PHP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСпосрСдствСнно «для сайтов» ΠΈ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ запроса эти Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹. Если такая ΡƒΡ‚Π΅Ρ‡ΠΊΠ° ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² ΠΏΠ°Ρ€Π΅ мСст, Ρ‚ΠΎ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π½ΠΈΡ‡Π΅Π³ΠΎ уТасного Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚. Однако Ссли это Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠΉ скрипт, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² CLI-Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π²Ρ‹ΠΆΠΈΡ€Π°Π½ΠΈΡŽ всСй доступной памяти. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π² PHP Π΅ΡΡ‚ΡŒ сборщик мусора, ΠΈΠ»ΠΈ ΠΏΠΎ-английски «garbage collector«.

Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора (garbage collector)

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ сборщик мусора всСгда Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½. Π­Ρ‚ΠΎ задаётся Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ zend.enable_gc Π² Ρ„Π°ΠΉΠ»Π΅ php.ini.
Он вызываСтся… На самом Π΄Π΅Π»Π΅ это довольно Π΄ΠΎΠ»Π³ΠΎ ΠΈ слоТно ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ. Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ всё ΠΆΠ΅ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡƒΠ·Π½Π°Ρ‚ΡŒ прямо сСйчас β€” ΠΏΡ€ΠΎΡˆΡƒ сюда.
Π’Π°ΠΊ Π²ΠΎΡ‚, скаТу я Π’Π°ΠΌ, ΠΎΠ½ сам прСкрасно Π·Π½Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ врСмя. ΠœΡ‹ ΠΆΠ΅ остановимся Π½Π° практичСском Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΈ посмотрим Π½Π° Π½Π΅Π³ΠΎ Π² дСйствии. Π˜Ρ‚Π°ΠΊ, этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ вызываСтся ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… условиях ΠΈ занимаСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ удаляСт Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ значСния, возникшиС Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с цикличСскими ссылками. НапишСм ΠΊΠΎΠ΄, Π² бСсконСчном Ρ†ΠΈΠΊΠ»Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, содСрТащиС ссылки Π½Π° самих сСбя с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈΡ… ΠΈΠΌΡ‘Π½. На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ тысячной ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ памяти. Код:

603 KB
790 KB
978 KB
1165 KB
1353 KB
1540 KB
1728 KB
1915 KB
2103 KB
2290 KB
603 KB
.

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ памяти Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя возрастаСт, Π° Π·Π°Ρ‚Π΅ΠΌ возвращаСтся ΠΊ исходному β€” это сборщик мусора Π² Π΄Π΅Π»Π΅. ΠšΡ€ΡƒΡ‚ΠΎ, Π΄Π°?
А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ сдСлаСм Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТал Π² сСбС ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΡ‘ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…:

799 KB
98736 KB
196674 KB
294611 KB
392549 KB
490486 KB
588424 KB
686361 KB
784299 KB
882236 KB
799 KB
98736 KB
…

Π’Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ всё Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ссли Π’Ρ‹ запуститС этот скрипт Ρƒ сСбя, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΡ‹Π΅ Ρ„Ρ€ΠΈΠ·Ρ‹ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ garbage collector’а, Π³Π΄Π΅-Ρ‚ΠΎ Π½Π° сСкунду Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ скрипта остановится. Π­Ρ‚ΠΎ врСмя Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ зависит ΠΎΡ‚ объСма высвобоТдаСмой памяти. И Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅, Π³Π΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Ρ‹Π»ΠΈ довольно ΠΌΠ°Π»Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π° garbage collector’а Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½Π°. Однако, Ρ€Π°Π±ΠΎΡ‚Π° скрипта всё ΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя остановлСна. Π’ этом Π΅Π³ΠΎ минус, Π·Π° всё приходится ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π’Ρ‹ вряд Π»ΠΈ ΠΎΡ‚ этого пострадаСтС, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎΠ± этом слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, особСнно ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Если Π΅ΡΡ‚ΡŒ Ρ„Ρ€ΠΈΠ·Ρ‹ ΠΈ для Вас это ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ β€” Π’Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ Π² ΠΊΠ°ΠΊΡƒΡŽ сторону Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠΏΠ°Ρ‚ΡŒ.

Бпасибо Π·Π° ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅, ТСлаю Π’Π°ΠΌ всСго Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ πŸ˜‰

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *