Возможно, вы действительно не хотите этого делать!
Добавление слоя кэширования в ваше приложение должно быть одним из последних действий, которые вы делаете.Кеширование может выявить огромное количество ошибок в вашем коде, как тонких, так и очевидных.
Если вы пытаетесь улучшить производительность своего кода, вы должны выполнять профилирование кода и устранение реальных узких мест, а не предполагаемых.
Особенно в этом случае.
Ваш пример запроса здесь плохой.Даже ужасноВы извлекаете столбец UID
из каждой строки в таблице, не определяя порядок для этих строк, а затем фактически только извлекаете первую строку, какой бы она ни была.
Даже использование этого запроса, даже если не думать о его кэшировании, опасно. Если это реальный запрос, то ваш код сломан для начала! Результаты, возвращаемые из базы данных, не гарантированно будут в любом конкретном порядке.Действительно, по крайней мере с MySQL вы можете сбросить порядок данных на диске , используя ALTER TABLE ... ORDER BY
.Если вам нужна только одна строка, вы должны использовать предложение ORDER BY
и предложение LIMIT
, не выбирая everything , а затем извлекать только одну строку.
Я собираюсьдействуйте в предположении, что вы упрощенно запросите в качестве примера, и вас порадует быстрый вводный курс по двум или трем APC функциям, которые вам нужно знать.Вы должны прочитать справочные страницы для всех других функций, чтобы понять, как работает APC.
Давайте рассмотрим ваш код.
$stmt=mysqli_prepare($con,"SELECT UID FROM Users");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $UID);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
В этомкод, вы готовите запрос SELECT UID FROM Users
, привязывает первый столбец набора результатов к переменной PHP $UID
, извлекаете одну строку, затем закрываете дескриптор оператора (отбрасывая все остальные результаты).
$UID
содержит единственное значение, которое вы хотите кэшировать.Для кэширования этого значения в APC вы можете использовать apc_store
:
apc_store($key, $UID);
$key
- имя ключа кэша.
Конечно, помещать его в кеш глупо, скажем, не запрашивая базу данных, если нужно.Мы можем использовать apc_fetch
, чтобы сначала найти кэшированное значение.
$value_in_cache = false;
$value = apc_fetch($key, $value_in_cache);
if(!$value_in_cache) {
$value = null;
$stmt = mysqli_prepare($con,"SELECT UID FROM Users");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $value);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
apc_store($key, $value);
}
Этот код всегда будет пытаться вытащить $key
из кэша перед запросом к базе данных, что более вероятно, что вы хотели выполнить.Обратите внимание, что здесь я намеренно не указывал время истечения срока действия кэша.
Вы заметите, что, очевидно, здесь кэшируется только одно значение.Если вы настаиваете на использовании связанных переменных результата, то вам нужно либо вручную создать массив и вместо этого кешировать этот массив.Я настоятельно рекомендую не , используя связанные переменные.Посмотрите на использование mysql_stmt_get_result
для извлечения результирующего набора , из которого вы затем можете получить массив. Остерегайтесь , руководство говорит, что get_result
возвращает логическое значение, но возвращает объект набора результатов в примере кода.YMMV.Могу ли я предложить PDO для ваших будущих проектов?
Независимо от того, какой интерфейс базы данных используется, вы не можете кэшировать только фактический дескриптор оператора или объекты набора результатов, толькоданные, которые они возвращают.