我有一个脚本,通过RESTful Web服务将订单数据发送到第三方系统。该系统要求每个请求都发送一个唯一的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);
}
这将导致初始ID号用于所有$items
。
cleanCache()
和reinit()
尝试刷新配置缓存似乎根本不起作用。关于如何阻止缓存价值的任何想法?
答案 0 :(得分:6)
必须以不同的方式清理缓存,您必须重置存储的缓存并再次启动它导致循环。如果你没有循环,它也会被清理,但它需要商店的第二个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;
}
答案 1 :(得分:4)
为什么要去解决这个问题 - 读取和写入db,清除配置缓存等 - 如果您只需要将唯一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();
答案 2 :(得分:4)
Magento配置适用于不经常更改的值,这些值会更改某些内容的行为。不仅在配置中存储此值不符合目的,而且还会在站点中引入性能问题。每次清除配置缓存时,站点都必须将配置文件中继到存储在缓存中的缓存XML文档中,这会给站点的加载时间带来不必要的延迟。
我的建议是做以下其中一项:
一个。根据生成的模式使用UID,该模式包含您的进程ID和unix时间戳(微秒)。
湾使用核心变量模型将您的值存储在:Mage::getModel('core/variable')->loadByCode('myproject_next_api_id');
我的选项'b'的警告是,如果你有可能这个脚本可能同时运行多个实例,你将遇到竞争条件,这需要将记录中的ID存储在您通过自定义原子更新查询更新的数据库。
答案 3 :(得分:1)
这是一个简单的选择:
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;
}
答案 4 :(得分:0)
选定的答案以及涉及清除缓存的许多其他答案是完全可耻的,因为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
意味着很少更改数据。