嗨,新朋友,很高兴认识你,欢迎来到我的博客。

HTTP头的Expires与Cache-control

1.概念

Cache-control用于控制HTTP缓存(在HTTP/1.0中可能部分没实现,仅仅实现了Pragma: no-cache)

数据包中的格式:

Cache-Control: cache-directive

cache-directive可以为以下:

request时用到:

| “no-cache”
| “no-store”
| “max-age” “=” delta-seconds
| “max-stale” [ "=" delta-seconds ]
| “min-fresh” “=” delta-seconds
| “no-transform”
| “only-if-cached”
| “cache-extension”

response时用到:

| “public”
| “private” [ "=" <"> field-name <"> ]
| “no-cache” [ "=" <"> field-name <"> ]
| “no-store”
| “no-transform”
| “must-revalidate”
| “proxy-revalidate”
| “max-age” “=” delta-seconds
| “s-maxage” “=” delta-seconds
| “cache-extension”

部分说明:
根据是否可缓存分为
Public 指示响应可被任何缓存区缓存。
Private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的
部分响应消息,此响应消息对于其他用户的请求无效。
no-cache 指示请求或响应消息不能缓存(HTTP/1.0用Pragma的no-cache替换)
根据什么能被缓存
no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
根据缓存超时
max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以
接收超出超时期指定值之内的响应消息。
Expires 表示存在时间,允许客户端在这个时间之前不去检查(发请求),等同max-age的
效果。但是如果同时存在,则被Cache-Control的max-age覆盖。
格式:
Expires = “Expires” “:” HTTP-date
例如
Expires: Thu, 01 Dec 1994 16:00:00 GMT (必须是GMT格式)

2.应用
通过HTTP的META设置expires和cache-control


上述设置仅为举例,实际使用其一即可。这样写的话仅对该网页有效,对网页中的图片或其他请求无效,并不会做任何cache。
这样客户端的请求就多了,尽管只是检查Last-modified状态的东西,但是请求一多对浏览速度必定有影响。

如果要对文件添加cache可以通过apache的mod_expire模块,写法为

ExpiresActive On
ExpiresDefault “access plus 1 days”


记得ExpiresActive设为On,我起先没设置On,似乎怎样YSlow都查不到缓存机制。这样添加的话就是默认所有的。

如果要针对个别MIME类型则可以:
ExpiresByType image/gif “access plus 5 hours 3 minutes”
见 Apache Module mod_expires
另外,当点击浏览器上的刷新,客户端发送的请求中均是max-age=0,表示validate操作,发送请求到服务器
要求检查cache,再更新cache,一般得到的是304 Not Modified,表示没变动。

Ubuntu下使用vsftpd搭建FTP服务器

要在Ubuntu下安装vsftpd很简单,首先输入下面的命令进行安装:

  #apt-get install vsftpd

  接下来需要进行简单的配置,我们先编辑它的配置文件/etc/vsftpd.conf:

  #vim /etc/vsftpd.conf

  这个配置文件里面很多内容都可以保持默认,不过为了进一步加深理解,我们还是来了解一下常用的选项吧!

  listen=YES:这个表示是否监听端口,我们就是要架设FTP服务器,当然YES啦!

  anonymous_enable=NO:这个标识是否启用匿名用户,一般我们自己的服务器肯定都是不允许匿名登录的,那样多危险啊!所以这里保持NO。当然如果您需要启动匿名用户,别忘记这里改为YES。

  local_enable=YES:这个表示是否允许本地用户登录。我们当然需要让本地用户登录啦,因为他们都是有用户名和密码的。这样就不用去额外添加FTP账号了,直接创建Linux用户即可。

  write_enable=YES:是否允许写入数据。这个如果为YES,那么用户就可以进行上传文件、修改文件、删除文件等操作;否则就全部只能看到文件、下载文件,但是不允许执行修改、删除、上传的操作。

  local_umask=077:这是将文件上传之后,文件的权限,默认为077。除非有特殊需要,建议保持不变。

  anon_upload_enable=YES:这是是否启用匿名用户的上传权限。如果您希望匿名用户也能上传文件的话,启用这项即可。

  anon_mkdir_write_enable=YES:同样是给匿名用户的权限,是可以创建目录,写入、修改、删除文件的总开关。一般情况下匿名用户不能使用这样的权限,会带来潜在的风险。

  dirmessage_enable=YES:用户进入一个目录后,是否给出信息提示。默认YES,默认即可。

  use_localtime=YES:是否使用服务器本地的时间,保持默认YES即可。

  xferlog_enable=YES:是否记录FTP用户的操作记录,为了方便追溯和安全起见,建议YES。

  connect_from_port_20=YES:是否允许从20端口连接,保持YES即可,除非你确定不用这个20端口。

  chown_uploads=YES:是否改变上传文件的归属,默认是注释掉不生效的,如果你需要将上传的文件权限更改为某个账户,可以选择YES启用它。

  chown_username=whoever:这项是承接上一个选项的,是改变为哪个用户的权限。注意:改变为root用户权限是不推荐的!

  xferlog_file=/var/log/vsftpd.log:日志记录的文件名,保持默认即可。

  idle_session_timeout=600:空闲多少时间自动断开FTP连接,单位是秒。默认值是600秒也就是10分钟。

  data_connection_timeout=120:数据传输超时的时间,单位也是秒。是指数据传输过程中,多长时间内接收不到数据,就认为超时,然后断开连接。

  ftpd_banner=Welcome to blah FTP service.这个是连接FTP的时候,服务器给出的欢迎信息。

  chroot_local_user=YES:这个选项很重要,他决定了登录的FTP用户是否可以“漫游”到自己目录以外的目录,除非特别需要,否则强烈推荐设置为YES,将用户锁定在他们自己的目录内,避免他们看到或者修改系统文件。

  基本上上面这些配置完后,vsftpd就算可以正常运作了。这个时候输入下面的命令让设置生效:

  #/etc/init.d/vsftpd restart

  然后如果要创建新的FTP用户,只需要使用Linux本身的adduser即可。

关于 mysql 回滚的相关理解

今天在建立mysql数据库,想在建立之前先写好生成数据库和表 的sql语句,在每次假设服务器的时候,只要执行一次 ,就ok了。
但是想到有时候,执行这么多语句可能会遇到问题,所以想到在遇到问题的时候,就回滚本次操作,并且报错。
要实现回滚,必须在建立表的时候设置回滚属性(数据库的应该也可以设置)。
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型 不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而 InnoDB提供事务支持已经外部键等高级数据库功能。

MyIASM是IASM表的新版本,有如下扩展:

·二进制层次的可移植性。

·NULL列索引。

·对变长行比ISAM表有更少的碎片。

·支持大文件。

·更好的索引压缩。

·更好的键吗统计分布。

·更好和更快的auto_increment处理。

以下是一些细节和具体实现的差别:

◆1.InnoDB不支持FULLTEXT类型的索引。

◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

综上所述,任何一种表都不是万能的,只有恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势

php中回滚实例

$handler = mysql_connect(‘localhost’, ”, ”);
mysql_select_db(‘test’);
mysql_query(‘SET AUTOCOMMIT=0′); // 设置为不自动提交查询
mysql_query(‘START TRANSACTION’); // 开始查询,这里也可以使用BEGIN
mysql_query(“INSERT INTO users VALUES (‘ccc’)”);
mysql_query(“DELETE FROM users WHERE username = ‘aac’”);
if (mysql_affected_rows($handler) == 0)
mysql_query(‘ROLLBACK’); // 如果删除未找到相应的记录则回滚,不执行上面的插入查询
mysql_query(‘COMMIT’);
mysql_close($handler);

Mysql 回滚 Myisam和Innodb

一 . MyISAM是 默认存储引擎。

它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。

每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

二 . InnoDB给MySQL提供 了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。

InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加 了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。

InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。

InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。

InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在

MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。

InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的 默认表。

InnoDB被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在InnoDB上。Mytrix, Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。

三 . 简单概括几点如下:

1.通过不上不难看出,MyIsam InnoDB的用途,Myisam主要适用于中小型数据量。InnoDB引擎适用于大数据量。上面已经讲得很清楚拉。著名的开源电子商务系统[magento]就是采用InnoDB创建。

2.MyIsam写入速度比InnoDB快。

3.在使用InnoDB时候需要对my.cnf进行配置以保证mysql达到最大效率。详细可以查看官网[inndo性能调节]:http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-tuning。

其中有很多人在网上发表了关于mysql MyIsam 和 InnoDB在存贮和读取方面的差异。暂时还没有做过度研究。

基本测试都是基于使用[事务]和不使用[事务],进行对比。mysql对于[非事务表]速度会比较块。

◆1.InnoDB不支持FULLTEXT类型的索引。

◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

InnoDB性能调节提示
如果Unix顶层工具或者Windows任务管理器显示,你的数据库的工作负荷的CPU使用率小于70%,则你的工作负荷可能是磁盘绑定的,可能你正生成太多的事务和提交,或者缓冲池太小。使得缓冲池更大一些会有帮助的,但不要设置缓冲池等于或超过物理内存的80%.

· 把数个修改裹进一个事务里。如果事务对数据库修改,InnoDB在该事务提交时必须刷新日志到磁盘。因为磁盘旋转的速度至多167转/秒,如果磁盘没有骗操作系统的话,这就限制提交的数目为同样的每秒167次。

· 如果你可以接受损失一些最近的已提交事务,你可以设置my.cnf文件里的参数innodb_flush_log_at_trx_commit为0。 无论如何InnoDB试着每秒刷新一次日志,尽管刷新不被许可。

· 使用大的日志文件,让它甚至与缓冲池一样大。当InnoDB写满日志文件时,它不得不在一个检查点把缓冲池已修改的内容写进磁盘。小日志文件导致许多不必要的吸盘写操作。大日志文件的缺点时恢复时间更长。

· 也让日志缓冲相当大(与8MB相似的数量)。

· 如果你存储变长度字符串,或者列可能包含很多NULL值,则使用VARCHAR列类型而不是CHAR类型。一个CHAR(N)列总是占据N 字节来存储,即使字符串更短或字符串的值是NULL。越小的表越好地适合缓冲池并且减少磁盘I/O。

当使用row_format=compact (MySQL 5.1中默认的InnoDB记录格式)和可变长度字符集,比如UTF-8或sjis,CHAR(N)将占据可变数量的空间,至少为N 字节。

· 在一些版本的GNU/Linux和Unix上,用Unix的fsync()(InnoDB默认使用的)把文件刷新到磁盘,并且其他相似的方法是惊人的慢。如果你不满意数据库的写性能,你可以试着设置my.cnf里的innodb_flush_method为O_DSYNC,虽然O_DSYNC在多数系统上看起来更慢。

· 当在Solaris 10上,为x86_64架构(AMD Opteron)使用InnoDB存储引擎,重要的是使用forcedirectio选项来安装任何为存储与InnoDB相关的文件而使用的数据系统。(默认在Solaris 10/x86_64上不使用这个文件系统安装选项)。使用forcedirectio 失败会导致InnoDB在这个平台上的速度和性能严重退化。

· 当导入数据到InnoDB中之时,请确信MySQL没有允许autocommit模式,因为允许autocommit模式会需要每次插入都要刷新日志到磁盘。要在导入操作规程中禁止autocommit模式,用SET AUTOCOMMIT和COMMIT语句来包住导入语句:

· SET AUTOCOMMIT=0;· /* SQL import statements … */· COMMIT;

如果你使用mysqldump 选项–opt,即使不用SET AUTOCOMMIT和COMMIT语句来包裹,你也使得快速的转储文件被导入到InnoDB表中。

· 小心大宗插入的大回滚:InnoDB在插入中使用插入缓冲来节约磁盘I/O,但是在相应的回滚中没有使用这样的机制。一个磁盘绑定的回滚可以用相应插入花费时间的30倍来执行。杀掉数据库进程没有是帮助的,因为回滚在服务器启动时会再次启动。除掉一个失控的回滚的唯一方法是增大缓冲池使得回滚变成CPU绑定且跑得快,或者使用专用步骤,请参阅15.2.8.1节,“强制恢复”。

· 也要小心其它大的磁盘绑定操作。用DROP TABLE或CREATE TABLE来清空一个表,而不是用DELETE FROM tbl_name。

· 如果你需要插入许多行,则使用多行插入语法来减少客户端和服务器之间的通讯开支:

· INSERT INTO yourtable VALUES (1,2), (5,5), …;

这个提示对到任何表类型的插入都是合法的,不仅仅是对InnoDB类型。

· 如果你在第二个键上有UNIQUE约束,你可以在导入会话中暂时关闭唯一性检查以加速表的导入:

· SET UNIQUE_CHECKS=0;

对于大表,这节约了大量磁盘I/O,因为InnoDB可以使用它的插入缓冲来在一批内写第二个索引记录。

· 如果你对你的表有FOREIGN KEY约束,你可以在导入会话过程中通过关闭外键检查来提速表的导入:

· SET FOREIGN_KEY_CHECKS=0;

对于大表,这可以节约大量的磁盘I/O。

· 如果你经常有对不经常更新的表的重发查询,请使用查询缓存:

· [mysqld]· query_cache_type = ON· query_cache_size = 10M

Ubuntu下启动Apache对.htaccess 的支持

Ubuntu下启动Apache对.htaccess 的支持步骤:

1. 终端运行

sudo a2enmod

程序提示可供激活的模块名称,输入:

rewrite

2. 修改/etc/apache2/sites-enabled/000-default (该链接指向的是站点配置文件)

把(默认的www目录、或者需要应用.htaccess的目录)下的AllowOverride 属性改为All,保存。

3. 重新加载apache

sudo /etc/init.d/apache2 restart

收工。

40个迹象表明你还是PHP菜鸟

你是PHP菜鸟,如果你:

1. 不会利用如phpDoc这样的工具来恰当地注释你的代码
2. 对优秀的集成开发环境如Zend Studio或Eclipse PDT视而不见
3. 从未用过任何形式的版本控制系统,如Subclipse
4. 不采用某种编码与命名标准,以及通用约定,不能在项目开发周期里贯彻落实
5. 不使用统一开发方式
6. 不转换(或)也不验证某些输入或SQL查询串(译注:参考PHP相关函数)
7. 不在编码之前彻底规划你的程序
8. 不使用测试驱动开发
9. 不在错误开启状态下进行编码和测试(译注:参考PHP函数error_reporting)
10. 对调试器的好处视而不见
11. 不重构你的代码
12. 不使用类似MVC模式把程序的不同层次划分开
13. 不知道这些概念:KISS, DRY, MVC, OOP, REST
14. 不用return而是直接在你的函数或类中输出(echo/print)内容
15. 对单元测试或通用测试的优点视而不见
16. 总是返回硬编码的HTML,却不返回纯粹的数据,字符串,或对象
17. 总是对“消息”和“配置参数”进行硬编码
18. 不对SQL查询语句做优化
19. 不使用__autoload(译注:参考PHP手册相关描述)
20. 不允许智能错误处理(译注:参考PEAR的ErrorStack)
21. 使用$_GET替代$_POST来做具有破坏性的传递操作
22. 不知道怎么利用正则表达式
23. 从未听说过SQL注入或跨站脚本
24. 不允许简易配置,也不允许类的构造函数接受参数传递而后执行set/get方法,或运行时的常量定义
25. 不理解面向对象编程(OOP)的优势和劣势
26. 不视情形大小而滥用OOP
27. 自认为实现可复用的软件一定等于/需要让你的代码遵循OOP
28. 不利用智能缺省值
29. 没有单一的配置文件
30. 不想暴露文件源码,却用.inc后缀名取代了.php
31. 不使用数据库抽象层
32. 不能保持DRY作风,即不重复自己,如果你总是在复制粘贴一些东西,说明你设计得很差劲
33. 没有实现让一个函数/类/方法只做一件事,也不能组合利用它们
34. 没能尝试OOP的特长,如抽象类、接口、多态、继承,访问控制修饰符(译注:如public, private, protected)
35. 不用现有的设计模式优化你的程序体系设计
36. 不允许你的用户在你拥有很多文件或目录的情况下定义基础目录
37. 污染了名称空间,比如用常见字符串命名你的库函数
38. 使用数据库表时不使用表前缀
39. 不使用统一的模板引擎
40. 不关注已有的PHP开发框架,懒于探索;其实先进的开发理念和美妙代码就蕴含其中。

gvim中文乱码详解

最近使用gvim打开vim7.2的中文帮助文档时,出现了乱码,所在网上搜索了一下,解决办法,Mark一下,希望有遇到同样问题的同仁节省点时间

在 Vim 中, 有四个与编码有关的选项, 它们是: fileencodings、 fileencoding、 encoding 和 termencoding。 在实际使用中, 任何一个选项出现错误, 都会导致出现乱码。 因此, 每一个 Vim 用户都应该明确这四个选项的含义。 下面, 我们详细介绍一下这四个选项的含义和作用。

1 encoding

encoding 是 Vim 内部使用的字符编码方式。 当我们设置了 encoding 之后, Vim 内部所有的 buffer、 寄存器、 脚本中的字符串等, 全都使用这个编码。 Vim 在工作的时候, 如果编码方式与它的内部编码不一致, 它会先把编码转换成内部编码。 如果工作用的编码中含有无法转换为内部编码的字符, 在这些字符就会丢失。 因此,在选择 Vim 的内部编码的时候, 一定要使用一种表现能力足够强的编码, 以免影响正常工作。

由于 encoding 选项涉及到 Vim 中所有字符的内部表示, 因此只能在 Vim 启动的时候设置一次。 在 Vim 工作过程中修改 encoding 会造成非常多的问题。 如果没有特别的理由, 请始终将 encoding 设置为 utf-8。 为了避免在非 UTF-8 的系统如 Windows 下, 菜单和系统提示出现乱码, 可同时做这几项设置:

set encoding=utf-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
2 termencoding

termencoding 是 Vim 用于屏幕显示的编码, 在显示的时候, Vim 会把内部编码转换为屏幕编码, 再用于输出。 内部编码中含有无法转换为屏幕编码的字符时, 该字符会变成问号, 但不会影响对它的编辑操作。 如果 termencoding 没有设置, 则直接使用 encoding 不进行转换。

举个例子, 当你在 Windows 下通过 telnet 登录 Linux 工作站时, 由于 Windows 的 telnet 是 GBK 编码的, 而 Linux 下使用 UTF-8 编码, 你在 telnet 下的 Vim 中就会乱码。 此时有两种消除乱码的方式: 一是把 Vim 的 encoding 改为 gbk, 另一种方法是保持 encoding 为 utf-8, 把 termencoding 改为 gbk, 让 Vim 在显示的时候转码。 显然, 使用前一种方法时, 如果遇到编辑的文件中含有 GBK 无法表示的字符时, 这些字符就会丢失。 但如果使用后一种方法, 虽然由于终端所限, 这些字符无法显示, 但在编辑过程中这些字符是不会丢失的。

对于图形界面下的 GVim, 它的显示不依赖 TERM, 因此 termencoding 对于它没有意义。 在 GTK2 下的 GVim 中, termencoding 永远是 utf-8, 并且不能修改。 而 Windows 下的 GVim 则忽略 termencoding 的存在。

3 fileencoding

当 Vim 从磁盘上读取文件的时候, 会对文件的编码进行探测。 如果文件的编码方式和 Vim 的内部编码方式不同, Vim 就会对编码进行转换。 转换完毕后, Vim 会将 fileencoding 选项设置为文件的编码。 当 Vim 存盘的时候, 如果 encoding 和 fileencoding 不一样, Vim 就会进行编码转换。 因此, 通过打开文件后设置 fileencoding, 我们可以将文件由一种编码转换为另一种编码。 但是, 由前面的介绍可以看出, fileencoding 是在打开文件的时候, 由 Vim 进行探测后自动设置的。 因此, 如果出现乱码, 我们无法通过在打开文件后重新设置 fileencoding 来纠正乱码。

4 fileencodings

编码的自动识别是通过设置 fileencodings 实现的, 注意是复数形式。 fileencodings 是一个用逗号分隔的列表, 列表中的每一项是一种编码的名称。 当我们打开文件的时候, VIM 按顺序使用 fileencodings 中的编码进行尝试解码, 如果成功的话, 就使用该编码方式进行解码, 并将 fileencoding 设置为这个值, 如果失败的话, 就继续试验下一个编码。

因此, 我们在设置 fileencodings 的时候, 一定要把要求严格的、 当文件不是这个编码的时候更容易出现解码失败的编码方式放在前面, 把宽松的编码方式放在后面。

例如, latin1 是一种非常宽松的编码方式, 任何一种编码方式得到的文本, 用 latin1 进行解码, 都不会发生解码失败 —— 当然, 解码得到的结果自然也就是理所当然的“乱码”。 因此, 如果你把 latin1 放到了 fileencodings 的第一位的话, 打开任何中文文件都是乱码也就是理所当然的了。

以下是滇狐推荐的一个 fileencodings 设置:

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
其中, ucs-bom 是一种非常严格的编码, 非该编码的文件几乎没有可能被误判为 ucs-bom, 因此放在第一位。

utf-8 也相当严格, 除了很短的文件外 (例如许多人津津乐道的 GBK 编码的“联通”被误判为 UTF-8 编码的经典错误), 现实生活中一般文件是几乎不可能被误判的, 因此放在第二位。

接下来是 cp936 和 gb18030, 这两种编码相对宽松, 如果放前面的话, 会出现大量误判, 所以就让它们靠后一些。 cp936 的编码空间比 gb18030 小, 所以把 cp936 放在 gb18030 前面。

至于 big5、euc-jp 和 euc-kr, 它们的严格程度和 cp936 差不多, 把它们放在后面, 在编辑这些编码的文件的时候必然出现大量误判, 但这是 Vim 内置编码探测机制没有办法解决的事。 由于中国用户很少有机会编辑这些编码的文件, 因此我们还是决定把 cp936 和 gb18030 前提以保证这些编码的识别。

最后就是 latin1 了。 它是一种极其宽松的编码, 以至于我们不得不把它放在最后一位。 不过可惜的是, 当你碰到一个真的 latin1 编码的文件时, 绝大部分情况下, 它没有机会 fall-back 到 latin1, 往往在前面的编码中就被误判了。 不过, 正如前面所说的, 中国用户没有太多机会接触这样的文件。

如果编码被误判了, 解码后的结果就无法被人类识别, 于是我们就说, 这个文件乱码了。 此时, 如果你知道这个文件的正确编码的话, 可以在打开文件的时候使用 ++enc=encoding 的方式来打开文件, 如:

:e ++enc=utf-8 myfile.txt

5 fencview

根据前面的介绍, 我们知道, 通过 Vim 内置的编码识别机制, 识别率是很低的, 尤其是对于简体中文 (GBK/GB18030)、 繁体中文 (Big5)、 日文 (euc-jp) 和韩文 (euc-kr) 之间的识别。 而对于普通用户而言, 肉眼看出一个文件的编码方式也是很不现实的事情。 因此, 滇狐强烈推荐水木社区的 mbbill 开发的 fencview 插件。 该插件使用词频统计的方式识别编码, 正确率非常高。 点击 这里 下载。

php 创建多级目录

$date = date('Y/m/d',time());
mkpath($date);
function mkpath($mkpath,$mode=0777){
$path_arr = explode('/',$mkpath);
foreach($path_arr as $value){
if (!empty($value)){
if(empty($path))
$path = $value ;
else
$path .= '/' . $value ;

is_dir($path) or mkdir($path ,$mode);
}

}
if (is_dir($mkpath))
return true;
else
return false;
}
?>

VPN是什么?

虚拟专用网(VPN)被定义为通过一个公用网络(通常是因特网)建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定的隧道。虚拟专用网是对企业内部网的扩展。

虚拟专用网可以帮助远程用户、公司分支机构、商业伙伴及供应商同公司的内部网建立可信的安全连接,并保证数据的安全传输。通过将数据流转移到低成本的压网络上,一个企业的虚拟专用网解决方案将大幅度地减少用户花费在城域网和远程网络连接上的费用。同时,这将简化网络的设计和管理,加速连接新的用户和网站。另外,虚拟专用网还可以保护现有的网络投资。随着用户的商业服务不断发展,企业的虚拟专用网解决方案可以使用户将精力集中到自己的生意上,而不是网络上。虚拟专用网可用于不断增长的移动用户的全球因特网接入,以实现安全连接;可用于实现企业网站之间安全通信的虚拟专用线路,用于经济有效地连接到商业伙伴和用户的安全外联网虚拟专用网。

我们面临的挑战

目前很多单位都面临着这样的挑战:分公司、经销商、合作伙伴、客户和外地出差人员要求随时经过公用网访问公司的资源,这些资源包括:公司的内部资料、办公OA、ERP系统、CRM系统、项目管理系统等。现在很多公司通过使用IPSec VPN来保证公司总部和分支机构以及移动工作人员之间安全连接。

对于很多IPSec VPN用户来说,IPSec VPN的解决方案的高成本和复杂的结构是很头疼的。存在如下事实:在部署和使用软硬件客户端的时候,需要大量的评价、部署、培训、升级和支持,对于用户来说,这些无论是在经济上和技术上都是个很大的负担,将远程解决方案和昂贵的内部应用相集成,对任何IT专业人员来说都是严峻的挑战。由于受到以上IPSec VPN的限制,大量的企业都认为IPSec VPN是一个成本高、复杂程度高,甚至是一个无法实施的方案。为了保持竞争力,消除企业内部信息孤岛,很多公司需要在与企业相关的不同的组织和个人之间传递信息,所以很多公司需要找一种实施简便,不需改变现有网络结构,运营成本低的解决方案。

HLINK VPN的特点

1.USB(KEY)即插即用

2.支持多线路绑定

3. 自带地址解析

4. 高效、安全、稳定

5. 扩展灵活、自由

6. 完善的权限管理

7. 低成本的VPN解决方案

8.免维护的VPN解决方案

360浏览器可能引起session丢失

某些情况下,在同一个标签页中,用$_SERVER['HTTP_USER_AGENT']取得360浏览器提交的内容也是会变化的,具体见下面两段。
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)

这就是问题所在,有时说自己是IE7,有时说自己是IE8。

于是在cls_session.php文件(96行)的$this->gen_session_key($tmp_session_id) == substr($this->session_id, 32)的判断就通不过,于是就重新建立了一个session ID,从web页面的 表现上看就是session丢失了。

打开cls_session.php,找到函数gen_session_key()的定义部分,将里面的return那一句话注释掉,换成return sprintf(‘%08x’, crc32(ROOT_PATH . $ip . $session_id));
我是这么改的,暂时没发现什么副作用。