Кэширование 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 */
}
4 ответов:
Существует кэш запросов MySQL . Но в целом вы должны обязательно сохранить идентификатор для подготовленного оператора и повторно использовать его.
Два последующих вызова
PDO::prepare()(даже с одним и тем же SQL-запросом) должны возвращать два разныхPDOStatement(или дескриптора), чтобы избежать конфликтов, особенно между предыдущими и текущими привязками, которые вы можете применить к нему. Стоимость создания PDOStatement сprepare()в любом случае невелика. То, что вы можете кэшировать, - это результаты, возвращенные из того же SQL-запроса, либо необработанные, либо построенные prepare (), и это особенность вашей СУБД (например, MySQL), а не PHP.
Это зависит от драйвера базы данных. С MySQL PDO создаст собственный подготовленный оператор по умолчанию. Вы можете отключить его, если хотите использовать реальный кэш запросов.
Если вам абсолютно необходимо выполнить один и тот же запрос повторно, то да, вы захотите сохранить этот дескриптор. Если вы используете эмулированные подготовленные операторы, то это не имеет никакого значения.
Некоторое время назад я попробовал сделать это CPDO и его можно использовать в качестве стандартного PDO
Comments