记点东西
2011年12月12日PHP

没有评论
293 views

zf增加.html的后缀,即可以实现静态化的插件

之前是.php后缀的页面,如何只需把后缀改成.html,像:http://www.gudalu.com/index.php,访问:http://www.gudalu.com/index.html 就会自成生成静态文件呢?

前段时间古大陆的cpu有点高,处理txt章节不给,决定搞成这种自动静态,zend framework很方便,三步搞定

1.创建一个ZendEx_Plugin_Html的插件,用来处理写html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?Php
/**
 * 静态化插件
 * 
 * @package tool
 */
class ZendEx_Plugin_Html extends Zend_Controller_Plugin_Abstract
{
	protected $_filePath;
 
	public function setFilePath($filePath)
	{
		$this->_filePath = $filePath;
	}
	public function dispatchLoopShutdown()
    {
		$htmlContent = $this->_response->__toString();
		$pathinfo = pathinfo($this->_filePath);
		!is_dir($pathinfo['dirname']) && mkdir($pathinfo['dirname'], 0777, true);
		file_put_contents($filePath, $htmlContent);
	}
}

1. 在入口把所有.html的请求全部转发到HtmlController中~

1
2
3
4
5
6
7
8
9
	$router = $front->getRouter();
	$htmlRoute = new Zend_Controller_Router_Route_Regex(
		'[\d\w\/]+\.html',
		array(
			'module' => 'default',
			'controller' => 'html',
			'action'     => 'handle'
		)
	);

 

2.HtmlController注册ZendEx_Plugin_Html插件,这里可以对uri进行处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
/**
 * 静态化控制器
 * 
 * @author  yuehei
 * @package ex
 */
class HtmlController extends Core_Controller_Action
{
	public function handleAction()
	{
		$requestUri = $this->_request->getRequestUri();
		$requestUri = parse_url($requestUri);
		$requestPath = $requestUri['path'];
		// --- 通过条件定位对应的参数来静态化数据
		$module = 'default';
		$controller = $action = '';
		$params = array();
		if (preg_match('/^\/index.html$/', $requestPath, $rs)) {
			$controller = 'index';
			$action = 'index';
		}
		// --- 文章页
		if (preg_match('/^\/file\/([\d]+)\/index\.html$/', $requestPath, $rs)) {
			$id = $rs[1];
			$controller = 'file';
			$action = 'view';
			$params = array('id' => $id);
		}
		if (empty($controller) || empty($action)) {
			//$this->_showError('无法解析地址');
			$this->_closeView();
			$this->_response->setHeader('Status', '404 Not Found', true);
			return;
		}
 
		$this->_forward($action, $controller, $module, $params);
		$this->_closeView();
		$filePath = str_replace('_app', '_www', APP_PATH) . $requestPath;
		// --- 给更低的运行级别,在render之后运行
		$helperHtml = new ZendEx_Plugin_Html();
		$helperHtml->setFilePath($filePath);
		$helperHtml->setRequest($this->_request)->setResponse($this->_response);
		$this->getFrontController()->registerPlugin($helperHtml);
	}
}

 

2011年09月22日点滴

没有评论
804 views

linode的东京机房太给力了

昨天刚更换完,速度很给力,电信100以下,基本上可以媲美国内的服务器了。

换机房也很简单,提个ticket工作人员立马响应,二个小时左右换完,以后用联通的线路再也不用天天掉线了。鼓舞…

2011年07月21日platform

没有评论
415 views

FastDFS

fastdfs是一个分布式的文件存储系统,

项目主页:http://code.google.com/p/fastdfs/

支持论坛:http://bbs.chinaunix.net/forum-240-1.html

测试了一下,发现很好用,优点:

1,简单:tracker做负载均衡,storage存储数据。

2,良好的横行和纵向扩展:增加group即可实现容量扩充,增加group内的storage即可实现性能扩充

3,节省成本:数据不分块存储,前端无须再加一层缓存,直接将storage当做web server来使用

4,良好的灾备:不需要raid,group内的storage存储相同的数据

5,持续的的更新,作者很用心

配置文件:http://bbs.chinaunix.net/thread-1941456-1-1.html

2011年01月1日点滴

没有评论
797 views

回望2010

1. 今天的年终总结是坚持,明年的计划仍然是坚持。
2. 从去年11.4开始跑步,这一年一直在跑,今早上秤81.7kg。
3. 三年又三年,这是第二个三年的结束,也是第三个三年的开始。上次我给自己画了一个大饼,结果变成了一烧饼,这次不画饼了,改成给自己吹个泡泡。

2010年再见,2011年你好。分享一首05年超级女生,就是李宇春那一届,有个叫赵静怡的选手唱了一首歌。

 我的左手旁边是你的右手

2010年12月29日点滴

没有评论
463 views

旧的记事本

收拾衣服的时候,翻出了一本日记,从05年6月12号,一直写到07年1月20号,断断续续写了一年多。
随手翻翻,看着深浅不一的笔迹,依稀能回忆起当时的心境。

06/23/2005 正在看让我痴迷不已的诛仙,写了二页感想,这要是发到网上,那就是长评。
07/27/2005 非常想家
09/30/2005 连续好几篇都在写做游戏帮派论坛,做金山游戏推广员,怎么在学校里帖小广告,以及如何是被坑的悲惨故事。
12/05/2005 反思了自己的一些想法,以及看了《乱世铜炉》的感想。现在的我和5年前的我在一些价值观上仍然一致。
12/09/2005 第一次用java写程序的兴奋。
12/24/2005 平安夜让我回忆起了昔日的网友。
12/31/2005 年终的我发现又混过了一年
05/26/2006 确定电脑是我的饭碗
01/20/2007 年终总结:害怕

之后就开始工作了,刚工作时睡眠严重不足,就没有时间扯蛋了,整个日记也就断了。不写日记,我发现脑子里记的全是事,关于个人的感受已经模糊不清。现在又开始续写这本日记,不过留了一页空白,代表已逝去近四载的时光。

心跳那几秒

晚上去吃饭,回来已经8点多了,折腾折腾,9点半左右才出去跑步,比平时晚了40多分钟。穿过像伊拉克一样的唐家岭废墟,沿着土井路跑,到达一个三叉路口,正常情况下我会沿着这条路一直跑到东北旺然后再原路返回。就在拐弯的时候,我看三十多米开外,有一条硕大的黑狗,慢悠悠的穿过马路,消失在黑暗里,当时没引起我警惕,因为一般情况下,这么大的狗都是有人带着的。

谁曾想,我刚跑到这个地方,这条连个绳子都没有的狗,突然从黑暗里窜了出来冲我狂叫,我当时第一反应是,这狗不会过来这狗不会过来,还没想完,这狗就冲我扑过来了。当时离的很近,我后退侧身闪过,手好像砸到什么,大拇指有点疼,当时第一感觉就是手破了手破了,要打狂犬疫苗了。大狗见没有扑到,就往后退了一点,冲我狂叫,我也面对着大狗戒备着,边对峙脚边往后退,当时不是很怕,感觉这条狗不像野狗,扑的时候不凶,也不快,可能是从家跑出来的,退到7,8米左右,这条狗又扑过来了,一个1米多高的狗快速冲人跑过来,还是非常恐怖的,我再次侧身闪过,幸好这时候来了一辆车,灯打过来时这狗就有点虚,一击不中,就又往后退,在那儿冲我吼,这时候已经离的比较远了,我也象征性在路边找了找砖头,可惜也没有找到,望了我一会儿,这狗就又消失在黑暗中了。没有找到砖头的我,思考了一下,决定这条路今天先不跑了,在路灯下看了看大拇指也没破皮,万幸。

这条路我跑了一年多,经常碰到流浪狗,尤其是唐家岭拆迁以后,更时不时的碰到拉帮结派5,6条在一起的狗群。有时候跑步也会被执著的狗追,但一般只要我停一下,这些狗就不敢靠近了,有些不长眼的狗,我要反过来追它们一下。但这次碰到这么大的,这么凶猛的,上来就扑的,还真是第一次,两个字总结:肝颤。明天早点,可不想再和这狗搏斗了。

2010年10月8日platform

没有评论
674 views

nginx下wordpress的rewrite

国庆前买了 linode 的VPS,算是edong撤走了,不用再去照相了,照相这种备案方式和以前BBS专项备案一样,没有什么操作性,迟早也要取消的。以前用edong vps,跑的是nginx+apache,这次直接换成nginx+spawn-fcgi。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

上面是推荐的rewrite规则,但是这样规则会将不存在的图片,css等文件也都转发到index.php,这些文件应该报个404的。

    #现在nginx上使用的rewrite
    server {
        server_name yuehei.37net.com;
 
        access_log   /var/log/nginx/yuehei_37net_com_access.log main;
        error_log     /var/log/nginx/yuehei_37net_com_error.log info;
 
        root  /data/html/37net.com/yuehei;
        index index.html index.htm index.php;
 
        error_page  403  =200 /403.html;
        location = /403.html {
            root /data/html;
        }
        error_page  404  =200 /404.html;
        location = /404.html {
            root /data/html;
        }
 
        location / {
            if (!-e $request_filename) {
                rewrite ^(.*)$ /index.php last;
                break;
            }
        }
 
        location ~ \.(gif|jpg|jpeg|png|css|js)$ {
            expires 365d;
        }
 
        location ~ \.php$ {
            include /etc/nginx/fastcgi_params;
        }
    }

测试一下: http://yuehei.37net.com/test_test.png 报的是404了

2010年06月5日收藏

没有评论
921 views

5.2 – 6.5收藏

5公里,这段时间下雨,聚会,玩三国杀,跑的比较懈怠,85.5KG

1,EasyUI for jQuery

2,Persona——Web人物角色介绍

3,Web服务器压力测试工具http_load、webbench、ab、Siege使用教程

4,wxpython in action 非常详细的wxpython讲解,对我这种没有做GUI编程的人用处很大。刚看完到11章,准备写一个简单的使用SQLite的报表。

2010年05月8日读书

没有评论
807 views

看完《孤独六讲》

这本书断断续续看了快了一个月,今天把最后几页看完。我打了四颗星,总体上来说还是不错,但是感觉太零碎,作者像是随手拾来,看不到严密的逻辑,感觉天马行空,这种书一般都不讨我喜。

很少人能坦然面对负面情绪,一出现就会想办法消除或者转移走,就像这个时代每个人都在强调自信,强调勇气,每个都在害怕自卑,害怕懦弱一样。人有七情六欲,交替博弈,是一个正反合的过程,一个再自信的人也有自卑的时候,一个再勇敢的人也有懦弱的时候,只要是个人它就无法摆脱这些情绪。不能坦然面对这些负面的情绪,就不能认识自我,更无法获得真正的自信,勇气。

这是一本很诚恳的书,很喜欢刚开始的一句:孤独没有什么不好,使孤独变得不好的,是害怕孤独。

这么晚了还不睡,主要是因为今天很点背,晚上取钱的时候,银行卡忘记拿出来了,一个杯具。

2010年05月6日webgame

没有评论
1,202 views

WebGame 开发过程与备忘(一)前端基础框架的封装

这个webgame虽然还有bug,有一些功能要完善,界面也要重新更换,但基本上告一段落,我会一般修bug,一边做总结,这是这篇总结的第一章,算是一个备忘。

做这个项目之前,我有2年左右的PHP开发经验,对python有一些了解,javascript一般般,但用起来倒也得心应手。之前对webgame有一些了解,自己也玩过,也debug其中一些认为做的比较好的,这样也就不算陌生。

我的技术背景决定整个webgame是基于PHP+javascript来完成,为了更好的用户体验,我决定采用OPOA的形式。javascript项目有一个问题,就是连接保持,现在流行的comet方式,我都试了一遍,如果没有一个支持这一特性的web server配合的话,都不理想,最后还是使用了flash的socket,后面我会用专门一章节来讲。

其次,在做的过程中也走过一些弯路,比如刚开始,我过于强调所谓的性能,而把很多计算放到客户端来做,为了保证客户端时间正确,又把服务器的时间同步过来等等,做了一些无用功。javascript虽然功能很强大,但过于依赖javascript,限于个人的水平,会导致前端不可控,错误不可重现,bug无法排查,最后会被活活急死。

另一个重要的问题,就是整个后端返回的是数据还是html,我曾经debug一个知名的webgame,发现它整个后端都返回html,当时我不以为然,认为完全没有必要,所以我采用的就是返回json。现在看来其实两个都各有好处,返回html可以避免前端再进行处理(譬如非常烦人的数据组装),只要一个dom就可搞定。返回数据则可以减少数据量,加快响应速度,我现在采用的是数据+javascript模板的方式,javascript模板很少发现有网站在用,模板对于普通网站来说,可能弊大于利,但对于OPOA类的程序,好处显而易见的,配合延迟加载也可以减少一些弊端。

一般应用的过程是:前端 -> 调用后端 -> 处理结束 -> 返回前端,这个过程webgame也有,但webgame有时候会回调前端,即:
前端 ->  调用后端 -> 处理结束 -> 返回前端 -> 再回调前端。

/*
一个例子:购买一个道具,就更新银两的显示。把JRun.loadBack看成是一个ajax的封装。
一般情况下代码会像下面这样写,但这样有一个弊端,不止买道具,其它很多地方(比如卖)也可能要更新银两显示,
难道每一次更新都要这样写吗?
*/
JRun.loadBack('/goods/buy', {goods_id: 1, num: 5}, function(data) {
    var status = data.status;
    if (status == 1) {
        $('#role_tael').html(data.tael);
    }
});
 
/*
下面的代码换了一种写法,所有更新银两的显示都调用了JRole.updateTael。
但是又有一个新的问题,买道具不一定非要银两,有可能是声望,购买成功以后也更新声望的显示,
这时候就需要扩展status,来告诉前端如何处理。
*/
JRun.loadBack('/goods/buy', {goods_id: 1, num: 5}, function(data) {
    var status = data.status;
    if (status == 1) {
        JRole.updateTael(data.tael);
    } else if (status == 2) {
	JRole.updateRepute(data.repute);
    }
});
var JRole = {
    updateTael: function(tael) {
        $('#role_tael').html(tael);
    },
    updateRepute: function(repute) {
	$('#role_repute').html(repute);
    }
};

随着要处理的类型的增多,status会越来越多,整个前端会很臃肿,而且会越来越不可控。如何让后端更自由的调用前端?有一些webgame返回的是html,里面内嵌javascript,这种方式并不推荐。可以采用格式化的返回数据来解决这个问题。

// 前端调用
JRun.loadBack('/goods/buy', {goods_id: 1, num: 5});
// goods/buy返回数据格式
{status: 1, data: {tael: 5}, callBack: "JRole.updateTael(data.tael);"}

这样就清晰简单多了,前端只需一行代码。服务器处理完成以后,自定义callBack作为返回内容,前端会自动调用并将数据传入。只要对JRun.loadBack进行简单的封闭,让它识别callBack的内容。后端对前端的可控性会降低前端的代码量,同时也可应对复杂的交互。

这样的前端设计基本上能满足我目前的应用。另外如果我能在开发早期注意到问题,完全可以在实现控制(JRun.loadBack),模型(后端PHP),模板(javascript渲染)的分离。

返回顶部