Что такое Copy-on-Write (COW) в PHP?

«Что такое Copy-on-Write (COW) в PHP?» — вопрос из категории PHP Core, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Copy-on-Write (COW) — это внутренняя оптимизация в PHP, которая откладывает фактическое копирование данных (например, массива или строки) до момента, когда одна из переменных пытается изменить эти данные. Пока данные только читаются, несколько переменных могут ссылаться на одну и ту же область памяти, что экономит ресурсы.

Наглядный пример с массивом:

// Исходный массив занимает память X
$originalArray = [1, 2, 3, 4, 5];

// Присваивание. Копирования НЕТ.
// $copyArray и $originalArray ссылаются на одни и те же данные (zval).
$copyArray = $originalArray;

// Пока мы только читаем, память не дублируется.
echo $copyArray[0]; // Выводит: 1

// МОМЕНТ КОПИРОВАНИЯ (Write).
// Теперь, когда мы пытаемся изменить $copyArray,
// PHP создает физическую копию данных для $copyArray.
$copyArray[] = 6;

// Теперь $originalArray и $copyArray — это два независимых массива в памяти.
print_r($originalArray); // [1, 2, 3, 4, 5]
print_r($copyArray);     // [1, 2, 3, 4, 5, 6]

Где это применяется и почему важно:

  1. Передача аргументов в функцию: При передаче массива в функцию по значению копия создается только если функция его модифицирует.
  2. Возврат из функции: Возвращаемый массив не копируется, пока вы не попытаетесь его изменить.
  3. Экономия памяти: В сценариях с большими массивами, которые часто присваиваются, но редко меняются, COW дает значительный выигрыш в производительности и потреблении памяти.

Важное отличие для объектов: Начиная с PHP 5, объекты по умолчанию передаются и присваиваются по ссылке на объект (object handle). Механизм COW к самим объектам не применяется, но может применяться к их внутренним свойствам-массивам.