Выпуск результатов кэширования с использованием PHP и APC в Windows - PullRequest
0 голосов
/ 22 июля 2010

Просто для записи, я использую Windows Vista с XAMPP (PHP 5.3.1).

Я пытаюсь использовать APC для кэширования результата базы данных. Я сделал простой тест APC на строковые переменные, и, кажется, работает нормально. Однако, когда я пытаюсь сделать то же самое с ресурсом результатов базы данных, я получаю жалобу, что данные в кэше «не являются допустимым ресурсом результатов MySQL» всякий раз, когда я хочу их использовать.

Вот мой код:

$key_hash_str = md5($query_sql_str);
$cache_res = Mox_Cache_APC::fetch($key_hash_str);;

switch(true)
{
case (!$cache_res):
    $query_result_res = self::executeQuery($query_sql_str);
    Mox_Cache_APC::store($key_hash_str, $query_result_res);
    return $query_result_res;                   
break;

default:
    return $cache_res;
}

Mox_Cache_APC - это мой класс APC, а выборка и хранение - это просто абстракции для apc_fetch () и apc_store (). executeQuery - это статическая функция, определенная в классе, где написан этот код (как очевидно, для выполнения запроса).

Я что-то не так делаю? Что мне нужно сделать с набором результатов перед кэшированием?

Просьба сообщить.

Ответы [ 2 ]

1 голос
/ 22 июля 2010

Этого следовало ожидать.Вы не можете кэшировать ресурсы базы данных.

Фактически, вы не можете кэшировать любые другие ресурсы PHP .Ресурсы PHP - это особый тип.Сама переменная содержит только идентификатор и тип ресурса.Этот идентификатор может использоваться функциями, которые принимают этот тип ресурса, для извлечения его данных и манипулирования ими;однако сам PHP ничего не знает об этом значении (в том числе о том, насколько оно велико и зависит ли оно от других ресурсов).

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

Если вы хотите, вы можете кэшировать результаты в виде массива.

1 голос
/ 22 июля 2010

Краткий ответ: Вы не можете сохранить исходный ресурс результатов.Вы можете извлечь его в собственный массив (используя что-то вроде mysql_fetch_assoc()) и затем сохранить его, но не ресурс.

Однако почему бы просто не включить кэширование запросов MySQL?Это делает то же самое, что и это.Конечно, для этого требуется дополнительная обратная передача по TCP на сервер базы данных, но он автоматически удалит устаревшие результаты кэша из базы данных при вставке / обновлении / удалении строк из таблицы ... Если только вы не выполняете сотни запросов на одномстраница, это должно быть примерно одинаково по производительности ...

...