问:ecshop模板注册界面,不管输入什么用户名都提示用户已存在,是什么原因? 答:ECSHOP的注册会员界面一直提示用户已存在的问题以前我们也碰到过,需要调试,一般是以下两种情况造成的: 1、如果你使用的是UTF-8编码的ECSHOP,要保证user.php页面显示时调用的所有模板文件、语言包、程序页面都是UTF-8编码的,而且要去掉BOM头,否则会出现些莫名其妙的问题。 2、在包含的程序页面中,如/languages/zh_cn/user.php文件,在最后的PHP代码结束标记“?>"后面有多出的空格或换行。 原因有很多种,具体要耐心调试,希望能给你些帮助,ecshop模板吧为您解答,需要更多帮助请百度搜索“ecshop模板吧"www.g58.net
ecshop支持memcache吗?ecshop能使用memcache缓存吗?
ecshop默认是使用smarty模板引擎的磁盘文件缓存机制,为了更高的访问性能,可以给ecshop商城安装配置memcache,将缓存对象存储在内存中,从而提高网站的反应速度,使用memcache还有一个好处是可以使用多台服务器做memcache缓存服务器集群。
有网友问:ecshop支持memcache吗?ecshop能使用memcache缓存吗?
答案是肯定的,当然,因为ecshop设计时没有考虑到支持memcache,所以,改动的地方较多,要让ECSHOP真正的利用memcache的高性能,需要改动程序代码,改造原有的session存储机制、缓存文件存储机制、数据库缓存机制等,工作量不小,但一旦配置好,能给网站性能带来极大的提升。
问:ecshop下怎么安装配置memcached?
其实安装memcache只是第一步,memcache服务器的安装网上有大量的教程,比较简单,要注意的是memcache客户端的安装,网上的教程大部分是介绍安装PHP下的memcache扩展,而不是memcached扩展,要注意这两个扩展名字中相差一个”d”字母,带d字母的memcached扩展是比较新的,性能及功能多一些,推荐安装。
第二步,就是改动ecshop程序以支持memcache,需要改动大量代码,增加相应的memcache操作函数。
ecshop模板吧已经成功为多个客户配置ecshop商城的memcached优化方案,同时搭配LNMP服务器优化方案,可以支持百万级海量数据。有需要的朋友可以和我们联系。
ecshop重复登录问题,会员登录不了,会员登录后马上退出问题解决办法
问题:
近日一客户碰到ECSHOP登录不了的问题,非常奇怪,该客户公司的所有电脑所有浏览器都出现会员登录后马上又提示登录的问题,点击登录按钮后,有提示成功登录,但返回或点击任何页面,登录状态都显示为未登录,各种浏览器都测试过,ecshop总是重复提示登录;我这边测试又能正常登录。
解决办法:
修改文件/includes/cls_session.php
查找代码:
if ($ip == '')
{
$ip = substr($this->_ip, 0, strrpos($this->_ip, '.'));
}
注释或删除掉。
具体原因与客户的IP有关,但不确定到底是什么原因造成。
ecshop注册后自动发送邮件验证,通过邮箱验证成功才能登录!
ecshop模板做二次开发要注册后自动发送邮件验证,验证成功才能登录:
一、可以提示用户立即去验证注册的邮件
二、方验以后推广筛选有效邮箱
现在我们看一下如何注册自动发送邮件验证,验证成功才能登录:
1、注册成功自动发邮件并退出登录状态,提示需要验证邮件才能登录。
在user.php大约233行很234行
把:
$ucdata = empty($user->ucdata)? "" : $user->ucdata;
show_message(sprintf($_LANG['register_success'], $username . $ucdata), array($_LANG['back_up_page'], $_LANG['profile_lnk']), array($back_act, 'user.php'),
'info');
替换成:
$cfg = $_CFG['smtp_user'];
if(!empty($cfg) )
{
$sql="select user_id from ".$GLOBALS['ecs']->table('users') ."where user_name = '$username'";
$user_id=$db->getOne($sql);
send_regiter_hash ($user_id);
}
$user->logout();
show_message('需要验证邮件才能登录', array($_LANG['back_up_page'], $_LANG['back_home_lnk']), array('user.php', 'index.php'), 'info');
购物流程时注册也要相应的修改
打开flow.php大约282行
查找:
if (register(trim($_POST['username']), trim($_POST['password']), trim($_POST['email'])))
将下面代码:
/* 用户注册成功 */
ecs_header("Location: flow.php?step=consignee\n");
exit;
替换成:
$cfg = $_CFG['smtp_user'];
if(!empty($cfg) )
{
$sql="select user_id from ".$GLOBALS['ecs']->table('users') ."where user_name = '".trim($_POST['username'])."'";
$user_id=$db->getOne($sql);
send_regiter_hash ($user_id);
}
$user->logout();
show_message('需要验证邮件才能登录', array($_LANG['back_up_page'], $_LANG['back_home_lnk']), array('flow.php?step=login', 'index.php'), 'info');
2、登录时判断是否通过邮件验证,没通过提示需要验证邮件才能登录。
在includes/lib_mian.php里面php文件结束标签前添加:
function is_validated_emil($username)
{
$sql = "SELECT is_validated" .
" FROM ". $GLOBALS['ecs']->table('users').
" WHERE user_name='" . $username."'";
return $GLOBALS['db']->getOne($sql);
}
用于检测邮箱验证状态!。
修改user.php大约349行
也可查找:
if ($user->login($username, $password,isset($_POST['remember'])))
在下面把:
update_user_info();
recalculate_price();
$ucdata = isset($user->ucdata)? $user->ucdata : '';
show_message($_LANG['login_success'] . $ucdata , array($_LANG['back_up_page'], $_LANG['profile_lnk']), array($back_act,'user.php'), 'info');
改成:
if(is_validated_emil($username) > 0)
{
update_user_info();
recalculate_price();
$ucdata = isset($user->ucdata)? $user->ucdata : '';
show_message($_LANG['login_success'] . $ucdata , array($_LANG['back_up_page'], $_LANG['profile_lnk']), array('user.php','user.php'), 'info');
}
else
{
$user->logout();
show_message('需要验证邮件才能登录', array($_LANG['back_up_page'], $_LANG['back_home_lnk']), array('user.php', 'index.php'), 'info');
}
购物流程时登录也要相应的修改
打开flow.php大约239行
查找:
if ($user->login($_POST['username'], $_POST['password'],isset($_POST['remember'])))
将下面的代码:
update_user_info(); //更新用户信息
recalculate_price(); // 重新计算购物车中的商品价格
/* 检查购物车中是否有商品 没有商品则跳转到首页 */
$sql = "SELECT COUNT(*) FROM " . $ecs->table('cart') . " WHERE session_id = '" . SESS_ID . "' ";
if ($db->getOne($sql) > 0)
{
ecs_header("Location: flow.php?step=checkout\n");
}
else
{
ecs_header("Location:index.php\n");
}
exit;
改为:
if(is_validated_emil($_POST['username']) > 0)
2、登录时判断是否通过邮件验证,没通过提示需要验证邮件才能登录。
在includes/lib_mian.php里面php文件结束标签前添加:
function is_validated_emil($username)
{
$sql = "SELECT is_validated" .
" FROM ". $GLOBALS['ecs']->table('users').
" WHERE user_name='" . $username."'";
return $GLOBALS['db']->getOne($sql);
}
用于检测邮箱验证状态!。
修改user.php大约349行
也可查找:
if ($user->login($username, $password,isset($_POST['remember'])))
在下面把:
update_user_info();
recalculate_price();
$ucdata = isset($user->ucdata)? $user->ucdata : '';
show_message($_LANG['login_success'] . $ucdata , array($_LANG['back_up_page'], $_LANG['profile_lnk']), array($back_act,'user.php'), 'info');
改成:
if(is_validated_emil($username) > 0)
{
update_user_info();
recalculate_price();
$ucdata = isset($user->ucdata)? $user->ucdata : '';
show_message($_LANG['login_success'] . $ucdata , array($_LANG['back_up_page'], $_LANG['profile_lnk']), array('user.php','user.php'), 'info');
}
else
{
$user->logout();
show_message('需要验证邮件才能登录', array($_LANG['back_up_page'], $_LANG['back_home_lnk']), array('user.php', 'index.php'), 'info');
}
购物流程时登录也要相应的修改
打开flow.php大约239行
查找:
if ($user->login($_POST['username'], $_POST['password'],isset($_POST['remember'])))
将下面的代码:
update_user_info(); //更新用户信息
recalculate_price(); // 重新计算购物车中的商品价格
/* 检查购物车中是否有商品 没有商品则跳转到首页 */
$sql = "SELECT COUNT(*) FROM " . $ecs->table('cart') . " WHERE session_id = '" . SESS_ID . "' ";
if ($db->getOne($sql) > 0)
{
ecs_header("Location: flow.php?step=checkout\n");
}
else
{
ecs_header("Location:index.php\n");
}
exit;
改为:
if(is_validated_emil($_POST['username']) > 0)
{
update_user_info(); //更新用户信息
recalculate_price(); // 重新计算购物车中的商品价格
/* 检查购物车中是否有商品 没有商品则跳转到首页 */
$sql = "SELECT COUNT(*) FROM " . $ecs->table('cart') . " WHERE session_id = '" . SESS_ID . "' ";
if ($db->getOne($sql) > 0)
{
ecs_header("Location: flow.php?step=checkout\n");
}
else
{
ecs_header("Location:index.php\n");
}
exit;
}
else
{
$user->logout();
show_message('需要验证邮件才能登录', array($_LANG['back_up_page'], $_LANG['back_home_lnk']), array('flow.phpstep=login', 'index.php'), 'info');
}
ecshop模板修改, ecshop分类标题修改成分类名称,不需要网站名,该怎么修改,还有文章的标题,只需文章标题,不需要完整名
问:ecshop分类标题修改成分类名称,不需要网站名,该怎么修改,还有文章的标题,只需文章标题,不需要网站名, 像这样 分类名+e购手机 文章名+e购手机
答:
一、改分类页标题:
修改文件:/category.php
查找代码:
$cat = get_cat_info($cat_id);
在下面增加一行:
$smarty->assign('cat_info', $cat);
修改文件: /themes/default/category.dwt
查找代码:
<title>{$page_title}</title>
修改为:
<title>{$cat_info.cat_name}</title>
二、修改文章显示页标题:
修改文件:/themes/default/article.dwt
查找代码:
<title>{$page_title}</title>
修改为:
<title>{$article.title}</title>
在webmin中重启apache的方法,重启webmin自己,重启VPS
- 在登录不了webmin面板的时候,我们可以通过用root登录ssh,我们可以用命令 reboot 来重启Linux vps或服务器。可以用 service webmin restart 来重启webmin面板自己。
需要在webmin重启apache,看下图:
restart-apache 在很多页面的右上角就有apache的“应用修改”的字样,点击他即可重启apache。

或者点击左边的“系统信息”,然后找到apache,点击重启图标,如下图:
restart-apache3.png

如何在webmin面板中重启vps或服务器?看下图,相当于“用命令 shutdown -r now .. 重新启动系统”
reboot.png

重启webmin面板自己
restart-webmin.png

PHP扩展模块Memcached与Memcache区别
最近在配置高性能的memcache服务器,对于memcache与memcached扩展的区别网上大多介绍的不清不楚,这样说吧,PHP下一共有两个memcache扩展模块:
1、memcache扩展,网上介绍的大多是这种方式,历史比较老;
2、memcached扩展,需要搭配libmemcahced 库,推出的时间比较新,但功能比memcache扩展多,接口函数更丰富,推荐使用。
在最新的PHP手册中,有详细的针对两种扩展的使用说明。
以下是网上找到的资料:
Memcache和Memcached,目前大部分PHP环境里使用的是名字里不带d的Memcache版本,这个版本释出的比较早,是一个原生版本,与之对应的带d的Memcached版本则是建立在libmemcached的基础上,所以说Memcached版本的功能更全一些。
安装Memcached版本的PHP模块
wget http://download.tangent.org/libmemcached-0.35.tar.gz
tar zxf libmemcached-0.35.tar.gz
cd libmemcached-0.35
./configure
make
make install
wget http://pecl.php.net/get/memcached-1.0.0.tgz
tar zxf memcached-1.0.0.tgz
cd memcached-1.0.0
phpize
./configure
make
make install
打开php.ini加上:
extension = “memcached.so”
这样安装就结束了,你可以通过下列命令来确认:
php -m | grep mem
演示Memcached版本的新功能
先虚构一个问题,假设counter初始值是一个整数,不使用increment方法,通过get/set完成每次加一。
在Memcache版本里,我们只能按照大致如下的方式来进行:
$m = new Memcache();
$m->addServer(’localhost’, 11211);
$v = $m->get(’counter’);
$m->set(’counter’, $v + 1);
由于get/set这两个动作无法作为一个原子来操作,所以当多个进程同时处理时,会出现丢失的可能,更让人恼火的是,你根本就不知道什么时候出现丢失。
再看看Memcached版本里,我们是如何做的:
$md = new Memcached();
$md->addServer(’localhost’, 11211);
$v = $md->get(’counter’, null, $token)
$md->cas($token, ‘counter’, $v + 1);
cas是Memcached版本里提供的功能,说白了就是一个乐观锁的功能,如果你把$token的值var_dump出来,就会发现$token 其实就 是一个版本号,如果通过get得到的$token版本号在cas的时候不对应,就说明已经有别的操作更新了,此时cas操作会失败,至于如何继续操作,就 看你自己了。
注:如果你想手动重现一下冲突的情况,可在get和cas之间sleep若干秒,并拷贝两份脚本,先后执行。
顺便说一句,推荐的Memcached版本模块的哈希设置如下:
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
总结
Memcached版本还有很多Memcache没有的功能,比如通过getByKey, setByKey等自动支持多个服务器,就不赘述了参见下表,该用哪个扩展已经不言自明了。
| pecl/memcache | pecl/memcached | |
|---|---|---|
| First Release Date | 2004-06-08 | 2009-01-29 (beta) |
| Actively Developed? | Yes | Yes |
| External Dependency | None | libmemcached |
| Features | ||
| Automatic Key Fixup1 | Yes | No |
| Append/Prepend | No | Yes |
| Automatic Serialzation2 | Yes | Yes |
| Binary Protocol | No | Optional |
| CAS | No | Yes |
| Compression | Yes | Yes |
| Communication Timeout | Connect Only | Various Options |
| Consistent Hashing | Yes | Yes |
| Delayed Get | No | Yes |
| Multi-Get | Yes | Yes |
| Session Support | Yes | Yes |
| Set/Get to a specific server | No | Yes |
| Stores Numerics | Converted to Strings | Yes |
- pecl/memcache will convert an invalid key into a valid key for you. pecl/memcached will return false when trying to set/get a key that is not valid.
- You do not have to serialize your objects or arrays before sending them to the set commands. Both clients will do this for you.
PHP下正则表达式之排除型匹配[转]
原文:
http://iregex.org/blog/negate-match.html
网友cfc4n问及关于(?!)的正则表达式问题。回答之后,顺便总结了一下Perl语言中如何匹配“不出现”某元素,贴在这里。
问题
问题描述
有如下文本,如何使用正则式,将其中不含color选项的item匹配出来?
1
2
3
4
5
6
7
8 <item>
color:red;
</item>
<item>
size:12;
number:45;
type:good;
</item>典型的错误答案
新手容易提供这样的错误答案:
<item>.*?(?!color).*?</item>。其出发点是正确的:只有当color不出现在目标字串时,该匹配才是所需要的。事实上,这样的正则表达式不能如君所愿,它匹配所有的<item>...</item>。这是为什么呢?
Perl之排除型匹配
最简单的排除型匹配
匹配是
=~, 不匹配当然是!~了。写到这里想到,在正则式中,凡是由=组成的正则式符号,全可以使用!来替代,以表现相反的意思。例如(?=)与(?!),(?<=)与(?<!),=~与!~。返回正题,看个例子。如果要检测某字串是否含有good,当然要用
if ($string=~ /good/),如果$string里有good则条件为真,否则为假;如果要检测某字串是否不含有good,可以用
if ($string !~ /good/),如果$string里没有good则条件为真,否则为假。这种匹配测试,较适合于在大段的字串中搜索某个简单的模式,然后对于匹配的结果作出两种不同的判断,非此即彼。虽然迅速干练,但是对于复杂情况的判断,还是有些累赘。
对于文章开始提出的问题而言,当然可以这样解决:先搜索所有的
<item>...</item>,然后分别判断是否存在color项即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #!/usr/bin/perl -wmy $text=<<END;
<item>
color:red;
</item>
<item>
size:12;
number:45;
type:good;
</item>
ENDmy @result = $text=~ m!<item>.*?</item>!sg;
foreach $item (@result)
{
if ($item !~ /color/)
{
print ”$item”;
}
}输出结果是:
1
2
3
4
5 <item>
size:12;
number:45;
type:good;
</item>虽然也不错,但是它总是“宁可错杀不可错放”地找完所有可能项,再一一重新进行排除。能否一开始就先界定,我们要找的是不含color的item呢?排除型匹配正是为此而生。
排除型匹配
不好意思,“排除型匹配”这个词是我生造的。其它的说法或许是“否定断言”,“否定环视”等等。后两者的命名,都是从匹配过程的角度出发;而此处命名,是从结果出发。具体说来,就是使用
(?!...)和(?<!...)作为辅助条件判断,来简化正则表达式,方便快捷地找到符合要求的匹配。这两个东东的使用方法类似,都是指,当前位置不出现某种模式。不同的是,
(?!...)是指当前位置的右边,而(?<!)自然就是指左边了。这里隆重推出Anrs同学翻译的教程: 环视一以及环视二。仔细阅读这两文章,彻底明白环视这两个概念,将会提升您的正则表达式功力。后文将建立在您已经理解环视这个概念的基础上。
闲话一句。既然使用“左边”和“右边”既形象又好懂,为什么没见过“左瞻”,“右瞻”,“左向”,“右向”,反而全是些“前瞻后瞻”,“正向逆向”这样的不好理解的说法呢?撕烤者也同有此问。我的理解是,或许是为了照顾阿语等从右向左书写的用户的习惯吧。无论如何,将从
^到$的方向称之为“向前”总不会错。描述当前位置(左侧或右侧)的模式,从而辅助判断正则式是否匹配,是环视的作用。它只描述,不消耗字符;只辅助判断,从不单独出现。这与
^和$简直如出一辙。一则例子
例子. 现在有许多与fanfou.com类似的网址。如何写一条正则表达式,来匹配域名含fanfou,但是TLS不是.com的模式?
答案:
/\bfanfou\.(?!com)[a-z]{2,4}\b/i。分析这条正则表达式:
- 以
\b开始,明确字符边界;- fanfou主域名不可少;
\.匹配一个普通的点号;此处不要使用点号元字符;(?!com)表示此处(即从fanfou.的右边)不得出现com三个连续字符;[a-z]{2,4}表示是2至4位的拉丁字母;因为域名的TLS最短是2位(如.au, .us),最长可为4位(如.info, .asia);- 右侧边界同样重要,否则我们之前的{2,4}就白费了;
- 使用i表示不分大小写;这是域名的特征之一。
回到本题
按照要求,一步步建立这条正则式。
- 该正则式匹配的是
<item>...</item>结构。因此,正则式以<item>开始。- 在
<item>和</item>之间不得出现color,是这条正则式的难点。因为,color可能位于这个结构之内的任意一点,因此要规定,此内任意一点都不得出现color一词。这样的点为:(?!color).。这样的点重复1+次,正则式写为((?!color).)+。注意这里有个小陷阱:不要写为(?!color).+,否则它只描述了最左侧的一点不得出现color,其余部分则都无所谓。而写为((?!color).)+则保证每一点都不出现color。- 正则式此时为
<item>((?!color).)+?</item>。为了节省资源,括号通常写成非捕获模式(?:...);为了保证点号匹配换行符,可以指定s模式或使用[\s\S]代替点号元字符。此处仍使用点号。正则式修改为<item>(?:(?!color).)+?</item>。
总体来说,环视相对于基本的元字符还是要抽象一些。不过一旦理解并掌握了它,就会发现它在精确匹配和替换时十分有用。上面的分析,希望有所帮助。如果您有类似的问题,欢迎提出。
LINUX下备份服务器数据到dropbox的脚本[转]
#!/bin/bash
DROPBOX_USER=”Your Dropbox username”
DROPBOX_PASS=”Your Dropbox password”
DROPBOX_DIR=”Directory in your dropbox account to store the backups, e.g. /backups”
BACKUP_SRC=”/home /var/www /var/git /etc /root”
BACKUP_DST=”/tmp”
MYSQL_SERVER=”127.0.0.1″
MYSQL_USER=”root”
MYSQL_PASS=”Your MySQL password”#
# Stop editing here.
NOW=$(date +”%Y.%m.%d”)
DESTFILE=”$BACKUP_DST/$NOW.tgz”#
# Upload a file to Dropbox.
# $1 = Source file
# $2 = Destination file.
function dropboxUpload
{
#
# Code based on DropBox Uploader 0.6 from http://www.andreafabrizi.it/?dropbox_uploader
LOGIN_URL=”https://www.dropbox.com/login”
HOME_URL=”https://www.dropbox.com/home”
UPLOAD_URL=”https://dl-web.dropbox.com/upload”
COOKIE_FILE=”/tmp/du_cookie_$RANDOM”
RESPONSE_FILE=”/tmp/du_resp_$RANDOM”UPLOAD_FILE=$1
DEST_FOLDER=$2# Login
echo -ne ” > Logging in…”
curl -s -i -c $COOKIE_FILE -o $RESPONSE_FILE –data “login_email=$DROPBOX_USER&login_password=$DROPBOX_PASS&t=$TOKEN” “$LOGIN_URL”
grep “location: /home” $RESPONSE_FILE > /dev/nullif [ $? -ne 0 ]; then
echo -e ” Failed!”
rm -f “$COOKIE_FILE” “$RESPONSE_FILE”
exit 1
else
echo -e ” OK”
fi# Load home page
echo -ne ” > Loading Home…”
curl -s -i -b “$COOKIE_FILE” -o “$RESPONSE_FILE” “$HOME_URL”if [ $? -ne 0 ]; then
echo -e ” Failed!”
rm -f “$COOKIE_FILE” “$RESPONSE_FILE”
exit 1
else
echo -e ” OK”
fi# Get token
TOKEN=$(cat “$RESPONSE_FILE” | tr -d ‘n’ | sed ’s/.*<form action=”https://dl-web.dropbox.com/upload”[^>]*>s*<input type=”hidden” name=”t” value=”([a-z 0-9]*)”.*/1/’)# Upload file
echo -ne ” > Uploading ‘$UPLOAD_FILE’ to ‘DROPBOX$DEST_FOLDER/’…”
curl -s -i -b $COOKIE_FILE -o $RESPONSE_FILE -F “plain=yes” -F “dest=$DEST_FOLDER” -F “t=$TOKEN” -F “file=@$UPLOAD_FILE” ”$UPLOAD_URL”
grep “HTTP/1.1 302 FOUND” “$RESPONSE_FILE” > /dev/nullif [ $? -ne 0 ]; then
echo -e ” Failed!”
rm -f “$COOKIE_FILE” “$RESPONSE_FILE”
exit 1
else
echo -e ” OK”
rm -f “$COOKIE_FILE” “$RESPONSE_FILE”
fi
}# Backup files.
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS –all-databases > “$NOW-Databases.sql”
tar cfz “$DESTFILE” $BACKUP_SRC “$NOW-Databases.sql”dropboxUpload “$DESTFILE” “$DROPBOX_DIR”
rm -f “$NOW-Databases.sql” “$DESTFILE”
原文连接:http://davehope.co.uk/Blog/backup-your-linux-vps-to-dropbox/
xen及openvz两种VPS的内存使用情况查看方法, 怎么看xen主机的内存使用率
vps查看内存使用情况,是ecshop英文网站配置过程中经常做的事情,但是这里说明的是Xen和OpenVZ看到的数据是不同的,需要计算下。
命令:
free -m
如果你的vps是xen的就会如下图所示:

是不是发现Vpsma.com的内存快用完了?呵呵,其实不是的,因为目前所使用的是基于Xen构建的,所以真实内存是=used -(buffer + cache).
很多探针里也是可以显示出来的:

这是因为:linux 优先运用物理内存,当物理内存还有空闲时,linux是不会施放内存的,这部分内存就用来做缓存了。举个例子,你在探针或者SSH里看到已经用满了,其实没有。这样做的好处是,启动那些刚开启过的程序、或是读取刚存取过得数据会比较快。
如果你的vps是基于openVZ的,会显示如下数据:

在这里used显示的实际内存就是你所使用的内存了!不用再做计算。从php探针里我们也可以看到这一点:

所以大家在查看Linux vps内存使用情况时候,一定要确定自己的vps是xen的还是openVZ的,不要上来就惊慌!