Magento使用缓存,无法序列化集合

时间:2017-03-08 09:30:45

标签: magento magento-1.9

我正在学习如何使用magento缓存,而且我试图序列化一个集合时有点困难。

实际上这是我的代码:

class Feliu_Featuredcategories_Block_Topcategories extends Mage_Core_Block_Template
{

protected function _construct()
{
    $storeId = Mage::app()->getStore()->getId();
    $this->addData(array(
        'cache_lifetime'            => 3600,
        'cache_tags'                => array(Mage_Catalog_Model_Product::CACHE_TAG),
        'cache_key'                 => 'homepage-most-view-' . $storeId,
    ));
}

public function setData()
{
    $storeId = Mage::app()->getStore()->getId();
    $cache = Mage::app()->getCache();
    $key = 'homepage-most-view-' . $storeId;
    $cached_categories = $cache->load($key);

    if (! $cached_categories) {
        $categories = Mage::getModel('catalog/category')
            ->getCollection()
            ->addAttributeToSelect(array('data', 'name', 'add_to_top_categories'))
            ->addAttributeToFilter('add_to_top_categories', array('eq' => '1'));
        $categories->load();

        $cache->save(serialize($categories), $key);

    } else {
        $categories = unserialize($cached_categories);
    }

    return $categories;
}
}

起初我直接尝试了$cache->save($categories, $key);,但我读到收藏品无法直接保存,而且我收到的错误是:' automatic_serialization必须在'当我尝试将automatic_serialization设置为true时,我收到一条消息,说明出于安全原因无法激活它。

然后我尝试序列化,就像上面的代码所示,但它既不起作用。似乎magento保护集合不被序列化,因为它们可能非常大。

最后,在序列化urlencode()serialize(urlencode($categories))之前,我尝试urldecode(unserialize($categories)),但是在反序列化时我得到了使用此aproach和空字符串序列化的字符串"N;"

我使用magento 1.9.3并且我遵循了此文档和之前的问题:

https://www.nicksays.co.uk/developers-guide-magento-cache/

http://inchoo.net/magento/magento-block-caching/

Magento: serialization error on caching Collection

Magento how to cache a productCollection

还有其他一些问题,但也许没有必要写太多链接,我不想发垃圾邮件。

编辑:如果是集合我使用像

这样的数组
$categories = array('banana', 'apple', 'kiwi', 'strawberry', 'pomelo', 'melon');

然后代码似乎正常工作

1 个答案:

答案 0 :(得分:0)

最后我解决了它,答案最开始时比我最简单,但是我在这里写的是因为它可能会对将来有所帮助。

由于集合无法缓存或序列化,我使用集合中需要的数据创建了一个数组。

CREATE TABLE #DataDetails
(
StoreName CHAR(3), storeID int
)

CREATE TABLE #JOBTRACKING
(
store_code int, REPAIRNO INT, JOBSTATUS INT, created_Date DATE
)

INSERT #DataDetails VALUES( 'ABC', 1), ('XYZ', 2)
INSERT #JOBTRACKING VALUES (1, 1000, 100, '2017-03-08'), (1, 1001, 100, '2017-03-08'),  (1, 1001, 100, '2017-03-08'),  (1, 1008, 100, '2017-03-08'),  (1, 1009, 100, '2017-03-08')
                     ,(2, 1011, 100, '2017-03-08'), (2, 1011, 100, '2017-03-08'),  (2, 1013, 100, '2017-03-08'),  (2, 1014, 100, '2017-03-08'),  (2, 1015, 100, '2017-03-08'),  (2, 1015, 100, '2017-03-08')


SELECT UL.StoreName, COUNT(1) AS TotalDelivery
FROM #DataDetails AS UL 
LEFT OUTER JOIN #JOBTRACKING AS JT 
ON UL.storeID = JT.store_code
WHERE CAST(JT.created_Date AS date)='2017-03-08'
AND JT.JOBSTATUS=100
AND JT.REPAIRNO IN (SELECT REPAIRNO from #JOBTRACKING j WHERE j.store_code = UL.storeID GROUP BY j.REPAIRNO HAVING COUNT(1) = 1)
GROUP BY UL.StoreName, UL.storeID

我让集合只添加我需要的字段,并选择我想要的数据。

+-----------+---------------+
| StoreName | TotalDelivery |
+-----------+---------------+
| ABC       |             3 |
| XYZ       |             2 |
+-----------+---------------+

现在我创建一个包含我想要的数据的对象的数组。下一步是序列化我刚刚制作的数组并将其保存在缓存中。

$categories = Mage::getModel('catalog/category')
    ->getCollection()
    ->addAttributeToFilter('add_to_top_categories', array('eq' => '1'))
    ->addAttributeToSelect(array('data', 'name'));

并检索数据就像 $array = array(); foreach ($categories as $_category) { array_push($array, array('url' => $_category->getUrl(), 'name' => $_category->getName())); }

一样简单