我的建站实录第2季(2009年1月1日起)

20090101

20090102

20090103

20090104

元旦狂玩了3天机器人大战阿尔法(PS模拟器),才玩了3分之1,我同时开3个分支,企图一次玩遍所有 的关卡,每关都要打3遍,所以进度慢,就象网站一样,进度慢。

今天早晨多睡了15分钟的懒觉,赶到办公室,4个女孩在门口列队欢迎。她们没钥匙。

 

20090105

20090109

今天记载一个bug修复,跨window,linux的程序员百分百会遇到的问题.

就是大小写,基本上,windows宽松,linux严格,所以我在window下好好运行的

程序,就是不能在linux下跑,

错误语句:

$fp = new FormProcessor_Lib_Addnews($this->db);

 修改后

$fp = new FormProcessor_Lib_AddNews($this->db);

 一丁点的问题,幸好没上线。

 

20090116

每天背笔记本上下班,包里装的就是笔记本和电源适配器,电池被我下掉放家里,不用。

今天早晨走的比较匆忙。到单位把包打开一看,是笔记本和游戏手柄。。。

 

带错了,再回家拿。

 

 

20090120

本周开始整合网站的各个主要模块,加链接,简单测试。为上线做准备,领导说,都靠我了。

 

 

20090124

今天还要上班,nnd,能开的全开上,什么空调啊,电脑啊,传真机。

没心思写程序,美女们都回家了,没劲。

 

20090205

最近没什么心思写博客,把原先写的几个模块分别用框架重写,力争2月底第一版上线

 

20090209

某模块二级域名很麻烦,正在思考解决方案

 

20090212

继续重写以前的模块,快完了。

 

20090216

 今天突然发现,博客浏览过30000,看来以后写技术文章要谨慎了!!!。写错就是误导啊.

20090221

网站要实现一个需求,显示漂亮的字体,一般用户的机器也不会有,如汉仪_行楷简。

思路:先给服务器加这些字体,再用php的函数imagettftext,该函数可以往图片上加指定字体的文字(包括汉字),强悍的函数啊。

另一种思路是也用这个函数,但是生成透明的图片,只有这些文字,然后通过css放到原先的背景图上。

 

 

20090224

还剩两个小模块,就基本OK了。

另外很多细节也没来得及搞,如文章标题的title属性(鼠标移上会出现tips),很多页面的title,分词。

以及最重要的优化。

 

20090226

主要模块都搞定了,

下面是优化和细节调整:

 

细节调整:

1、每个页面的title和关键字,还不知怎么搞关键字,没有分词的库

2、调整字数,有的新闻要显示一部分分内容,要截取字数,目前是在模板里设定的

 

优化(主要参考《高性能网站建设指南》《构建可扩展的Web站点》apache手册,《PHP Web2.0开发实战》):

1、图片实现客户端缓存。

2、对于网站首页,有一个大图片,含有各个背景

3、合并js文件,代价是如果我改动了公用库的js文件,要重新合并,而且调试不便,

     可以考虑使用丑陋的if else 然后在配置文件里决定是分开调还是调总的js

4、实现gzip压缩传送

5、服务端缓存,主要靠memcache,

6、给服务器加一个php编译缓存

7、还有很多。

 

===============================================

 

规则4:压缩组件

 

首先处理压缩。windows下就是我的笔记本就不装了

先检查apache是否安装了mod_defalte(请一定注意我用的是apache2。x的版本,apache1对应的是mod_gzip)

进入linux:

apachectl -l

该命令会列出当前apache的所有模块,很幸运,我装了。我当时用的是

tar -zxf httpd-2.2.9.tar.gz
cd httpd-2.2.9
./configure --enable-modules=all
make
make install

 

既然装了,下面就改配置。

AddOutputFilterByType DEFLATE text/html  text/css application/x-javascript application/javascript

 把上面一句放在httpd.conf的主机配置或者合适的位置。

把firefox打开测试,把firebug打开,点击“网络”

在任意的html页面刷新,

看到Response Headers

中有这么一句:Content-Encoding:gzip,(本来是没有的)

成功!


其实要点是:观察firebug中页面组件的返回类型,然后填上去就行,但是书上也说,不要压缩所有的图片,切记。

所以上面一行就是压缩html,css和js,

js有两种类型,没办法,一个是书上写的,还一个是我自己的apache返回的,

 

========================================

 

关于规则5:将样式表放在顶部,我一直都这样做。

关于规则6:将js脚本放在底部,遗憾,对于我这个网站,不行,因为我在页面中已使用js库的函数了,

这意味着我只能将js脚本放在页面顶部,没办法了。其实这是可以改的,

我将来再改吧:

方法是,把js库的加载放在页面底部,然后,再把当前页面的所有js再放到下面,即可,不过,这样对开发有难度,

再说吧。

另一个办法是,把js库的加载放在页面底部,然后,再把当前页面的所有js都放到prototype库的onload函数里,这个办法应该可行,有空再试。

 

==========================================

 

关于规则7:避免css表达式。

美工的css水平低,自然用不到。而我也恪守此准则,坚决不用,实在要用就用js实现。

 

=========================================

 

关于规则2:使用内容发布网络,

这要花钱,还要消耗精力,等网站大了再说吧^-^

 

=========================================================

 

关于规则8:使用外部javascript和css

相信所有人都是这么做的。我也是

 

============================================

 

规则3:添加Expires头和max-age头

apache的mod_expires模块会根据配置自动发送exipres头和max-age头,

跨浏览器改善缓存的最佳解决方案就是使用由expirsDefault设置的Expires头

 

首先我检查是否安装了该模块,幸运的是,已经装好了,当然了,enable-modules=all嘛。

然后改配置,

再虚拟主机里

ExpiresActive On
<FilesMatch "\.(gif|jpg|jpeg|png|js|css)$">
  ExpiresDefault "access plus 48 hours "
</FilesMatch>
 

 

 如果愿意也可以再补充,

ExpiresByType image/gif "modification plus 5 hours 3 minutes" 

 modification应该是文件的最后修改时间算起,

access应该是访问的那是算起。

plus无意义。

数字必须整数,后面的时间单位可以是:

  • years
  • months
  • weeks
  • days
  • hours
  • minutes
  • seconds

参考了apache的文档,一个根据正则,一个根据类型。

一般来说,php页面不应被客户端缓存,注意,但是可以在服务端缓存。

 

js和css可以通过加文件创建时间来hack,如http://ssss.com/js/1.js?123456789这样的url好像不行。

图片应该被缓存较长时间。

但是用户头像怎么办呢?应该缓存较短时间,但还是要缓存,

 

关于mod_expires模块,apache的资料很详细,容易看懂,不象有些模块。

另外,只要是PHP输出的内容,都可以自行指定所有的头,方便!!

事实上,js,css和所有的图片都可以由PHP输出,只是看有无必要罢了,

 

检查是否服务器发送了这些头很简单,用firebug看,有了,成功了!!

 

============================================================

关于规则13:配置ETag

最简单的方法是:移除服务器返回的Etag。

修改apache的配置文件

添加

FileETag none

就这么简单!

 

进入firebug检验,果然消失,成功!

 

 

===================================================

 

 

 

今天后台优化开始,

先装大名鼎鼎的APC,某个php开源缓存,还是吃了不少苦头,

注意:apc.so是动态连接库,和别的php模块的区别,别的大都是静态的,也就是编译好的。如PDO模块!

 

步骤:进入linux下的php安装目录下的bin目录,应该发现有一个pecl文件

./pecl install apc

 如果后悔了,就

./pecl uninstall apc

 这个还是方便的。

 

然后会问你问题,不管,直接回车。

最后会提示你装好,

Build process completed successfully
Installing '/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/apc.so'
install ok: channel://pecl.php.net/APC-3.0.19
configuration option "php_ini" is not set to php.ini location
You should add "extension=apc.so" to php.ini

关键是这里:

进入php.ini,

一定改extension_dir="./"

为php下的某个目录,如,可以自己创建

 extension_dir="/usr/local/php/extension"

 

并在php.ini文件最后加

[apc]

extension=apc.so

这里还可以加参数,不加也有默认值。

 

然后,用find命令搜索apc.so,find /usr -name apc.so

然后把该文件拷贝到extension_dir指定目录,并设为777属性。

重启apache,用phpinfo()函数应该可以看到,很明显,

HTTP Headers Information下面,

apc

APC Support enabled
Version 3.0.19
MMAP Support Enabled
MMAP File Mask no value
Locking type pthread mutex Locks
Revision $Revision: 3.154.2.5 $
Build Date Feb 27 2009 15:36:02

 

 

总之,在phpinfo里看到才可以,说明装好。如上面显示的信息

 

我失败的原因是没有改extension_dir

搞定!

===========================================

 

 

 关于linux启动的重要问题。

必须linux启动后进入文本界面,这样又可以省下很多内存。必须的。

 

============================================

 

 

 

 

 

 

 

 

20090228

前台优化规则1:减少HTTP请求,

 

今天我主要搞这个,css是美工写的,一个页面最多两三个,所以我不优化。

今天合并js,改天搞主页的图片Sprites。

合并js,但是小的js仍然保留,我决定用改文件名的正规方式,如sitejs_1.js是合并后的js。当任意一个小文件改了后,都要重新合并,并且改名为sitejs_2.js。同时把序号和文件名存数据库,于是每次在页面发送php时,需要到库里查序号,然后发送。

 

但是这样有一些问题,主要是开发机器和生长服务器版本不同怎么办。

于是我转换策略,每次发送页面时,到某个固定文件夹下找js文件,文件名的开头是sitejs_ 

然后,发送这个js。

结果到最后,发现不需要数据库了,因为生成前可以读取文件名,把序号加1不就行了吗?

 

20090303

今天要先把各页面中的广告用程序直接插入数据库,唯一麻烦的就是图片上传,编辑诉苦说上传的东西太多,所以广告我先来搞,

今天和美工一起实现了首页的图片sprite,就是一个大图片gif,里面包含了很多小图片。

然后和领导一起到某网络公司取经,对方的项目经理用asp,不过对于网站优化很有经验,最最重要就一条,少查数据库,增删改是没办法的,那只能少查。以应付每日百万PV。

领会了。

 

20090304

确定今天的工作,专题要首页改,js合并,自动生成广告记录。

20090305

继续昨天未完工作.,

把网站的汉字名称输入google,第4页才查到,

输入百度,根本找不到,

没关系,目标就是第一。时间3个月内估计应该实现。

 

20090306

今天的工作:检查了首页的图片加载,确保没有大图片。

增加一个用户传logo的功能。

还有,给页面加标题和关键字,很多还没做,事真多呀

 

20090309

今天的工作,完成标题和关键字的页面添加,思考并开始实现apache的监控,

其实早该做的,不然都不知道网站的访问量有多大。

 

20090310

昨晚到9点下班,今天的工作,继续把分站的标题搞定,然后开始实现apache的监控

 

20090311

最近研究了apache的日志功能,也很有意思,不过不打算用第三方的分析工具,

自己写PHP分析吧!反正都是文本文件。

并打算建表,字段,主键,时间,分析结果字符串。日PV。时间段应该加唯一索引。

每天一条记录插入。

然后每月的统计,只根据数据库来,就不看日志了,

日志只供日统计用。

 

20090312

今天继续日志分析,

已看到百度的爬虫了。

 

服务器文件都是用svn更新的,今天在apache配置文件中阻止了客户端对.svn目录的访问。

并且在根目录下增加了robots。txt这个文件允许所有的爬虫。

 

20090313

今天继续日志分析。

今天发现一个方法,如何查看网站后台密码受攻击。

 

可以在php程序中看,也可以直接分析apache日志

日志中,存在用户名且服务器代码不是200,就是受到密码破解,

 

日志的好处是占用资源少。

用php程序的好处是可以实时预防,如收到同一IP20次错误,则封锁IP,

而且用php总是可以自己完全的控制。

各有各优点。

 

20090314

今天星期六,今天的工作:做两个新页面,同时把以前模块部分链接指向新页面。

 

20090316

今天继续做服务中心。

发现无论如何努力都不能把set names utf8的查询语句移除。遗憾。

 

20090317

今天做后台的管理员权限分配。

就是有多个管理员,决定哪个管理员能进哪个模块,可以由超级管理员决定。

 

20090318

昨晚小通宵一把,搞后台管理员权限设置。

今天的工作:某模块预先用美术字体生成静态图片。文字,都预先的生成好,然后直接在页面发送图片。

 

20090319

今天继续把图片生成好,把相应页面改好

 

20090320

今天本想做memcache的,临时新任务,再做留言板。

网站即将上线,我已在单位内部感受到一种宗教式的狂热,自己也象打了鸡血般兴奋,加班也不知道累

 

20090324

今天,在领导的同意下,新功能暂时先放,先搞缓存。

我的计划是memcache,然后只缓存数据,不存对象,

数据分两种,一种是数据库里查出的数据,一般来说是数组,也有不是的。

 另一种是模板处理后的数据,就是html片段,注意是片段。

 

为什么说是模板处理后,是因为模板中也有函数,我用的是smarty。

而函数处理要花时间,所以最好缓存处理后得到的html代码。

 

并决定后台不缓存,只缓存前台。

===========================

window下memcache的安装和使用

 

下载服务端的windows版,这个轻而易举,我下的是1.2.1,最新稳定版是1.2.4,但我未用。

然后php扩展,官方网站居然说网站正在重建?!我只能破口大骂Y。。。

google一番,终于找到如下网址

http://cn.php.net/get/pecl-5.2.6-Win32.zip/from/a/mirror

注意我用的是PHP5.2.6版本。

下载下来后,我哭了。

 

然后,我又发现,我机器上的windows版的php安装目录已经自带了所有的dll扩展。包括这个php_memcache.dll。

我又哭了。

 

下面的工作就简单了。

 

几个发现:

1)似乎windows版的可能是版本低,好像不支持对象存储。原因不明,但是反正我也不打算存储对象。

2)memcache的php客户端的api,都有两种写法,过程的或是对象的,手册中写的很清楚。

     当然,我用对象的,

3)为保险起见,我用connect,不用持久连接pconnect.

 

 

4)有人说“利用memcached常用的做法:在每取得一次cached对象后,重新设置这个对象的cache时间,这样能够使得经常被调用的对象可以长期滞留在缓存中,使得效率增倍。”
这个说法我不认可,因为需要定期更新,哪怕命中了。

memcached的基本设置:

    -p 监听的端口
    -l 连接的IP地址, 默认是本机
    -d start 启动memcached服务
    -d restart 重起memcached服务
    -d stop|shutdown 关闭正在运行的memcached服务
    -d install 安装memcached服务
    -d uninstall 卸载memcached服务
    -u 以的身份运行 (仅在以root运行的时候有效)
    -m 最大内存使用,单位MB。默认64MB
    -M 内存耗尽时返回错误,而不是删除项
    -c 最大同时连接数,默认是1024
    -f 块大小增长因子,默认是1.25
    -n 最小分配空间,key+value+flags默认是48
    -h 显示帮助

 


4)重要的方法getStats()会返回数组,其中,
我自己的测试,windows下默认预分配
64M,可以从$mem->getStats()返回的数组的'limit_maxbytes' => '67108864'项看出。
而'bytes'表示正在使用的字节数,很重要。
其余猜也猜出来:
'pointer_size' => '32',32位指针,
'curr_items' => '9',   内存当前条目数,这个不重要,重要的是占内存多少。
'get_hits' => '1359',   服务开启以来命中次数
'get_misses' => '234'   服务开启以来失败次数
'bytes_read' => '41257', 服务开启以来读取总字节数,不重要
'bytes_written' => '114318' 服务开启以来写入总字节数,不重要

网上查的资料说:如果内存满了,再往里写,会挤走以前的数据,未经证实,但是,我不需要
管这些,因为当这种情况出现时,说明该加内存,或减少程序对memcache的依赖,或者设置压缩写入等
我写程序每10分钟查一次memcache内存占用,然后日志记录。


bool Memcache::set ( string key, mixed var [, int flag [, int expire]] )
set函数的用法是最重要的,而且依据php语法,最好不要放置数字0,免得分不清是有缓存结果0,还是没有读到缓存。
我肯定不压缩,所以,flag设为0, 时间默认是多少,我还真不知道,不过也不关心,必须给它设一个秒数。

经过慎重思考:决定暂时不用zend的缓存接口(它可以包含memcache),因为不熟悉,所以先还是直接使用memcache的客户端。

=================

linux 下memcache的服务端和客户端安装

参考《黑夜路人的开源世界》

http://blog.csdn.net/heiyeshuwu/archive/2006/11/13/1380838.aspx

我不按照文章中的路径安装还不行,真是神人。

 

NOTE: 如果 libevent 不是安装在 /usr 目录下,那么需要把 libevent-1.2a.so.1 拷贝/链接(ls -s /usr/local/lib/libevent-1.1.so.1 /usr/lib)到 /usr/lib 中,否则memcached 无法正常加载。运行以下命令来启动 memcached。

 

服务器版本是memcache1.2.6,比windows版本高一些。

 

装完后,装客户端,也是按照文章中的链接,

有两种选择(memcache 和 memcached),按照黑夜路人的推荐,选择了较老的memcache

版本2.2.5。

memcache客户端php安装参考了如下文章

http://www.linuxsir.org/main/?q=node/184

安装memcache PHP模块

root@tonyvicky:# tar vxzf memcache-1.5.tgz
root@tonyvicky:# cd memcache-1.5
root@tonyvicky:# /usr/local/php/bin/phpize
root@tonyvicky:# ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir
root@tonyvicky:# make
root@tonyvicky:# make install

 

之后,用find命令寻找/usr 下的memcache.so这个文件的位置,把它拷贝到你php.ini中extension_dir

下的路径即可。

之后记住在php.ini中加上一句

extension=memcache.so

 

这时,重启服务器,用phpinfo终于又在linux下看到了和window下类似的模样

memcache

memcache supportenabled
Active persistent connections 0
Version 2.2.5
Revision $Revision: 1.111 $

 

DirectiveLocal ValueMaster Value
memcache.allow_failover11
memcache.chunk_size81928192
memcache.default_port1121111211
memcache.default_timeout_ms10001000
memcache.hash_functioncrc32crc32
memcache.hash_strategystandardstandard
memcache.max_failover_attempts2020

 

爆感动,感谢开源世界啊,偶泪流满面。。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值