混乱的日子

这几天的思维和行动都有些混乱了。

1、网页静态化整体方案;

2、JAVA学习日记到底使用http://www.learndiary.com/java/(主站二级目录)还是http://java.learndiary.com/(二级独立域名)?有点后悔见到zac的时间迟了那么一点点。否则,JAVA学习日记有可能采用二级目录;

3、防垃圾留言;

4、学习设计模式;

5、单位职称计算机考试又马上又来了,虽然我一天都摸计算机,可是都是用的linux,考试用的是windows系统,好多东西没摸,怕是忘了不少,到时考不过才丢人;

6、单位改革;

事情真多呀,虽然好多是自找的麻烦。

考虑的结果,因为未知和变数太多,所以:

1、仅首页静态化,做全站的jsp文件的网站地图,用jsp做也是为了以后的适应变动要灵活点,可以用程序的方式处理比如转向,过滤什么的;

2、保持二级独立域名不变,不然这个网站和我这个人都太善变了,而且这样问题也不是很大,变动是绝对的,静止是相对的。要变,以后有必要的时候再说。要不然,一直保持这个以JAVA学习为主的站也可以。以后假设开拓其它的领域就在www.learndiary.com做二级目录吧。JAVA是我的初恋情人,不妨给她点特殊地位;)

3、现在没必要写防垃圾留言,没人留言,就连垃圾都是渴望的呀:),有垃圾,说明别人看得起你这个站:)

4、5:暂时放慢,学习上以准备计算机考试为主;

6、车到山前必有路,未来是走出来的,不要太压在心上。

java.net.ConnectException: Connection timed out: connect

今天上午10:00开始,空间换IP,中断访问数小时。我在域名控制面板中更改了dns记录,把域名指向新的IP后,大概1个多小时吧,新的域名解析就生效了。原来听说域名解析要6个小时以上才会生效,现在生效时间这么快,是现在的技术更新了,还是只是局部用户访问有效呢(比如外国用户访问时就并没有生效,也就是说全球的IP解析生效不同步)?我就不得而知了。网络方面的知识还是太少了。

空间恢复访问后,基本上是正常。但是我发现本站生成静态文件的部分不能工作了。下面这段代码执行出错:


import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLConnection;

...

URL url = new URL(str);

URLConnection connection = url.openConnection();

connection.connect();

报错为:


java.net.ConnectException: Connection timed out: connect

后来,连这个状态都达在到了,报错为:


 java.net.UnknownHostException: java.learndiary.com

上网查了资料,感觉下面这个论坛的问题跟我碰到的有点相像:

http://forum.java.sun.com/thread.jspa?threadID=450114&messageID=2043150

其中最后那位朋友的回复启发了我如下:


ckelley114

Posts:1

Registered: 4/5/06

java.net.ConnectException: Connection timed out  

Apr 5, 2006 7:55 AM (reply 3 of 3)

Click to email this message

This is a remote site connection to the internet with a DSL modem and a Cisco pix fire wall. When they get this message they can still use the internet, but can not use the current application. The server is a Windows 2000. To release them they have to cycle the power to the DSL modem and Cisco pix. Can you tell me what is causing this problem?

我连猜带蒙看他的大意是:远程站点通过一个DSL modem和一个Cisco pix防火墙连接到因特网。通过因特网访问能够工作,但是当前的应用访问不能工作,会得到上面的出错信息。是windows2000服务器。解决这个问题必须使访问通过DSL modem和Cisco pix防火墙...

还有另一个地方的答案也与防火墙有关:

转自:(http://www.iexp.com/support/forums/message.cfm?message_ID=260


 

Support Forums

Forums

CFX_RawSocket

java.net.ConnectException: Connection timed out: connect. Java exception occurred in call to method

Subject:  RE: RE: RE: java.net.ConnectException: Connection timed out: connect. Java exception occurred in call to method

Date:  03/18/2004 10:01 AM

Author:  Dominic <oad74@yahoo.com >

  Reply to this message

Just want to appreciate the answer given to this problem. I had the same problem

connectiong to a server behind a firewall and changing

IP address to the machine name works.

bravo!

Dominic

------------

>Hi,

>

>

I guess you might be trying to connect to the

>

server which is behind a firewall. Generally the

>

IP address of the server will be different behind

>

firewall and outside the firewall. So instead of

>

using the IP address if you use the fully qualified

>

host name of the server while connecting, then it

>

will connect without this exception.

>

>

Murali.

>

>

>

------------

>

>------------

>

>

>

>If I implement the tag in Coldfusion and I try to call it it comes back with the error: java.net.ConnectException: Connection timed out: connect. Java exception occurred in call to method. I think this is due to the fact that my server is behind a firewall so uit can't get to the url provided. How can I define a proxy server to connect the URL provided?

的确,通过我的手工输入调用访问上面的代码能够工作。就是空间里的程序本身不能访问。

我试着把域名改为其它的辅助域名(www.learndiary.com或www.123go.org.cn,都是用301重定向到主域名java.learndiary.com的)就一切正常了。

又是一个糊里糊涂的出现问题,糊里糊涂的解决问题的例子。

这叫知其然不知其所以然。没办法,我没有能力去掌握所有的知识和细节。只要解决问题就OK了。

网站地图链接数目和形式及不同静态网页在seo上有无区别

在"搜索引擎优化排名SEO每天一贴"请教了zac关于网站地图链接数目和形式以及静态网页在seo上的效果有无区别。得到解答如下:

摘自:SEO问题解答


  68.  littlebat说:

      2006年12月8日 at 7:16 pm

      zac,您好。

      请问两个问题:

      1、网站地图(即像您网页右下的那个Sitemap)可以放多少链接合适?

      比如,我的站有1000多网页(以后或许更多,比如几十万;)),可不可放在一张网站地图上?

      如果放在一张地图上不好,有两种方式可以放:一是分成几张平行的地图,比如4张,并排放在网页下方;二是在网页下方放一张目录性质的网站地图,然后每个目录又链接到一个下一层次的网站地图;

      2、对于静态网页*.htm,*.html,*.jsp在SEO上哪个要好一点点?我知道您认为:http://www.chinamyhosting.com/seoblog/2006/08/07/seo-questions/

      这样的还要好一点点,不过我问的是上面几种后缀名的比较。

      我问*.jsp的静态网页是因为在*.jsp中可以作一些程序的处理,比如:中文户包含中文的网页提示文字(像按纽文字),非中文用户包含英文的网页提示文字(内容相同)。

  69. Zac说:

      2006年12月9日 at 4:04 am

      littlebat: 最好不要放链接超过100个。你说的第二种处理(分层次)比较好。

      文件后缀名对SEO没有影响。

SCJP认证特惠活动即将停止报名(转帖)

今天早上收到这封邮件,如果有哪位想参加Sun 公司的SCJP技术认证考试的“全国所有大中专院校的全职在读学生”一定要认真看一看。

邮件正文:

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

尊敬的Sun技术社区用户:***

Sun 中国技术社区的注册会员:

我想您之前可能已经通过种种渠道已经得知,在Sun 中国技术社区的大力争取下,全国所有大中专院校的全职在读学生均可在2006年12月31日之前以人民币450 元的学生特惠价格参加Sun 公司的SCJP技术认证考试。在2006年12月31日之后,这个考试将恢复全球统一价格,也就是人民币 1250元。

Sun 公司作为Java语言的发明者,对全球的Java开发人员进行技术水平认证。该认证在国际上获得了IT公司的普遍认可,是目前国际上最热门的IT 认证之一。根据IT认证领域的权威媒体《认证杂志》(Certificate Magazine)的调查结果,在专业背景类似的开发人员当中,拥有 SCJP的开发人员平均起薪要比其他开发人员高21.7% 。诸多国内外IT公司更是在招聘过程中将SCJP认证作为筛选简历的必要手段。

Sun 中国技术社区一直都在努力帮助学习Java的学生获得SCJP技术认证。此次针对大中专学生的SCJP特惠价格,正是在Sun 中国技术社区的大力争取下获得批准。为了帮助同学们顺利通过SCJP考试,我们还组织人力精心编译了一份SCJP复习资料。经过众多稍微具备Java语言基础(在学校上过一个学期的Java课程)的同学实战试用的经验表明,只要根据此复习资料

认真复习两个星期左右,通过SCJP考试的可能性达到90%以上。这份复习资料可以从Sun 中国技术社区的网站免费下载:

http://gceclub.sun.com.cn/SCJP_Guide.pdf

报名参加此次SCJP技术认证考试学生特惠活动,只要如下两个步骤:

(1)至少提前一个星期联系Thomson Prometric全国的考试中心,进行报名。考试中心的联络方式,请通过如下网站查询。由于此次特别优惠活动的截止日期是12月31日,因此您报名的最后期限为12月24日。

http://www.prometric.com.cn/。

(2)持身份证和学生证在约定的考试时间到考试中心进行考试。

如果您对此活动有任何疑问,可以拨打我们的热线电话进行询问,或者发送电子邮件向我们查询。

电话号码:010-62799911,每周一到周六9:00-17:00

电子邮件:chinareg@thomson.com

此外,Sun 中国技术社区于近日向全国大专院校公开招聘20名实习生,负责在校园内宣传和推广Sun 公司的软件技术,包括Java编程语言, NetBeans集成开发环境,以及Solaris 操作系统。我们不要求应聘的学生事先就充分具备这方面的技能,但是希望您能够有较强的学习能力以及与人沟通的能力,能够在短时间内通过培训和自学掌握相应的技术并且能够给身边的同学演示和讲解。因此,我们要求应聘的学生在12月31日之前通过SCJP认证考试,作为学习能力和完成能力的证明。如果您在12月31日之前通过SCJP认证考试并且对我们的实习生职位感兴趣的话,请您将简历发送给 Yang.Wang@Sun.Com。 我们会认真阅读所有的简历,并且通过电话面试决定最终的人选。获得实习生职位的同学,将会被邀请到位于北京的 Sun 工程研究院进行技术培训,并且在Sun 公司资深工程师的指导下在本地开展技术推广工作。在实

习结束之后,Sun 公司会给所有的实习生开具实习工作评估证明,该证明可以作为您寻找下一份工作的推荐信使用。

如果您需要了解Sun 中国技术社区的更多活动,请访问我们的网站:

http://developers.sun.com.cn/。

如果您觉得这封信的内容可能对您的朋友和其他的人有用,请您转发给他们或者是转贴到您经常光顾的网上社区或者论坛。

Sun 中国技术社区

2006年12月09日

Sun技术社区 http://gceclub.sun.com.cn

(退订SUN社区邮件)

********************************************************************************************************

                                                           转帖完毕

不知怎么搞的,系统的邮件发送系统突然失效

今天,我玩意中发现系统的邮件发送系统失效了。也就是说别人订阅了的邮件收不到。

我怀疑是申请的免费的邮箱对这种利用他们的邮箱发邮件有了限制。但是不确定。明天把学习日记自己的邮箱重新启用作邮件发送邮箱试试。

原来,因为学习日记发的邮件常被别的邮件系统当成垃圾邮件(不被其它大的邮件系统信任吧?),所以改用tom.com的邮箱。可是今天不管是tom.com和126.com的邮箱均不能完全的正常工作了。现在想起来,应该用自己的邮箱,就算是被识别为垃圾邮件,也是自己的东西。而且,如果真的有朋友愿意订阅我们的邮件,只要把我们的发送邮箱加入他们邮箱的白名单就行了吧。

*************************************************

补充,这时(距上面的发文半小时后),我才发现可能是tom.com的免费邮箱接收邮件系统出了故障,不能及时收取信件了。因为我把接收学习日记的邮箱改为另一个邮箱后就收到了。而且,我们这个系统的测试帐号的那个邮箱也能收到。明天再看看那些邮件会不会来。

javax.servlet.UnavailableException

今天,我改了几个类文件上传到虚拟空间,应用自动重启不能成功。在log中报告:


2006-12-07 21:25:37,578 - Initializing application data source dataSource

org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (User xyz has already more than 'max_user_connections' active connections)

at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:855)

at org.apache.commons.dbcp.BasicDataSource.setLogWriter(BasicDataSource.java:598)

at org.apache.struts.action.ActionServlet.initModuleDataSources(ActionServlet.java:808)

at org.apache.struts.action.ActionServlet.init(ActionServlet.java:335)

at javax.servlet.GenericServlet.init(GenericServlet.java:82)

at com.caucho.server.http.Application.createServlet(Application.java:3114)

at com.caucho.server.http.Application.loadServlet(Application.java:3065)

at com.caucho.server.http.Application.initServlets(Application.java:1923)

at com.caucho.server.http.Application.init(Application.java:1849)

at com.caucho.server.http.VirtualHost.startApplication(VirtualHost.java:1207)

at com.caucho.server.http.VirtualHost.getInvocation(VirtualHost.java:1007)

at com.caucho.server.http.ServletServer.getInvocation(ServletServer.java:1249)

at com.caucho.server.http.RunnerRequest.handleRequest(RunnerRequest.java:343)

at com.caucho.server.http.RunnerRequest.handleConnection(RunnerRequest.java:274)

at com.caucho.server.TcpConnection.run(TcpConnection.java:139)

at java.lang.Thread.run(Thread.java:595)

Caused by: java.sql.SQLException: User xyz has already more than 'max_user_connections' active connections

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:771)

at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1229)

at com.mysql.jdbc.Connection.createNewIO(Connection.java:2558)

at com.mysql.jdbc.Connection.<init>(Connection.java:1485)

at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)

at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:37)

at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)

at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:877)

at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:851)

... 15 more

2006-12-07 21:25:37,593 - connect fail in CallHtml.callOnePage()!

2006-12-07 21:25:37,593 - excute manager.deleteExpiredRecords() 1 times.

于是,我连接mysql查看当前活动连接数(show porcesslist;)确实达到了空间的最大活动连接数。

然后,只要一进入*.do形式的链接均在页面上报告上面相似的错误。也不知道是我上传的类文件是否触犯了Struts框架哪根神经?

上网用出现错误的关键字查了一下,其中有一篇http://mail-archives.apache.org/mod_mbox/struts-dev/200312.mbox/%3C20031204011632.14053.qmail@nagoya.betaversion.org%3E 上面的话:“Struts missing commons-dbcp and commons-pooling jar files.”启发了我。于是,我把lib中的那个:commons-pool-1.3.jar移走了。然后,我再输入*.do的链接,错误信息变了,为:


2006-12-07 22:11:07,765 - Unable to initialize Struts ActionServlet due to an unexpected exception or error thrown, so marking the servlet as unavailable.  Most likely, this is due to an incorrect or missing library dependency.

java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool

at java.lang.Class.getDeclaredConstructors0(Native Method)

at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)

at java.lang.Class.getConstructor0(Class.java:2640)

at java.lang.Class.newInstance0(Class.java:321)

at java.lang.Class.newInstance(Class.java:303)

at org.apache.struts.util.RequestUtils.applicationInstance(RequestUtils.java:143)

at org.apache.struts.action.ActionServlet.initModuleDataSources(ActionServlet.java:805)

at org.apache.struts.action.ActionServlet.init(ActionServlet.java:335)

at javax.servlet.GenericServlet.init(GenericServlet.java:82)

at com.caucho.server.http.Application.createServlet(Application.java:3114)

at com.caucho.server.http.Application.loadServlet(Application.java:3065)

at com.caucho.server.http.Application.initServlets(Application.java:1923)

at com.caucho.server.http.Application.init(Application.java:1849)

at com.caucho.server.http.VirtualHost.startApplication(VirtualHost.java:1207)

at com.caucho.server.http.VirtualHost.cron(VirtualHost.java:1359)

at com.caucho.server.http.ServletServer.cron(ServletServer.java:1940)

at com.caucho.server.http.ServletServer.handleCron(ServletServer.java:1774)

at com.caucho.util.Cron$CronThread.evaluateCron(Cron.java:199)

at com.caucho.util.Cron$CronThread.run(Cron.java:163)

2006-12-07 22:11:07,812 - connect fail in CallHtml.callOnePage()!

2006-12-07 22:11:07,812 - excute manager.deleteExpiredRecords() 1 times.

看来,应用已经有反应了(先前是没有任何反应,改变类文件也没反应,log信息一点不变。我又不能手动重启位于虚拟主机上应用,因为他们还暂时不提供这个功能),于是,我再把那个commons-pool-1.3.jar加进去。然后,系统成功自动重启,log信息如下:


2006-12-07 22:12:16,187 - Enter updateCache!

2006-12-07 22:12:21,609 - connect success in CallHtml.callOnePage()!

2006-12-07 22:12:21,609 - excute manager.deleteExpiredRecords() 1 times.

我也不知道是什么原因,就这样糊里糊涂的出问题,又糊里糊涂的解决了问题:)

也许,我中了seo的毒了?

从理论上讲,www.javaeye.com的静态文件列表对搜索引擎来说有内容复制之嫌疑。

如:这篇帖子:confluence不支持群集,是因为hibernate吗?

在静态文件列表中是:http://www.javaeye.com/t/20169.html

而在动态文件列表中是:http://www.javaeye.com/topic/20169

也就是说,相同的内容在他们页面有两个版本,一个动态的,一个静态的。

我不知道这对它们在搜索引擎中的收录有什么影响?

也许,我现在考虑搜索引擎考虑得太多了。

像这两天又想在虚拟主机提供商端实现彻底的301重定向,但是到现在为止也还没有成功。

做网站,或者更坦白的说,学习知识的我不应该在为迁就搜索引擎而折磨自己了。

还有,我发现一个著名的linux个人站linux.vbird.org,他有两个域名:http://linux.vbird.orghttp://www.vbird.org,进入都是同样的返回200 ok状态码;还有他的文章如: DNS 伺服器設定 两个域名都返回的是200码

http://www.vbird.org/linux_server/0350dns.php

http://linux.vbird.org/linux_server/0350dns.php

也就是说,也有内容复制之嫌。

但是以“DNS 伺服器設定”为关键字检索site:linux.vbird.org有结果,而site:www.vbird.org却没有这篇文章的影子,只有这篇文章的老版本:http://www.vbird.org/linux_server/0350dns/0350dns.php存在,而且,这篇老文章被标记成了补充材料。

另外,另一篇文章(Enterprise Linux 实战讲座前言DNS 反解( Reverse Lookup )原理)的pdf文件:

http://linux.vbird.org/somepaper/20050630-dns-1.pdf分在了linux.vbird.org,

而同样文章的第二部分却分在了:www.vbird.org/somepaper/20050630-dns-2.pdf

但是他还不是照样很红火?

我想,是google根据判断把本来是一个站的内容分在了两个域名下。

说明这还是有问题的,我上vbird.org问一下站长vbird的想法如何?

也许,正如:SEO每日一帖的zac说的那样,我中了SEO的毒了?

如何分离个人信息,缓存动态页面(转帖)

下面是一个用于php中的静态缓存加入动态个人信息的方案,我觉得他的思路是可以借鉴的,就转帖在这里了。

正文

****************************************************************************

转自:(http://nio.infor96.com/archives/283

如何分离个人信息,缓存动态页面

肖理达 (KrazyNio AT hotmail.com), 2005.06.07, 转载请注明出处

一直想写一篇关于动态页面 cache 的文章,但每次?提笔?却又放弃,因为总是觉得准备得

还不够充分。今天埋头写下,只是希望对自己的工作做一些笔录。

1、问题起源

我们经常会在一个动态页面中加入很多个人信息,以 CMS 首页为例,用户登录之前显示登

录框,登录之后显示其用户名,并根据权限显示其可用模块的链接。由于每个用户登录之

后,显示出来的动态信息都是不一样的,所以这部分无法进行 cache,我们将这部分信息

定义为?个人信息?,它的特性是根据登录用户进行动态改变。

现在问题来了,就是一个 CMS 的首页,访问者的登录概率并不是百分百的,应该说有一大

部分人访问首页是没有登录的,这个时候的首页是一个公共的页面,没有任何个人信息,

或者说这时候首页的任何动态信息都是可以转换成静态的,也就是说这部分是可 cache 的

2、使用 JavaScript 分离个人信息

解决这个问题的方法有很多种,一种是将个人信息和其他信息进行分离,如在 CMS 首页中

加入一个外部的 JavaScript 文件,而这个文件的内容实际上是由 PHP 动态生成的。CMS

首页 index.php 代码片段:

<script language="JavaScript" src="/js/personal.php"></script>

?.

<script language=?JavaScript?>

document.write(sUser);

document.write(sLinks);

</script>

personal.php 代码片段:

<?php

session_start();

header(?Cache-Control: no-store, no-cache, must-revalidate?);

?>

sUser = ?<?php echo $_SESSION['USER']; ?>?;

sLinks = ?<?php echo addslashes($_SESSION['LINKS']); ?>?;

这种方法比较适合个人信息较少,易于集中显示的情况。通过 JavaScript 外挂代码实现

个人信息分离之后,personal.php 是永不 cache 的,这样也就可以放心地对 CMS 首页进

行 cache 了,具体的 cache 方法可采用 304 HTTP 头与 Cache_Lite 相结合的方式,这

在后边有详细代码示例。

3、选择性分离个人信息

一旦个人信息较多,很难对其进行分离的时候,上述方法实现起来就会比较麻烦了。接下

来介绍一种比较放宽的 cache 方式,就是只对用户未登录的 CMS 首页进行 cache,一旦

发现用户处于登录状态,则跳过 cache 部分,直接运行相关代码,我把这种方法称为?

选择性 cache
?。这种方法中,我们牺牲了一部分可 cache 的情况,但很大程度上提

高了个人信息的可扩充性,也就是说个人信息的多少、显示的位置等等都不再受到限制,

这是值得的,毕竟修改服务端代码要比修改大量的 JavaScript 代码要来得方便,而且

JavaScript 的调试也会比较麻烦。

分析一下这种 cache 方式,概要流程图如下:

image

代码片段如下:

<?php

session_cache_limiter(?must-revalidate?);

session_start();

if (empty($_SESSION['USER'])) { //未登录时才使用 cache

    ?.    //输出 cache

} else {

    //  直接输出页面内容,此条件下与未使用 cache 时一样

    $data =& get_data();

    echo $data;

}   //end if

?>

这里需要说明的一点是,由于 PHP 在使用 SESSION 时,php.ini 中默认设置的

session.cache_limiter 为 nocache,所以需要修改 cache_limiter,设置成

must-revalidate,使得客户端再次浏览当前页时必须发送相关 HTTP 头信息到服务器进行

验证,然后才决定是否加载客户端本地 cache。不要把客户端本地 cache 与服务器端

cache 搞混,之后的代码片段中会充分利用客户端 cache 和服务器端 cache 机制达到缓

存的目的。关于 must-revalidate,请参考 HTTP 规格说明书 RFC 2612 的 14.9.4 章节

上边的代码并不完整,接下来是更加深入的探讨客户端 cache 机制了,利用客户端 cache

,可以有效地减轻服务器端负载。首先了解一下 HTTP 头:Last-Modified 与

If-Modified-Since。简单的说,Last-Modified 与If-Modified-Since 都是用于记录页面

最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头

,而 If-Modified-Since 则是由客户端往服务器发送的头,其工作原理图如下:

image

可以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将

先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进

行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的

内容,如果是最新的,则返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户

端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了

服务器的负担。想要详细查看 HTTP 头信息,可以在 Firefox 中安装 LiveHTTPHeaders

插件,安装完成之后按 Alt+L 就可以在 Sidebar 中看到了。

现在再来完善之前的 index.php 代码:

<?php

session_cache_limiter(?must-revalidate?);

session_start();

function &get_data()

{

    //此函数用于获取本页面的输出内容

    //?.

}   //end function

if (empty($_SESSION['USER'])) { //未登录时才使用 cache

    //====================================================

    //  1. 检查 HTTP 头是否符合 304 的条件

    //====================================================

    //get_last_modified() 函数需要另外单独实现,此函数用于获取服务器端 cache 文件的最后修改时间,可将时间戳保存在数据库中。

    $last_modified = get_last_modified();

    $headers = getallheaders();

    if (strtotime($headers['If-Modified-Since']) == $last_modified) {

        //  返回 304 并结束程序运行

        header('HTTP/1.1 304 Not Modified');

        exit;

    }   //end if

    header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $last_modified) . ' GMT');

    //====================================================

    //  2. 检查 cache 文件是否存在

    //====================================================

    require_once 'Cache/Lite.php';

    //  参数设置

    $options = array(

        'cacheDir' => './cache/',

        'lifeTime' => 86400, //最大 cache 一天时间

        'fileNameProtection'   => false //使用 CMS 自身提供的 id 作为名字

    );

    $cache = new Cache_Lite($options);  //创建 Cache_Lite 对象

    $id = md5($_SERVER['REQUEST_URI']); //生成对应于 cache 文件的 ID

    if ($data = $cache->get($id)) {   //存在 cache 文件,获取内容,直接输出

        echo $data;

    } else {

        $data =& get_data();

        echo $data;

        flush();

        $cache->save($data);    //保存 cache

    }   //end if

} else {

    $data =& get_data();

    echo $data;

}   //end if

?>

测试时可以使用 LivHTTPHeaders 插件,你将会看到第一次访问时是返回 200,第二次到

第N次访问时则返回了 304,而登录之后,则一直都返回 200,因为我们选择性 cache 之

后,对登录之后一律运行程序输出,而不使用 cache,如果之后需要对输出的个人信息进

行修改,只需要改函数 get_data() 即可,也避免了 JavaScript 的调试。

总结

除此之外,还有其它方法可以实现分离个人信息,缓存动态页面的目的。而且为了提高服

务器运行效率,还可以使用数据库 cache、Squid 反向代理等,如 ADOdb 的 cache。目前

用的比较多的 Drupal 应用的就是本文中提到的第二种方法。

参考资料

HTTP Caching & Cache-Busting for Content Publishers

Hypertext Transfer Protocol ? HTTP/1.1

PHP Anthology, Volume 2: Applications. Chapter 5: Caching

Caching Tutorial for Web Authors and Webmasters

Drupal 源代码

Comments RSS | Trackback URL

4 Comments on ?关于 Cache(4)?

By zeal. June 13th, 2005 at 3:25 pm

我们目前采用的是oracle cache server以及squid。对于不能cache的内容采取分目录存放

。在代码设计的时候就考虑可cache性。对于大量需要用户交互的内容,似乎cache的作用

不大。

By Nio. June 13th, 2005 at 5:02 pm

嗯,如果内容本身全都是个人信息的话或者必须登录才能浏览的页面,就用不到这种cache

方法了,需要看登录与不登录的概率比而定 🙂

By nc. July 17th, 2006 at 12:43 pm

感谢你文章的提示,非常不错.

By ahu. October 8th, 2006 at 5:10 pm

zeal的公司貌似有些money~

**************************************************************************

                                                           转载完毕

另一段静态页面计数代码:


<script language="javascript" src="/data/include/count.php?id=$id"></

script>

转摘自:(http://www.mephp.com/view.php?tid=1&id=44

301永久性重定向和302临时性重定向的研究(转帖)

转自:301永久性重定向和302临时性重定向的研究

301永久性重定向 和 302临时性重定向 的研究

作者:快速胡萝卜 日期:2006-08-09

字体大小: 小 中 大

先简要说一下

重定向就是网页自动转向

301永久性重定向

302临时性重定向

实施301后,新网址完全继承旧网址,旧网址的排名等完全清零。

实施302后,对旧网址没有影响,但新网址不会有排名。

详情见下文。

301 Redirect 永久重定向的实现

  在我们的网站建设中,时常会遇到需要网页重定向的情况:象网站调整,如改变网页目录结构,网页被移到一个新地址,再或者,网页扩展名改变,如因应用需要把.php改成.Html或.shtml,在这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户还会得到一个404页面错误信息,访问流量白白丧失;再如某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点,等等。

  常用的重定向方式有: 301 redirect, 302 redirect 与 meta fresh:

  301 redirect: 301代表永久性转移(Permanently Moved),301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。

  302 redirect: 302代表暂时性转移(Temporarily Moved ),在前些年,不少Black Hat SEO曾广泛应用这项技术作弊,目前,各大主要搜索引擎均加强了打击力度,象Google前些年对Business.com以及近来对BMW德国网站的惩罚。即使网站客观上不是spam,也很容易被搜寻引擎容易误判为spam而遭到惩罚。

  meta fresh: 这在2000年前比较流行,不过现在已很少见。其具体是通过网页中的meta指令,在特定时间后重定向到新的网页,如果延迟的时间太短(约5秒之內),会被判断为spam。

    页面永久性移走(301重定向)是一种非常重要的“自动转向”技术。

  301重定向可促进搜索引擎优化效果

  从搜索引擎优化角度出发,301重定向是网址重定向最为可行的一种办法。当网站的域名发生变更后,搜索引擎只对新网址进行索引,同时又会把旧地址下原有的外部链接如数转移到新地址下,从而不会让网站的排名因为网址变更而收到丝毫影响。同样,在使用301永久性重定向命令让多个域名指向网站主域时,亦不会对网站的排名产生任何负面影响。

  302重定向可影响搜索引擎优化效果

  迄今为止,能够对302重定向具备优异处理能力的只有Google。也就是说,在网站使用302重定向命令将其它域名指向主域时,只有Google会把其它域名的链接成绩计入主域,而其它搜索引擎只会把链接成绩向多个域名分摊,从而削弱主站的链接总量。既然作为网站排名关键因素之一的外链数量受到了影响,网站排名降低也是很自然的事情了。

  综上所述,在众多重定向技术中,301永久性重定向是最为安全的一种途径,也是极为理想的一款解决方案。

  对于正确实施301重定向,本人整理了以下方法可供大家参考:

  1. Apache服务器实现301重定向

  a. 相比较来说,Apache实现起来要比IIS简单多了。在Apache中,有个很重要的文件.htaccess,通过对它的设置,可以实现很多强大的功能,301重定向只是其中之一。

  Redirect permanent / http://www.yourdomain.com ;将目录下内容重定向到http://www.yourdomain.com/

  redirect permanent /old.html http://www.yourdomain.com/new-url/ ;将网页old.html内容重定向到http://www.yourdomain.com/new-url/

  通过合理地配置重定向参数中的正则表达式,可以实现更复杂的匹配。有兴趣的朋友可参考Apache手册。

  b. 采用“mod_rewrite”技术。

  通过该技术进行的改变将在.htaccess文件中体现出来,形如:

  Options +FollowSymLinks

  RewriteEngine on

  RewriteCond %{HTTP_HOST} ^yourdomain\.com

  RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

  2. 适用于使用Unix网络服务器的用户

  通过此指令通知搜索引擎的spider你的站点文件不在此地址下。这是较为常用的办法。

  形如:Redirect 301 / http://www.yourdomain.com/

  3.在服务器软件IIS服务器实现301重定向

  * 打开internet信息服务管理器,在欲重定向的网页或目录上按右键

  * 选中“重定向到URL”

  * 在对话框中输入目标页面的地址

  * 切记,记得选中“资源的永久重定向”

  * 当然,最后要点击“应用”

  适用于使用Window网络服务器的用户

  4.绑定/本地DNS

  如果具有对本地DNS记录进行编辑修改的权限,则只要添加一个记录就可以解决此问题。若无此权限,则可要求网站托管服务商对DNS服务器进行相应设置。

  DNS服务器的设置

  若要将aaa.domain.com指向www.domain.com,则只需在DNS服务中应增加一个别名记录,可写成:aaa IN CNAME www.domain.com。

  如需配置大量的虚拟域名,则可写成::* IN CNAME www.domain.com.

  这样就可将所有未设置的以domain.com结尾的记录全部重定向到www.domain.com上。

  5. 用ASP/PHP/.net实现301重定向:

  ASP:

  Response.Status="301 Moved Permanently"

  Response.AddHeader "Location","http://www.vc01.com/"

  Response.End

  PHP:

  header("HTTP/1.1 301 Moved Permanently");

  header("Location:http://www.vc01.com");

  exit();

  ASP .NET:

  <script runat=”server”>

  private void Page_Load(object sender, System.EventArgs e)

  {

    Response.Status = “301 Moved Permanently”;

    Response.AddHeader(”Location”,”http://www.vc01.com”);

  }

  </script>

  配置完成后,要认真检查一下是否正确。Internet有很多Server Header检查工具

以下为非关键参考:

*************************************************

网站重定向成祸端(从Business.com遭封看302重定向编译:Karen)

  Business.com是网上最大的商业搜索引擎和分类目录,以专业提供商业信息而享负盛名,包括近19万网页。若以“business”为关键词在 Google中进行搜索,该网站名列第一。不过在9月5日,Business.com遇到一件蹊跷之事:它的首页由PR8变成了PR0, 而且 Google搜索结果中找不到首页。好在被“蒸发”的只是首页,不过庆幸的是第二天首页又回到了Google的搜索结果,但PR仍旧为0。

  Business.com的问题出在它的重定向命令上。该网站让business.com跳转到www.business.com,这种重定向本该是永久性的。我们知道,301属于永久性重定向,而302则属于临时性重定向,只有当一个网站或网页在24到48小时之内临时移到其它位置的情况下才能使用该命令。但Business.com却错误地使用了“HTTP/1.1302 Object Moved”状态码。

  其实网站重定向极为普遍,譬如不满意原来的域名而申请了一个新域名;买下容易被人错拼的域名,防止客户因为拼错URL而找不到网站,等等。可是,很多人却会由于使用了错误的重定向状态码而遭“灭站之灾”,就象Business.com。尽管他们的重定向理由充分合理,然而若使用不当,则可能被Google误认为是利用多个域名指向同一网站,那么你的网站就会被封掉,罪名是“利用重复的内容来干扰Google搜索结果的网站排名”。Business.com就是最好的前车之鉴。只不过大多数使用错误重定向参数的网站没Business.com这么幸运,一个小小的重定向就可能使网站前功尽弃,只能从头来过:重新申请新域名,重新发布新网站,等等。记住:Google绝不会同情任何人即使无心犯下的错误。

*************************************************

网站服务器响应网页浏览请求的运作流程

  让我们先来了解一下用户/搜索引擎和网站一开始的交互流程。当用户或搜索引擎向一个网站服务器发出网页浏览请求时,该服务器将:

  1.通过域名服务器(DNS)将域名转换为网站的IP地址,然后返回给客户

  2.打开一个该IP套接口连接

  3.记下通过该套接口的一个HTTP数据流

  4.从WEB服务器接收一个响应请求的HTTP数据流。该数据流包含状态码,状态码的值由HTTP协议所决定。  这里所说的“HTTP数据流”信息也叫“头信息(Header)”。头信息中包括了日期,服务器类型,通常还会有一条“200 OK”信息。如果一切良好,那么网络服务器就会将 “200 OK”信息以及请求页面发送出去。如果网站在这时候已经建立了重定向,那么服务器就会在头信息中包含一个 “302 Moved Temporarily”或“301 Moved Permanent”之类的响应信息。搜索引擎会根据服务器头信息中的内容作出决定。

*************************************************

网站重定向的注意事项

  1.若准备将服务器上的文件移到其它地方时,须就以下信息正确地通知搜索引擎的爬行程序:

- 目标地址:这些文件被移向何方

- 移动属性:暂时移走还是永久性移走

  2.对拥有多个域名的网站,专家建议应把那些不想在搜索引擎上推广的域名用301跳转命令来永久性重定向。

*************************************************

资深SEO专家Dan Thies的看法和建议

  对于Business.com所遭遇的问题Dan Thies深有体会,因为他也有过类似的遭遇。他的网站上有一个会员跟踪脚本,其中一个会员的站点通过302命令映射到这个跟踪脚本,而这个跟踪脚本又是通过302映射到他的主页。当在Google中用“keyword research”进行搜索,他的主页排名在前十位,然而地址显示的却是那个会员的网址。结果使他哭笑不得:访问者通过Google搜索结果进入他的网站,而他却不得不为这些访问量给那个会员支付报酬! 后来他用robots.txt文件禁止Spiders跟踪访问他的会员跟踪脚本才算解决了问题。

  对于Business.com,Dan Thies认为:“目前Google在302重定向"的处理上还存在一定的问题,但并不表示Google不允许302重定向。Business.com并未遭封或遭到惩罚,它们只是返回了错误的响应。”

  Dan Thies建议:如果使用了跟踪URL/脚本,又必须让访问者重定向到某一着陆页,那么一定要在robots.txt文件中禁止Spiders 去访问第二个重定向。如果没有对跟踪URL/脚本进行重定向,而只是把另外一个URL上的内容给复制过来,那么应在robots.txt文件中禁止 Spiders去访问跟踪URL,以防因内容重复而遭搜索引擎惩罚。引自:21cnbj:从Business.com遭封看302重定向

*************************************************

302转向与网址劫持

  302转向或者302重定向(302 redirect)指的是当浏览器要求一个网页的时候,主机所返回的状态码。302状态码的意义是暂时转向到另外一个网址。

  另一个更常见的状态码是404错误(404 error),404错误或404状态码指的是网页不存在。

  另一个和302状态码相关的是301重定向(301 redirect),301重定向指的是本网页永久性的转移到另外一个位置。301和302的区别就在于301是永久性重定向,302是暂时重定向。

  302重定向和网址劫持(URL hijacking)有什么关系呢?这要从搜索引擎如何处理302转向说起。从定义来说,从网址A做一个302重定向到网址B时,主机服务器的隐含意思是网址A随时有可能改主意,重新显示本身的内容或转向其他的地方。大部分的搜索引擎在大部分情况下,当收到302重定向时,一般只要去抓取目标网址就可以了,也就是说网址B。

  实际上如果搜索引擎在遇到302转向时,百分之百的都抓取目标网址B的话,就不用担心网址URL劫持了。

  问题就在于,有的时候搜索引擎,尤其是Google,并不能总是抓取目标网址。为什么呢?比如说,有的时候A网址很短,但是它做了一个302重定向到B 网址,而B网址是一个很长的乱七八糟的URL网址,甚至还有可能包含一些问号之类的参数。很自然的,A网址更加用户友好,而B网址既难看,又不用户友好。这时Google很有可能会仍然显示网址A。

  由于搜索引擎排名算法只是程序而不是人,在遇到302重定向的时候,并不能像人一样的去准确判定哪一个网址更适当,这就造成了网址URL劫持的可能性。也就是说,一个不道德的人在他自己的网址A做一个302重定向到你的网址B,出于某种原因,  Google搜索结果所显示的仍然是网址A,但是所用的网页内容却是你的网址B上的内容,这种情况就叫做网址URL劫持。你辛辛苦苦所写的内容就这样被别人偷走了。

  302重定向所造成的网址URL劫持现象,已经存在一段时间了。不过到目前为止,似乎也没有什么更好的解决方法。在正在进行的大爸爸数据中心转换中,302重定向问题也是要被解决的目标之一。从一些搜索结果来看,网址劫持现象有所改善,但是并没有完全解决。

  如果你遇到你自己的网站网址被劫持的时候,在你自己这一方面并没有什么办法,你只能向Google汇报。 作者: Zac原载: 搜索引擎优化每天一贴。

*************************************

以上文章为本人整理十多篇文章的成果,多处具体细节本人能力之内无法尝试,各部分原出处也已无法标明,见谅。有问题给我留言,大家一起研究研究。

JAVA学习日记页面静态化方案

JAVA学习日记页面静态化方案(借鉴了:http://www.agilejava.org/space/?233的 生成静态页面技术解决方案系列,见我的转帖:一个实现将JSP动态页面转为静态的方案(转帖)

1、首页和帖子页面静态化,帖子列表不静态化;

2、列表上的帖子用静态化链接;

3、隐私帖子页面不静态化;用户登录后用动态化链接,所以可以看到隐私帖子;

4、静态化时机:

  1)、发公开帖子;

  发公开目标:静态化目标和首页;

  公开日记:静态化日记、目标和首页;

  公开评论:评论日记:静态化日记、目标、首页;评论目标:静态化目标、首页;

  发私人日记:不作任何静态化;

  2)、修改公开帖子;

  修改目标(目标不能修改隐私属性):

  修改公开目标:目标、首页;

  修改私有目标:不作任何静态化;

  修改日记(日记可以修改隐私属性):

  修改公开日记,并且修改后仍是公开帖子:静态化日记、目标、首页;

  修改公开日记,但是修改后的日记是私有帖子:删除已经静态化日记,重新静态化目标、首页;

  修改私有日记,并且修改后仍是私有帖子:不作任何静态化;

  修改私有日记,但是修改后成了公开日记:静态化日记、目标、首页; 

  修改评论(评论的隐私属性与被它评论的目标或日记一致)

  修改公开目标的评论:静态化目标、首页;

  修改公开日记的评论:静态化日记、目标、首页;

  修改私有目标的评论:不作任何静态化;

  修改私有日记的评论:不作任何静态化;

  3)、删除帖子(私有帖子是不能被删除的);

  删除公开目标:删除目标会删除此目标下的评论和日记和日记的评论,所以要:删除已静态化的目标、删除已静态化的目标的日记、重新静态化首页;

  删除公开日记:删除日记会删除此日记下的评论,所以要:删除已经静态化的日记、重新静态化首页;

  删除公开评论:删除目标的公开评论:重新静态化目标、首页;删除日记的公开评论:重新静态化日记、日记的目标、首页;

 

  4)、静态化种类:

  手动静态化:由管理员执行手动全面静态化及维护工作:包括:对数据库和静态化文件储存目标扫描,重新静态化应该静态化的帖子;如果某个不应该静态化的私有目标或日记被静态化了则删除已静态化的文件,并且作下记录,分析原因;

  定时静态化:同手动静态化一样的功能,只不过由系统定时进行,比如每晚12:00点;

  帖子变动时的静态化:如上面的列表;

5、其它注意事项:

  1)、为了统一静态化页面和简要设计和增加系统灵活性,现对登录用户和游客用户(包括搜索引擎)的静态化作一区别:

  登录用户:全部用动态化,也就是说与现在动态化的系统没有区别;从各论坛和网站的统计情况来看:登录用户占全部用户的比例一般在5%左右,所以不会系统有什么大的影响;

  未登录用户(包括搜索引擎):首页和帖子全部用静态化,游客提交评论后通过Action的301跳转进入已静态化的最新页面,但是提交评论的表单已经静态化了,所以不能记住用户,这可以放在以后解决,同屏蔽垃圾留言的设计一起进行,可能会用<frame>内嵌表单来做。

  2)、类的设计:

  1个执行实际静态化的类:ToHtml.java;1个模拟游客访问,调用静态化的工具类:CallHtml.java;再增加一个静态化文件管理类:HtmlsManager.java,用于封装各种静态化时机的操作,包括:

  1>,提交帖子:doPostArt(),传入提交的帖子作为参数,即为doPostArt(ArticleInfo postedArt);

  2>,修改帖子:doEditArt(),传入修改前的帖子和修改后的帖子作为参数,即为:doEditArt(ArticleInfo oldArt, ArticleInfo newArt);

  3>,删除帖子:doDelArt(),传入被删除的帖子作为参数,即为:doDelArt(ArticleInfo);

  4>,检测是否相应静态化文件的方法:isExist(String phyFullName),传入系统路径的包含路径的全文件名作为参数;

  5>,删除一个相应静态化文件的方法:delete(String phyFullName),传入系统路径的包含路径的全文件名作为参数;