Кэширование PHP PDO



Я искал ответ на этот вопрос, но нигде его не нашел. Являются ли вызовы PDO::prepare() кэшированными, или я должен кэшировать результат сам, т. е. если я делаю следующее



function foo () {
$handle = PDO::prepare(...);
/* do stuff with the handle */
}


Будет ли оператор prepare() кэшироваться PDO, чтобы быстро получить второй, третий и т. д. времена? Или лучше сделать это самому, например



function foo() {
static $handle = null;
if (!$handle) {
$handle = PDO::prepare(...);
}
/* do stuff with the handle */
}
889   4  

4 ответов:

Существует кэш запросов MySQL . Но в целом вы должны обязательно сохранить идентификатор для подготовленного оператора и повторно использовать его.

Два последующих вызова PDO::prepare() (даже с одним и тем же SQL-запросом) должны возвращать два разных PDOStatement (или дескриптора), чтобы избежать конфликтов, особенно между предыдущими и текущими привязками, которые вы можете применить к нему. Стоимость создания PDOStatement с prepare() в любом случае невелика. То, что вы можете кэшировать, - это результаты, возвращенные из того же SQL-запроса, либо необработанные, либо построенные prepare (), и это особенность вашей СУБД (например, MySQL), а не PHP.

Это зависит от драйвера базы данных. С MySQL PDO создаст собственный подготовленный оператор по умолчанию. Вы можете отключить его, если хотите использовать реальный кэш запросов.

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

Некоторое время назад я попробовал сделать это CPDO и его можно использовать в качестве стандартного PDO

Comments

    Ничего не найдено.