mysql_free_result($rows) vs unset($rows)

Screjet

Новичок
mysql_free_result($rows) vs unset($rows)

Возможно вопрос не относится к этому форуму, потому заранее сорь..

Но вопрос "не дает спокойно уснуть".
Есть ли какая-то принципиальная разница в этих утверждениях? или функции *free* можно смело заменять на unset()?
 

kvn

programmer
или функции *free* можно смело заменять на unset()?
А зачем?
Ты когда $fp = fopen(..) делаешь, ты потом unset($fp) делаешь?
:)

ИМХО, разница есть:
void unset ( mixed var [, mixed var [, ...]] ) - Unset a given variable
bool mysql_free_result ( resource result ) - Free result memory (PHP 3, PHP 4 )

Там у тебя variable, а там resource.
 

Screjet

Новичок
Ага,
значит когда сделаю unset($rows) то память не освободится?
А может есть какой-то мануал по теме "внутренняя органиация переменных, ресурсов, проч. в пхп"?
А, вот еще вопрос (может туда же)
PHP:
$obj = new classObj();
...
unset($obj);
такое утверждение сработает? (а в случае "тяжелого" класса?)
 

deek

Новичок
да, есть мануал.

загляни в секцию "Extending PHP 4.0 - Creating variables".

основная идея - в пхп 3 типа переменных:
1) не использующие хеш-таблицы для хранения (числа, строки, булевые переменные)
2) использующие хеш-таблицы для хранения (массивы, объекты)
3) использующие определенные пользователем структуры для хранения

так вот, пхп знает, как освободить память у 1 и 2 при вызове unset. в zend api, они соответственно имеют тип zval*

он понятия не имеет, что в себе содержат определенные пользователем структуры 3.
в этой структуре могут быть всякие хитрые открытые дескрипторы, с которыми в свою очередь ассоциирована память. выделением и освобождением этой памяти занимается API какого-то конкретного продукта (mysql, curl, windows com ...).
при создании переменной типа 3, надо еще регистрировать функцию обратного вызова - "деструктор" - которая будет правильно освобождать память, занятую этой структурой и правильно закрывать все дескрипторы.

так вот, unset(...) эту функцию обратного вызова ("деструктор") по идее дергать не умеет. ее умеет дергать только garbage collector, который освобождает память после завершения работы скрипта. может, так устроено потому, что освобождение памяти и закрытие дескрипторов может занять много времени для хитрой структуры.

я в исходники не лазил, по глядя на обилие функций типа "fclose(...), mysql_free_result(...), ...", подозреваю, что все-таки прав.
 
Сверху