Есть проблемка такая.
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
$key = md5("SELECT * FROM items");
$result= mysql_query("SELECT * FROM items") or die(mysql_error());
$item = mysql_fetch_array($result);
$memcache->set($key, $item); // Хранить результат 100 секунд
проблема в том что при взятии кеша
$cach_item = $memcache->get($key);
Там находится одна первая запись, а не все записи таблицы.
Подскажите как решить проблему.
Спустя 6 минут, 40 секунд (5.07.2012 - 20:01) Игорь_Vasinsky написал(а):
while() - поможет те забить массив
Спустя 10 минут, 47 секунд (5.07.2012 - 20:12) freelancer89 написал(а):
$item = array();
$result= mysql_query("SELECT * FROM items") or die(mysql_error());
$item = mysql_fetch_array($result);
while($row = mysql_fetch_array($result))
{
$item[] = $row;
}
$memcache->set($key, $item);
Попробовал с While, при выводе все равно только первая позиция поторяется, может я не верно вывожу кэш?
Делаю это вот так
$cach_item = $memcache->get($key);
if ($cach_item ) {
while ($cach_item)
{
echo "<tr>";
echo "<td>";
echo $cach_item['name'];
echo "</td>";
echo "<td>";
echo $cach_item['price'];
echo "</td>";
echo "</tr>";
}
}
Спустя 19 минут, 36 секунд (5.07.2012 - 20:31) Игорь_Vasinsky написал(а):
$item = array();
$result= mysql_query("SELECT * FROM items") or die(mysql_error());
$item = mysql_fetch_array($result);
while($row = mysql_fetch_array($result))
{
echo '<pre>' . print_r($row, 1) . '</pre>';
}
все записи видишь?
Спустя 20 минут, 24 секунды (5.07.2012 - 20:52) freelancer89 написал(а):
ДА, все вижу.
Спустя 25 минут, 49 секунд (5.07.2012 - 21:18) Игорь_Vasinsky написал(а):
$cach_item = $memcache->get($key);
echo '<pre>' . print_r($cach_item, 1) . '</pre>';
а так?
Спустя 4 минуты, 7 секунд (5.07.2012 - 21:22) freelancer89 написал(а):
А так только первую запись.
Спустя 5 минут, 10 секунд (5.07.2012 - 21:27) forza написал(а):
http://www.php.net/manual/en/memcached.setmulti.php
Multiset позволяет хранить массивы.
Простой set хранит $key=>$value (string)
Multiset позволяет хранить массивы.
Простой set хранит $key=>$value (string)
Спустя 8 минут, 57 секунд (5.07.2012 - 21:36) freelancer89 написал(а):
На setMulti ругается
Fatal error: Call to undefined method Memcache::setMulti()
Fatal error: Call to undefined method Memcache::setMulti()
Спустя 29 минут, 22 секунды (5.07.2012 - 22:05) freelancer89 написал(а):
Ага, я вот немного разобрался, есть Memcache а есть Memcached они немного отличаются друг от друга. В Memcached есть как раз setMulti, но все равно не получается то, что надо =(
Спустя 14 минут, 35 секунд (5.07.2012 - 22:20) Игорь_Vasinsky написал(а):
почему?
Спустя 6 минут, 44 секунды (5.07.2012 - 22:27) freelancer89 написал(а):
Теперь скрипт, вроде, добавляет массив в кеш, но не может его извлечь.
теперь скрипт всегда пишет только Data Pulled from the Database.
И в setMulti нет ключа получается по которому можно обратиться в кешу.
Получается если данные и попадают в кэш, не получается его использовать.
<?php
$memcache = new Memcached;
$memcache->addServer('127.0.0.1', 11211) or die ("Could not connect");
include 'connect.php';
$key = "3";
$item = $memcache->get($item);
if ($item ) {
while ($item)
{
echo "<tr>";
echo "<td>";
echo $cach_item['name'];
echo "</td>";
echo "<td>";
echo $cach_item['price'];
echo "</td>";
echo "</tr>";
}
}
else {
// Получить данные из базы и создать кэш
$item = array();
$result= mysql_query("SELECT * FROM items") or die(mysql_error());
while($row = mysql_fetch_array($result))
{
$item[] = $row;
}
//mysql_free_result($result);
$memcache->setMulti($item,300);
echo "Data Pulled from the Database";
}
?>
теперь скрипт всегда пишет только Data Pulled from the Database.
И в setMulti нет ключа получается по которому можно обратиться в кешу.
Получается если данные и попадают в кэш, не получается его использовать.
Спустя 8 минут, 30 секунд (5.07.2012 - 22:35) Игорь_Vasinsky написал(а):
Цитата |
Список параметров items Сохраняемый массив пар ключей/значений. expiration Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта. |
$data = array('Данные', $items);
$memcache->setMulti($data,300);
print_r($data);
Спустя 4 минуты, 18 секунд (5.07.2012 - 22:39) freelancer89 написал(а):
сейчас это дает вывод такой:
Array ( [0] => Данные [1] => )
Array ( [0] => Данные [1] => )
Спустя 11 минут, 21 секунда (5.07.2012 - 22:51) Игорь_Vasinsky написал(а):
погоди..я чёт на сонную голову туплю.
не?
$data = $memcache->setMulti($item,300);
не?
Спустя 2 минуты, 6 секунд (5.07.2012 - 22:53) freelancer89 написал(а):
Тоже не то.
Спустя 6 минут, 54 секунды (5.07.2012 - 23:00) Игорь_Vasinsky написал(а):
Спустя 26 минут, 35 секунд (5.07.2012 - 23:26) forza написал(а):
Спакуха мужики -)
У человека установлен Memcache,а мультисет есть у Memcached.
Решение.
или
У человека установлен Memcache,а мультисет есть у Memcached.
Решение.
$item= serialize($array);
$memcache->set($key, $item);
$get = unserialize($memcache->get($key));
или
$item = json_encode($array);
$memcache->set($key, $item);
$get = json_decode($memcache->get($key), true);
Спустя 19 часов, 14 минут, 17 секунд (6.07.2012 - 18:41) freelancer89 написал(а):
Опять таки, только первая запись в кеше(
Спустя 39 минут, 9 секунд (6.07.2012 - 19:20) vasa_c написал(а):
массив сохраняет обычный set().
setMulti() к этому не имеет отношения.
setMulti() к этому не имеет отношения.
Спустя 53 минуты, 47 секунд (6.07.2012 - 20:14) freelancer89 написал(а):
с set только одна запись таблицы из кеша извлекается.
Спустя 3 минуты, 54 секунды (6.07.2012 - 20:17) inpost написал(а):
Ты слишком рано полез в кеширование данных...
Спустя 2 часа, 59 минут, 10 секунд (6.07.2012 - 23:17) Игорь_Vasinsky написал(а):
а чем сеариализация или ясон не подошел? должна быть строка - вот те строка.
Спустя 23 часа, 53 минуты, 59 секунд (7.07.2012 - 23:11) forza написал(а):
Цитата (Игорь_Vasinsky @ 6.07.2012 - 20:17) |
а чем сеариализация или ясон не подошел? должна быть строка - вот те строка. |
Все должно подходить. Тестил
_____________