Magento:检索未缓存的系统配置值


Magento: Retrieving uncached system configuration values

我有一个脚本,通过RESTful web服务将订单数据发送到第三方系统。该系统要求每个请求都发送一个唯一的ID,该ID从下一个请求开始自动递增。

我通过在Magento的core_config_data表中为此添加一个变量来实现这一点,并且作为我代码的一部分,下面的函数被调用以获取ID的下一个值,并为下一个请求增加它。

class MyProject
{
    public function getNextApiId() {
        // Get the next ID.
        $id = Mage::getStoreConfig('myproject/next_api_id');
        // Increment the stored value for next time.
        $nextId = $id + 1; // change $id++ by $id + 1 otherwise the result of $nextId = $id - 1;
        Mage::getModel('core/config')->saveConfig('myproject/next_api_id',$nextId);
        // Refresh the config.
        Mage::getConfig()->cleanCache();
        Mage::getConfig()->reinit();
        // Return the ID.
        return $id;
    }
}

如果我用我的脚本发送一个请求,这工作得很好-值递增,下一个ID用于脚本的下一次执行。

然而,如果我在同一个脚本执行中循环处理多个请求,则该值似乎被缓存了。下面的代码应该说明一般流程,不过为了简洁起见,我对其进行了简化:

function sendRequest($item) {
    $apiId = $MyProject->getNextApiId();
    // Build and send request body
}
foreach($items as $item) {
    sendRequest($item);
}

这将导致所有$items使用初始ID号。

cleanCache()reinit()尝试刷新配置缓存似乎根本不起作用。关于如何阻止被缓存的值有什么想法吗?

缓存必须以不同的方式清理,由于循环,您必须重置存储的缓存并再次初始化它。如果你没有循环,它也会被清理,但它需要商店的第二个url请求来初始化缓存。

试试这个:

function getNextApiId() {
    // Get the next ID.
    $id = Mage::getStoreConfig('myproject/next_api_id');
    // Increment the stored value for next time.
    $nextId = $id + 1;
    Mage::getConfig()->saveConfig('myproject/next_api_id',$nextId);
    // Refresh the config.
    Mage::app()->getStore()->resetConfig();
    // Return the ID.
    return $id;
}

如果你只是需要一个唯一的id传递给api,为什么要去所有这些麻烦-读写数据库,清理配置缓存等?

在PHP中有很多方法可以做到这一点,这里有一个:
$uniqueId = uniqid();
http://php.net/manual/en/function.uniqid.php

否则,如果你必须使用问题中的方法创建你的id,那么请确保你正确保存了你的配置:

Mage::getConfig()
    ->saveConfig('myproject/next_api_id', $nextId)
    ->cleanCache();
Mage::app()->reinitStores();

Magento配置用于不经常更改的值,这些值会改变某些东西的行为。在配置中存储这个值不仅不符合目的,而且还会给站点带来性能问题。每次清除配置缓存时,站点都必须将配置文件转发到存储在缓存中的缓存XML文档中,这将给站点的加载时间带来不必要的延迟。

我的建议是这样做:

。根据生成的模式(结合进程ID和unix时间戳(微秒))使用UID。

b。使用核心变量模型将值存储在:Mage::getModel('core/variable')->loadByCode('myproject_next_api_id');

我对选项'b'的警告是,如果你有任何可能,这个脚本可能有多个实例同时运行,你遇到竞争条件,需要存储ID记录在数据库中,你通过一个自定义的原子更新查询。

这里有一个简单的替代方法:

protected function _getLastId()
{
    $id = Mage::app()->useCache('config') ?
        Mage::getResourceModel('core/config_data_collection')
            ->addFieldToFilter('path', self::XML_PATH_LAST_ID)
            //->addFieldToFilter('scope', $scope)
            //->addFieldToFilter('scope_id', $scopeId)
            ->getFirstItem()
            ->getValue() :
        Mage::getStoreConfig(self::XML_PATH_LAST_ID);
    return (int) $id;
}

选择的答案,以及许多其他涉及清除缓存的答案,是一个完全的耻辱,因为Mage::app()->getStore()->resetConfig();将导致Mage::getConfig()->reinit();,这是你应该主要调用…从来没有!

它将触发Magento完全重新解析XML配置,这是死慢,随着插件和它们的配置文件数量的增加,更是如此。

我见过一些插件开发者复制粘贴这样的东西,最终给使用这些插件的人带来了巨大的性能问题。不仅仅是使用这些代码,还要巧妙地管理这些代码,以便在每个请求时调用,从而有效地导致配置缓存效率下降到0!

如果你可以简单地更新更改的内容,为什么要清除整个配置缓存?

Mage::app()->getStore()->setConfig('foo', 'bar'); 
Mage::getConfig()->saveConfig('foo', 'bar')->saveCache();

第一行仅更新请求生命周期的配置项(运行时缓存)

第二行确保将相同的内容保存到core_config_data并更新缓存。

但无论如何,@davidalger的答案正确地指出,core_config_data意味着很少更改数据