Каковы правила закрытия подготовленных заявлений? - PullRequest
3 голосов
/ 01 июля 2011

В настоящее время я использую класс SQLite3 для PHP.Я заметил SQLite3Stmt::close(), а также SQLite3Result::finalize().

Обязательно ли вызывать эти функции?У меня возникли проблемы с их вызовом, потому что я точно не знаю, когда они больше не используются в моем классе-обертке базы данных, так как мне придется часто возвращать SQLite3Result

Например:

function execSomething(){
  $stmt = $db->prepare($sql);
  return $stmt->execute();
}

Стоит ли всегда закрывать подготовленное заявление?

Ответы [ 3 ]

0 голосов
/ 12 июля 2011

У меня возникли некоторые проблемы с их вызовом, потому что я точно не знаю, когда они больше не используются в моем классе-обертке базы данных, поскольку мне часто приходится возвращать SQLite3Result

Обычно вы получаете новый объект результата каждый раз, когда выполняете запрос. Это означает, что вы должны закрыть набор результатов, как только вам больше не понадобится .

Однако вам не нужно освобождать каждый ресурс самостоятельно, потому что PHP сделает это за вас, когда закончится выполнение. Если вы не создаете много много (что-то около ... не знаете 50?) Подготовленных утверждений, я не вижу причины, почему вы должны закрывать их сами.

0 голосов
/ 25 июля 2015

Мне тоже было любопытно, потому что для кого-то, незнакомого с PHP и его расширением SQLite3, документация не проясняет, что эти функции на самом деле делают (то есть, что происходит в SQLite, когда вы их вызываете?) :

SQLite3Stmt::close - закрывает подготовленную выписку

SQLite3Result::finalize - Закрывает набор результатов

Взгляд (крайне неквалифицированный) на источник (https://github.com/php/php-src/blob/master/ext/sqlite3/sqlite3.c), на момент написания этой статьи:

SQLite3Result::finalize в PHP_METHOD(sqlite3result, finalize), кажется, в конечном итоге вызывает sqlite3_reset для любого связанного подготовленного оператора, а также освобождает некоторые внутренние структуры данных.

SQLite3Stmt::close, в PHP_METHOD(sqlite3stmt, close), похоже, в итоге освобождает внутренние структуры данных для оператора.

Таким образом, насколько я могу судить, похоже, что речь идет об управлении внутренними ресурсами и вызове вызовов к sqlite3_reset, что в соответствии с документацией SQLite:

"... [сбрасывает] подготовленный объект оператора обратно в исходное состояние, готов быть переоформленным "

Никаких комментариев относительно того, что происходит, когда ваш скрипт завершается, а вы не вызывали их, поскольку я не пытался разобраться в этом.

Все это говорит о том, что я новичок в этом отделе, и я впервые взломал исходный код PHP, поэтому я был бы признателен эксперту по PHP / SQLite3, чтобы исправить что-то неправильное или ввести в заблуждение.

0 голосов
/ 12 июля 2011

Я точно не знаю, когда они больше не используются в моей базе данных класс обёртки

Можете ли вы создать деструктор в своем классе PHP-оболочки, который вызывает эти методы? Когда ваш объект-оболочка уничтожен сборщиком мусора PHP, вы узнаете , что ваши утверждения / результаты больше не будут использоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...