Magento 启用 Memcached 缓存的设置方法
原生支持使用 Memcached 缓存,但是需要在配置文件中进行设置。
先不废话,上代码(app/etc/local.xml):
<global>
...
<cache>
<auto_refresh_fast_cache>true</auto_refresh_fast_cache>
<backend>memcached</backend>
<backend_options>
<servers>
<server>
<host>localhost</host>
<port>11211</port>
<persistent>true</persistent>
<weight>1</weight>
<timeout>1</timeout>
<retry_interval>15</retry_interval>
</server>
</servers>
</backend_options>
</cache>
...
</global>
Memcached 最吸引人的地方主要在于它的分布式,可以实现均衡负载,缓解瞬时访问量大的问题。既然是分布式,那么当然可以使用多个服务器,其中 servers 节点下边就可以添加多个 server 节点,以实现多服务器的配置。
如果在设置 Memcached 之前在后台启用过缓存,那么有可能在开启 Memcached 后访问站点会出现错误,这是默认的缓存格式跟 Memcached 不一样导致的。一般来说只需要把 var/cache 目录下的文件清空就可以解决这个问题。
虽然 Memcached 可以一定程度实现提高运行速度(因为它把缓存暂存到内存中),但它的主要功能还是分布式负载均衡。如果站点瞬时访问量不大,而且使用固态硬盘的话就没有必要使用 memcached 了。
Magento保存不成功是什么原因呢,这个主要是post失败了对于post我们通常可以尝试检查配置问题了,具体的我们一起来看看小编整理的一篇关于Magento post提交数据保存不了的解决办法吧。
部分字段内容太多以致超出该字段在数据表中的限制
尝试修改该字段在数据表中的限制或者修改字段类型。以下是一些类型字段的长度限制:
TEXT – 64K
MEDIUMTEXT – 16M
LONGTEXT – 4G
post 数据的大小超出服务器限制
尝试通过修改 .htaccess 或者服务器设置,增加 php 的 post_max_size 值。
post 数据的数量超出服务器限制
尝试通过修改 .htaccess 或者服务器设置,增加 php 的 max_input_vars 值。
post 数据深度(层数)超出服务器限制
尝试通过修改 .htaccess 或者服务器设置,增加 php 的 max_input_nesting_level 值。
服务器安装了 Suhosin 系统导致部分 post 数据被过滤
尝试修改服务器过滤设置或者直接关闭 Suhosin 系统;
通过 file_get_contents(‘php://input’) 方法获取输入数据,并写程序处理这些数据以代替 $_POST
检查链接是否有错误
链接错误通常有两个可能,一个是拼写错误;另一个是后台开启了将 store view code 加在链接里,但测试的时候没有写到地址栏 – -
检查组件是否已打开
有的时候因为某些原因组件没有被开启,这样相关的控制器自然不可用了。可以到后台 System / Configuration > ADVANCED / Advanced 查找组件是否存在于列表中。
如果组件确实没有打开,一般都是配置文件或者程序的拼写问题导致的。特别是那种本地可用但放到服务器上出问题的,百分之七十都是因为大小写不正确 – -
检查组件的 config.xml 配置文件
以原生产品组件为例,前台控制器的配置方式如下:
<config>
...
<frontend>
<routers>
<catalog>
<use>standard</use>
<args>
<module>Mage_Catalog</module>
<frontName>catalog</frontName>
</args>
</catalog>
</routers>
</frontend>
...
</config>
如果需要重写这个控制器,可以这样配置:
<config>
...
<frontend>
<routers>
<catalog>
<args>
<modules>
<Infinity_Catalog before="Mage_Catalog">Infinity_Catalog</Infinity_Catalog>
</modules>
</args>
</catalog>
</routers>
</frontend>
...
</config>
检查组件及控制器的文件名、类名、方法名
Magento 的组件目录有两个控制器相关的文件夹,一个是 Controller,另一个是 controllers。前者一般是用来定义路由方法的,似乎比较少用到;后者才是控制器安放的地方。与其他常用部件(Block、Helper、Model)不同,控制器文件夹的首字母是小写,且末尾有个 s(很想吐槽做架构那位是暗恋小s么,好吧我知道你 “小” 是因为重写方法跟 “大” 的不一样,“s” 是用来跟 Controller 作区分)。
控制器的文件名是
[控制器名(首字母大写)]Controller.php
比如原生产品前台控制器文件名为 ProductController.php。也是跟其他常用部件(Block、Helper、Model)不一样,后边带了个 Controller。
控制器的类名是
[命名空间(首字母大写)]_[组件名(首字母大写)]_[控制器名(首字母大写)]Controller
比如原生产品前台控制器类名为 Mage_Catalog_ProductController。还是跟其他常用部件(Block、Helper、Model)不一样,把 “Controller” 这个特征名词放到了类名末尾,而不是 [组件名] 之后。
行为的方法名是
[行为(首字母小写)]Action
且该方法必须是 public 的,一般不带参。比如原生前台产品详细页方法名这样定义的:public function viewAction()。
通过插入代码检查
一般来说通过以上几步就可以解决问题了,如果还是不行的话就要到以下两个方法中插入 log 代码,检查相关的模块、控制器、行为是否出了什么问题。
Mage_Core_Controller_Varien_Router_Standard::match
Mage_Core_Controller_Varien_Front::dispatch
<?php
/*
* 文件夹复制类,
* 吴钧泽 2015年11月2日16点29分
*/
class CopyFile
{
public $fromFile;
public $toFile;
/*
* $fromFile 要复制谁
* $toFile 复制到那
*/
function copyFile($fromFile,$toFile){
$this->CreateFolder($toFile);
$folder1=opendir($fromFile);
while($f1=readdir($folder1)){
if($f1!="." && $f1!=".."){
$path2="{$fromFile}/{$f1}";
if(is_file($path2)){
$file = $path2;
$newfile = "{$toFile}/{$f1}";
copy($file, $newfile);
}elseif(is_dir($path2)){
$toFiles = $toFile.'/'.$f1;
$this->copyFile($path2,$toFiles);
}
}
}
}
/*
* 递归创建文件夹
*/
function CreateFolder($dir, $mode = 0777){
if (is_dir($dir) || @mkdir($dir,$mode)){
return true;
}
if (!$this->CreateFolder(dirname($dir),$mode)){
return false;
}
return @mkdir($dir, $mode);
}
}
//使用方法
//引入本类,直接new copyFile('要复制谁','复制到那');
//$file = new CopyFile('./10010','./10010copy');
?>
代码如下 | 复制代码 |
/**
* 获取文章列表 * @param int $count 数量 * @param null $cate 分类ID * @param null $auth 用户ID * @param null $date 日期 * @param null $tags 标签 * @param null $search 搜索关键词 * @param null $order 排序 * @param null $option * @return array|mixed */ function TcgetList($count = 10, $cate = null, $auth = null, $date = null, $tags = null, $search = null, $option = null,$order=null) { global $zbp; if (!is_array($option)) {
$option = array(); } if (!isset($option['only_ontop']))
$option['only_ontop'] = false; if (!isset($option['only_not_ontop'])) $option['only_not_ontop'] = false; if (!isset($option['has_subcate'])) $option['has_subcate'] = false; if (!isset($option['is_related'])) $option['is_related'] = false; if ($option['is_related']) {
$at = $zbp->GetPostByID($option['is_related']); $tags = $at->Tags; if (!$tags) return array(); $count = $count + 1; } if ($option['only_ontop'] == true) {
$w[] = array('=', 'log_IsTop', 0); } elseif ($option['only_not_ontop'] == true) { $w[] = array('=', 'log_IsTop', 1); } $w = array();
$w[] = array('=', 'log_Status', 0); $articles = array();
if (!is_null($cate)) {
$category = new Category; $category = $zbp->GetCategoryByID($cate); if ($category->ID > 0) {
if (!$option['has_subcate']) {
$w[] = array('=', 'log_CateID', $category->ID); } else { $arysubcate = array(); $arysubcate[] = array('log_CateID', $category->ID); foreach ($zbp->categorys[$category->ID]->SubCategorys as $subcate) { $arysubcate[] = array('log_CateID', $subcate->ID); } $w[] = array('array', $arysubcate); }
}
} if (!is_null($auth)) {
$author = new Member; $author = $zbp->GetMemberByID($auth); if ($author->ID > 0) {
$w[] = array('=', 'log_AuthorID', $author->ID); } } if (!is_null($date)) {
$datetime = strtotime($date); if ($datetime) { $datetitle = str_replace(array('%y%', '%m%'), array(date('Y', $datetime), date('n', $datetime)), $zbp->lang['msg']['year_month']); $w[] = array('BETWEEN', 'log_PostTime', $datetime, strtotime('+1 month', $datetime)); } } if (!is_null($tags)) {
$tag = new Tag; if (is_array($tags)) { $ta = array(); foreach ($tags as $t) { $ta[] = array('log_Tag', '%{' . $t->ID . '}%'); } $w[] = array('array_like', $ta); unset($ta); } else { if (is_int($tags)) { $tag = $zbp->GetTagByID($tags); } else { $tag = $zbp->GetTagByAliasOrName($tags); } if ($tag->ID > 0) { $w[] = array('LIKE', 'log_Tag', '%{' . $tag->ID . '}%'); } } } if (is_string($search)) {
$search=trim($search); if ($search!=='') { $w[] = array('search', 'log_Content', 'log_Intro', 'log_Title', $search); } } if(!empty($order)){
if($order=='new'){ $order = array('log_PostTime'=>'DESC'); } if($order=='hot'){ $order = array('log_ViewNums'=>'DESC'); } if($order=='comm'){ $order = array('log_CommNums'=>'DESC'); } if($order=='rand'){ $order = array('rand()'=>' '); } } $articles = $zbp->GetArticleList('*', $w, $order, $count, null, false);
if ($option['is_related']) {
foreach ($articles as $k => $a) { if ($a->ID == $option['is_related']) unset($articles[$k]); } if (count($articles) == $count){ array_pop($articles); } } return $articles;
}
|
代码如下 | 复制代码 |
{$array=TcgetList(10,null,null,null,null,null,null,'rand');}
<ul id="related"> {foreach $array as $related} <li><span class="time">{$related.Time('m-d')}</span><span class="title"><a href="{$related.Url}" title="{$related.Title}">{$related.Title}</a></span></li> {/foreach} </ul> |
代码如下 | 复制代码 |
{$array=TcgetList(10,null,null,null,null,null,null,'hot');}
<ul id="related"> {foreach $array as $related} <li><span class="time">{$related.Time('m-d')}</span><span class="title"><a href="{$related.Url}" title="{$related.Title}">{$related.Title}</a></span></li> {/foreach} </ul> |
代码如下 | 复制代码 |
{$array=TcgetList(10,null,null,null,null,null,null,'comm';}
<ul id="related"> {foreach $array as $related} <li><span class="time">{$related.Time('m-d')}</span><span class="title"><a href="{$related.Url}" title="{$related.Title}">{$related.Title}</a></span></li> {/foreach} </ul> |
相关文章
- 步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
PHP分布式框架如何使用Memcache同步SESSION教程
本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25- photoshop的直排文字工具,打出的字特别是英文字母,默认排列侧向的,如何调整为正向排列呢?下面我们就来看看标准的罗马对齐方式应该怎么设置。 1、在PS中点击“工具面...2017-01-22
- memche消息队列的原理就是在key上做文章,用以做一个连续的数字加上前缀记录序列化以后消息或者日志。然后通过定时程序将内容落地到文件或者数据库。php实现消息队列的用处比如在做发送邮件时发送大量邮件很费时间的问...2014-05-31
- 本文章来介绍的是小米手机的无线网络wifi的设置方法,有需要学习wifi网络设置上网的朋友可详细的参考参考。 ==进入小米手机的主界面: ==然后点击wifi快速打开的地...2016-09-20
- 很多phper不知道如何在Windows下搭建Memcache的开发调试环境,最近个人也在研究Memcache,记录下自己安装搭建的过程。 ...2016-01-27
在Mac OS的PHP环境下安装配置MemCache的全过程解析
这篇文章主要介绍了在Mac OS的PHP环境下安装配置MemCache的全过程解析,MemCache是一套分布式的高速缓存系统,需要的朋友可以参考下...2016-02-18php memcache和php memcached比较以及问题
php memcache和php memcached是php的memcache分布式的高速缓存系统的两个客户端,php memcache是老客户端,php memcached是功能更加完善的新的代替php memcached的。...2016-11-25PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
这篇文章主要介绍了PHP中eAccelerator、memcached、xcache、APC 4个加速、缓存扩展的区别的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-07-25- 本文章来介绍在手机中如何设置margin哦,我们做网站只要在css定义就好了,在手机中可不一样哦,下面参考在java中的设置方法。 Android在java代码中设置margin 我们平常...2016-09-20
- memcache的官方主页:php教程.net/package/memcache">http://pecl.php.net/package/memcache memcached的官方主页:http://pecl.php.net/package/memcached 以下是我安装...2016-11-25
- php cookie设置,js cookie设置方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">...2016-11-25
- 如果你碰到php 不显示错误的话可能是你php.ini中把错误提示给关了,解决办法很简单我们只要把php.ini中的display_error = off改成on即可。 解决办法 1、php.ini里...2016-11-25
- 代码如下 复制代码 <?php教程 class mycache { private $cache; function __construct() { $this->cache = new memcache();...2016-11-25
- Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱...2016-11-25
- 在php中默认时区与中国相关8小时了,下面我来给大家介绍在于linux中与windows系统解决php时差8小时的方法,希望对各位同学有帮助。 大陆内地可用的值是:Asia/Chongqin...2016-11-25
- session_start启动慢是自己的机器使用了memcache来缓存session了,这样发现用户登录之后mysql查询超级慢了,下面我来介绍一个临时的解决办法。 下面是我们的测试页...2016-11-25
- memcached是一个超高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载了,现在我们就来看看如何配置memcached吧,希望能帮助到大家。 memcached的基本...2016-11-25
- 这篇文章主要介绍了Windows下Memcache的安装及PHP扩展配置方法,需要的朋友可以参考下...2016-01-27
- ◎Memcached是什么 在阐述这个问题之前,我们首先要清楚它“不是什么”。很多人把它当作和SharedMemory那种形式的存储载体来使用,虽然memcached 使用了同样的&...2016-11-25