Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Это кому-то пригодится почти всегда превращается в «Надо и мне такую хрень добавить — это же круто!».
В 5.3 можно активировать специальный сборщик мусора для этой цели
Он включен по умолчанию ( us2.php.net/manual/en/info.configuration.php ). Так что его можно выключить.
, но он замедляет работу скрипта в целом, так что это нежелательно.
Замедляет каждый раз, когда количество отслеживаемых существующих объектов превышает 10 000 (можно переопределить при сборке, нельзя настроить через php.ini). Если после очистки буфер потенциальных целей переполнен, отслеживание новых объектов не производится.
Трекинг потенциальных целей выполняется независимо от состояния опции zend.enable_gc, замедление происходит только при вызове сборщика циклических ссылок. Заставить занимать значительную долю во времени выполнения скрипта можно, но довольно сложно. В целом замедление обычно не превышает 5-7%, при этом экономит солидные объемы памяти (что позволяет обслуживать большее количество клиентов параллельно).
Как исправить эту ошибку? В обеих реализациях сделать это довольно просто, воспользовавшись не слишком часто используемой возможностью PHP – деструктором. Нужно добавить деструктор, принудительно обнуляющий ссылку на владеющий класс, в примесь и деструктор в класс-агрегатор, очищающий список примесей данного класса.
<?php
class A{
public function __destruct() {
echo "Destructor called!\r\n";
}
}
$a = new A();
$a = null;
echo("End of program\r\n");
Вы никогда не пробовали с помощью PHPExcel генерировать несколько больших xls файлов подряд?
Попробуйте следующий кусочек кода:
<?php
class A
{
public $me = null;
public function __construct()
{
$this->me = $this;
}
public function __destruct()
{
var_dump(__METHOD__);
}
}
$q = new A;
$q = null;
flush();
echo "done\n";
flush();
Деструктор вызывается не сборщиком мусора, а тогда, когда я принудительно обнуляю ссылку. И счетчик ссылок для объекта уменьшается соответственно.
ООП практикум в PHP5: Анализ ошибок, преимуществ и недостатков двух различных реализаций примесей в PHP