Vanilla Forums

简介Vanilla Forums是一套PHP+MySQL开源论坛。它的特点在于各种配置,功能,操作界面风格(Themes)都很简洁,素雅。另外Vanilla默认会在首页中直接列出所有贴子,按照时间顺序,把最新的讨论贴放在最前面和概念中的论坛相比更加像博客。Vanilla所有的功能和模块都是通过应用(Applications)和插件(Plugins)来实现,是一款灵活的轻量级论坛程序。

这两天都是在捣鼓这个东西,再加上家里有人来装修什么的,原本的计划都被打乱了。最初看到Vanilla Forums(注目:不是吃的草莓……)是在煎蛋最初的论坛上面,当然那时还不知道这就是Vanilla Forums,正式知道叫做Vanilla Forums还是在09年的时候,当时在家无聊,于是就想搭个论坛玩玩什么的(当然后来并没有实行),当时国内的主流论坛程序大概有下面这些吧:PHPwind 、Discuz、Dvbbs 、BBSMAX、BBSXP等,但一直以来都觉得这些论坛程序大多都是臃肿恶心的,尤其是当时SNS大行其道,有些论坛自然也连SNS也功能也整合进去了实在是无法忍受,现在回看,这些论坛带SNS的模式没有多少个是成功的。而我心中的论坛,外观上最起码应该是百度贴吧或者天涯或者水木清华或者小百合那样的,方便简单、明了直观。

于是就看看国外的开源程序,主流的有phpBB、MyBB、UseBB等,但这些离我心目中轻量级还有一段距离,于是就想到了早期在煎蛋看到过的讨论区,那时候再去煎蛋,煎蛋已经弃用了Vanilla。不是很甘心,于是上php-open上面查看一下有什么收获没有,果然发现了Vanilla Forums的踪迹,当时Vanilla Forums的版本是1.1.9,界面如下,搭建后放了上一个空间商,发了一些帖子。但后来因为去了工作繁重的阿里同盟上班也就不了了之了。

Vanilla Forums

两天前在网上看到有人在提及这个东东,于是就点上官网上看看。哈一上去就是惊喜Vanilla Forums已经升级为2.0.16版本了,界面依然简介,虽说界面上比1.1.9版豪华了那么一点,但依然没有违背简约这个原则。最后还是将其下载下来摆弄了一两天,哈哈,最后分享一下这两天的中文配置经验和心得吧,不算完整也不完善,纯分享而已。Vanilla Forums下载地址:http://vanillaforums.org/download

安装环境,php4.1+和MySQL,这个不多说了。

新安装的Vanilla Forums会自动开启两个应用,VanillaConversations,其中Vanilla是核心应用,禁用之后论坛不能被访问,看到有说官方有提供1.0版本和2.0版本Vanilla应用,不过找过1.0版本的;Conversations是用户之间发私信的应用,禁用后不影响论坛使用,但用户之间则不能互发私信,而且Conversations可以提供多个用户之间相互聊天的功能,有点像多人聊天室。

中文语言包,国外的东西默认语言当然不会是中文了,但国内也有热心人士提供了中文语言包,下载地址是:点击这里。具体启用方法是:

解压文件后,将zh_CN文件夹移动的网站locales里边;
然后修改config/config.php文件中$Configuration['Garden']['Locale']选项;
改成$Configuration['Garden']['Locale'] = ‘zh-CN’;,如没有看到改选项的话就自己添加;
然后进入管理后台启用中文语言,注意是先修改后启用。

评价,该语言包翻译了前台绝大部分语言,我发现有一两个是遗漏的,当然如果添加了一些插件,则可能会不能全部翻译,这是可以自己通过修改语言包来达到目的。后台作者并没有翻译完整,不过对于老手老说英文后台不是太碍事,实在不行的话Google翻译一下大概能知道真正的意思。

时区,程序是通过读取php.ini这个配置文件来确定时区的,所以用户可以通过修改php.ini来修改成东8时区,如果不能修改php.ini的话,可以通过修改bootstrap.php来改成东8时区

找到bootstrap.php文件;
找到// Make sure a default time zone is set
if (ini_get(‘date.timezone’) == ”)
date_default_timezone_set(‘America/Montreal’);

改成// Make sure a default time zone is set
//if (ini_get(‘date.timezone’) == ”)
// date_default_timezone_set(‘America/Montreal’);
date_default_timezone_set(‘Asia/Hong_Kong’);

其实就是屏蔽了原有判断语句改为直接使用香港时区。

中文用户名,论坛使用邮箱注册,可以自定义用户名,但默认只能是英文的,可以通过以下方法来实现定义中文用户名

找到functions.validation.php文件
找到ValidateUsername函数,将函数中的正则表达式改成‘/^([\d\w_\x80-\xff]{3,20})?$/si’

使用中文名之后会出现一些小问题,比如产看中文名用户资料页面会出现错误,原本@加上用户名之后可以通知被@的用户还有点击可以跳转到用户资料页面,但对中文名用户失效,原有#加上英文单词可以跳转到搜索页面,类似话题模式,但论坛本身本没有识别中文分词什么的,所以#之后加上中文内容不能点击进行搜索,下面提供解决方案

/profile/用户名 可以访问到用户资料

找到applications/dashboard/models/class.usermodel.php文件
$User = $this->SQL->Where(‘u.Name’, $Username)->Get()->FirstRow();
改成 $User = $this->SQL->Where(‘u.Name’, urldecode($Username))->Get()->FirstRow();

@用中文名用户 和点击链接

找到functions.general.php文件
找到GetMentions函数
将正则式‘/(?:^|[\s,\.])@(\w{3,20})\b/i’,
改成‘/(?:^|[\s,\.])@([\S]{1,20})(?=[\s,\.!?]|$)/i’,
找到library/core/class.format.php 文件
找到Mentions 函数
将正则式‘/(^|[\s,\.])@(\w{1,20})\b/i’, //{3,20}
改成‘/(^|[\s,\.])@([\S]{1,20})(?=[\s,\.!?]|$)/i’,

#中文话题 搜索

找到library/core/class.format.php 文件
找到Mentions 函数
将正则式‘/(^|[\s,\.])\#([\w\-]+)(?=[\s,\.!?]|$)/i’,
改成‘/(^|[\s,\.])\#([\S]{1,30}?)#/i’,
将紧接着的正则式‘\1′.Anchor(‘#\2′, ‘/search?Search=%23\2&Mode=like’).’\3′,
改成’\1′.Anchor(‘#\2#’, ‘/search?Search=%23\2%23&Mode=like’).’\3′,

通过上面的修改,可以将中文话题以#话题#的形式点击跳转,类似各大微博,但对于中文搜索依然不可用。

插件推荐
程序初期提供了16个插件,但并非感觉上并不是每个都用到,下面就写一写我这两天测试推荐使用插件。
AdSense,顾名思义,就是Google AdSense的插件,将广告添加在主题帖之后。
EasyReply,通过这个插件,帖子会提供一个链接,点击之后会在回复框自动添加@用户名 来提醒用户有人回帖了。
Emotify :) ,表情插件,再回复框左上角添加了既可爱又操蛋的表情按钮。
IE6 Update,虽然官方说Vanilla Forums是兼容IE 6的,但经过测试由JQuery实现的弹窗在IE 6下其实是不兼容的,所以用这个插件来提醒一下吧,貌似国外IE 6基本已经绝迹了,但国内用的还是很多。
Magic,通过这个插件,jpg、jpeg、gif、png这四种格式的图片只要在文本框直接添加图片路径就会自动转换成图片了,要注意的是,这个插件的功能对主题帖是不起作用的,只对回帖起作用,你可以通过在$Sender->EventArguments['Comment']->Body = $this->MakeView($Sender->EventArguments['Comment']->Body);之后添加$Sender->EventArguments['Discussion']->Body = $this->MakeView($Sender->EventArguments['Discussion']->Body);这段语句,则插件对主题贴也起作用了。
Post Count,有了这个插件,可以统计出用户的发帖数。
Quotes,提供引用功能的插件,不过有一个不足,就是如果原帖有1000字,则如果引用的话会1000字全部引用,可以通过修改JS文件来实现只引用100字之类的,这个暂时没改。
HtmLawed,用了屏蔽有害Html代码插件。
Embed vanilla,通过这个插件,Vanilla Forums允许使用js将整论坛嵌入到一个页面中,在选用一个合适的主题效果不错,如图所示。

wordpress-Vanilla-1

wordpress-Vanilla-2

备用插件:
Facebook,用Facebook账号登陆论坛的插件。
Twitter,用Twitter账号登陆的插件。
GoogleSignIn,用Google账号登陆的插件。
天朝里边以上3个插件的作用不大。
FileUpload,允许用户上传附件的插件。
Cleditor,基于JQuery驱动的一款可视化编辑器,个人对可视化编辑器比较无爱。
Following,用户互粉插件。
WhosOnline,用户在线显示插件。
Gravatar,这个插件可以使用户调用Gravatar头像,不过Vanilla Forums本身允许用户上传自定义头像,所以作用不大。

嗯先写这么一些吧,毕竟插件还没全部用过,而且部分英文看不懂,Goggle翻译出来的也不是太靠谱。
Vanilla Forums除了提供帖子讨论功能之外,还用动态分享和收藏帖子功能,动态分享功能有点像QQ空间和腾讯朋友的动态分享功能,就是简约一点吧。

posted @ 2011-03-23 19:43 小马歌 阅读(3263) | 评论 (0)编辑 收藏
 

文章作者说“跑到微软那一查,给的答复让我吐血:Do not enable HTTP compression for the script files 请不要对脚本文件开启http压缩 只好在服务器端增加对浏览器的识别代码,如果是ie6,就不压缩脚本文件了 虽然脚本能运行了,可是用户体验就...  哎,我恨ie 6”

唉,说啥好呢?

真相是,微软的答复(http://support.microsoft.com/kb/327286/en-us?sid=64&spid=2073) 里面提供了两个解决方案,其中第一个描述的稍微啰嗦了一点,被这个作者直接忽略掉了。第二个解决方案只有一句话,显然更容易被读懂:

To work around this problem, you can do either of the following:

If you use a Cache-Control: no-cache HTTP header to prevent the files from caching, remove that header. In some situations, if you substitute an Expires HTTP header, you do not trigger the problem.

-or-

Do not enable HTTP compression for the script files.


Emu虽然英文比较烂,四级老考不过,为了方便大家还是翻译一下吧,不然又该有人读不下去了。

  要规避此问题,你可以在下面两个方案中选一种:

    1.如果你使用了Cache-Control: no-cache 这个 HTTP 头来防止文件被缓存,移除这个头就好了。有些情况下,如果你用一个Expires头来代替(前面这个出问题的http头),(也可以起到相同作用而)不会触发这个问题。

    或者

    2.不要压缩脚本文件。

个人建议还是考虑第一方案。

本文作为前面一篇翻译文章《压缩,让网络更快》的补充。
posted @ 2011-03-15 22:21 小马歌 阅读(209) | 评论 (0)编辑 收藏
 

php有许多系统预定义变量,通过判断他们可以简单的判断系统是 windows还是*unix, 其中相关的函数或者预定义变量如下:


php_uname();
PHP_OS
DIRECTORY_SEPARATOR
PHP_SHLIB_SUFFIX
PATH_SEPARATOR
 
具体程序:

 

Php代码 
<?  
if(PATH_SEPARATOR==':') echo 'Linux';  
else echo 'Windows';  
?> 

<?
if(PATH_SEPARATOR==':') echo 'Linux';
else echo 'Windows';
?> 
或者

 

Php代码 
<?php  
echo php_uname();  
echo "<br>";  
 
echo PHP_OS;  
echo "<br>";  
 
/* Some possible outputs: 
Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686 
Linux 
 
FreeBSD localhost 3.2-RELEASE #15: Mon Dec 17 08:46:02 GMT 2001 
FreeBSD 
 
Windows NT XN1 5.1 build 2600 
WINNT 
*/ 
 
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {  
    echo 'This is a server using Windows!';  
} else {  
    echo 'This is a server not using Windows!';  
}  
 
?>

posted @ 2011-03-15 22:04 小马歌 阅读(310) | 评论 (0)编辑 收藏
 
当项目繁多的时候,需要规范,并且定义到细节,只有这样,才能支持大规模的开发。
PM非常重要,PM的能力将直接导致项目最后的质量。
本文是根据公司当前的现状而描述的,并不一定普遍适用--合适的,就是最好的。
项目经理职责:
1、 基本职责就是确保项目目标的实现,领导项目团队准时、优质地完成全部工作。
2、 与客户沟通,了解项目的整体需求。并与客户保持一定的联系,即时反馈阶段性的成果,和即时更改客户提出的合理需求。
3、 制定项目开发计划文档,量化任务,并合理分配给相应的人员。
4、 跟踪项目的进度,协调项目组成员之间的合作。
5、 监督产生项目进展各阶段的文档,并与QA即时沟通,保证文档的完整和规范。
6、 开发过程中的需求变更,项目经理需要跟客户了解需求,在无法判断新的需求对项目的整理影响程度的情况下,需同项目组成员商量,最后决定是否接收客户的需求,然后再跟客户协商。确定要变更需求的情况下,需产生需求变更文档,更改开发计划,通知QA。
7、 项目提交测试后,项目经理需了解测试结果,根据测试的bug的严重程度来重新更改开发计划。
8、 向上汇报。向上级汇报项目的进展情况,需求变更等所有项目信息。
9、 项目完成的时候需要项目总结,产生项目总结文档。
项目经理权利:
1、 开发指挥权。项目开发人员的分配和调整。
2、 技术决策权。主要是审查和批准重大技术措施和技术方案,以防决策失误,造成重大损失。
3、 申请协作权。项目发展出现不能解决的问题的时候,可以向上级申请协作。
4、 考核成员权。考核项目组成员,视觉和测试组只考核组长。
必备流程:
1.            每天下午5:00――6:00,项目经理召集该项目的相关人员(包括开发人员、美工等)作项目每日总结,内容包括:
(1)    了解每个成员的工作进度情况。
(2)    了解成员在工作中遇到的困难,并寻找资源解决。
(3)    成员之间的配合是否协调一致(比如,需要提交的物件没有按时提交或遗忘等)。
(4)    如有需要,根据当前的进展情况调整项目计划。
(5)    安排每个成员第二天的工作。
(6)    如果考虑到项目当前的进展状态可能会导致项目延期,则项目经理有权安排项目组加班,以保证工期。
2.            如果项目经理接收到新的需求,则项目经理应该在下午的项目每日总结会上提出,并分配安排工作。除非新来的需求特别紧急或影响到项目组当前正在进行的任务,需要召集项目组成员紧急讨论外,否则不应打断项目组的当前工作。
如果新的需求是在每天下班后接收的,则项目经理应在第二天早上召集项目组成员讨论并安排任务
posted @ 2011-03-09 22:59 小马歌 阅读(306) | 评论 (0)编辑 收藏
 

It seems something is wrong with IE's cache and GZip

好多Linux + Apache的服务器都会对CSS、JS和图片这些静态的内容设置缓存,到了IE这里又会在本地做一个缓存。所以当我们更新了CSS文件之后,常常会出现客户端没有更新,导致显示出现问题。之前我一直使用时间戳参数的方法来解决:

<link rel="stylesheet" type="text/css" 
href="common.css?time=20060408" />

每次更改了css文件就把参数time的值设为更改当日的日期,这样本地IE就会把它当作一个新的文件更新一次。

但是在最近做的项目中发现一个比较奇怪的问题,服务器端做了gzip压缩,到客户端第一次解压的时候没问题,第二次访问的时候ie从cache里读文件就出问题了,只能读出前面大约一两千个字节。在两台win2000+ie6的机子上重现了这个问题,XP的还没有发现。

最终的解决方案是在时间戳参数后面再加上一个.css结尾,也就是这么写:

<link rel="stylesheet" type="text/css" 
href="common.css?time=20060408.css" />

然后就一切正常了...

大概IE在从缓存里读文件的时候还得对文件扩展名做一个判断,所以这么加一下它就认了。我自己对这个解释不甚满意,所以如果你有标准答案麻烦留个言

BTW,这个现象在.js文件上同样重现了。


posted @ 2011-03-08 13:19 小马歌 阅读(450) | 评论 (0)编辑 收藏
 

我在美国生了两个孩子,生育前后都有培训班,家庭医生每次洗脑让我受益匪浅,我的两个宝宝在婴儿时期乖巧得好像家里没有小婴儿,我甚至疑心她们会不会哭?如今外婆常拿这句傻话笑我。回国后看到朋友或邻居们被小祖宗折磨得精疲力竭,我遇到一个就会分享妈妈经,很没效率,想着将妈妈经写下来或许会帮到手忙脚乱、身心疲惫的年轻爸爸妈妈。再次感谢南加州著名的儿科医生JANE GU,这几年在她的指导下学到很多一辈子都受益的育儿宝典。

 

绝招一

如何让小宝宝不哭

爱哭的BABY都是爸妈教出来的。才出生的小BABY听不懂话,他们靠条件反射来做判断。中国的家长一听到孩子哭就抱起来。GU医生反复告诫我:孩子一哭就放下来,不哭才抱起来,正好反过来。这样一来,再小的孩子都能明白,不哭的时候才有得抱,这招极灵。放下爱哭的孩子开始训练,看着时钟,不要抱让她哭,准备等10分钟再抱。第一次可以设定5分钟,以后一次比一次时间拉长,我的妞妞第一次就没有熬到5分钟,大约3分半的时候就停了,我已经心疼得肝肠寸断自己都快哭了,一定要忍住了。让孩子知道哭声是叫不来妈妈的。训练“不哭的孩子”要排除4个哭的其他原因:尿了、病了、饿了,困了。上帝保佑,我家两个孩子都不会无理由哭,偶尔哭一下当作运动也是极少数,妞妞和妙妙100%是快乐的宝宝,躺在床上都咯咯笑出声的孩子。

 

绝招二

如何让刚出生的小宝宝一觉睡到天亮

美国医生再三批评我:你不是好妈妈,隔壁的孩子一睡到天亮,隔壁的妈妈是好妈妈,你不是!每次去看家庭医生我都挨批评,原因是我晚上要喂奶1-2次,抱怨养孩子很累很辛苦。医生告诉我一个观念:人类晚上不需要进食!我傻乎乎问,为什么呢?医生没办法,只好大声说:因为我们是人类!我印象极深,妞爸早就笑弯腰了。很显然,我担心BABY晚上会饿根本是多余的,10-12小时的连续睡眠,对孩子来说比吃奶重要100倍!我们被老大妞妞折磨很惨,晚上吃一顿奶的坏习惯一直延续到快2岁。养老二的时候按照医生说的,彻底让我和老公解脱出来,从刚出生到一个礼拜我家妙妙被训练距离5个小时才吃奶,2个礼拜之后,孩子就能睡天亮了。晚上不需要吃奶!!!(三个感叹号是请妈妈们切记的意思)

 

绝招三

如何让宝宝自己静静入睡,不要摇晃

医生说,一个快乐的BABY会睡在床上唱歌的(不是真唱,是婴儿咿咿呀呀)!婴儿的大部分时光都需要在床上度过,这里请爸爸妈妈们记住,床是不会动的!所以,抱起婴儿的时候不要摇晃,不要来回走动,更不要这样哄孩子睡觉,轻轻放在床上让他自己睡就好。再说一次,床是不会动的。爸爸妈妈你们没有权利剥夺孩子躺在床上享受快乐的权利。还有更重要的就是,兴奋的家长不要用力和孩子“疯闹”,孩子的大脑在婴儿时期还是胶状的果冻状态,很容易受伤。

 

绝招四

趴着睡养美女

非GU医生推荐,纯属个人选择:我们选择孩子趴着睡觉比仰着睡得安稳,头型是完美的圆形,脸型被彻底改造成小脸,无论男女都必要。还有就是才出生的孩子心脏朝下,几乎不会一惊一惊的状态,模仿子宫被包裹的状态。另一个最大的好处是改变亚洲人的大饼脸,5天之内的婴儿需要1个小时帮忙翻脸,5天之后,我家妞就会自己左右转向自如了。妞是标准的小脸,和生出来的时候大方脸好像变了一个孩子,呵呵,得意。老二妙妙的脸没有刻意这样做,那时候妞妞需要人照顾,没有精力1个小时翻头的精力了,很可惜。这个机会只有在出生到3个月之内有效,大了就没用了。很重要的是,这么做的时候,婴儿床上除了孩子和小被子,什么都清理干净,不要以为小婴儿不会动,不会危险。我生老二的时候,老大在一边闹,没有精力这么“做脸”了,老二就没有这么做了,哈哈,如今应验了一个典型的东方大脸姑娘。

 

绝招五

宝宝的抵抗力比你强十倍

爸爸妈妈穿2件,宝宝绝不能穿2件半,只能比你穿的少,不能比你穿的多。我家两个孩子都十分强壮,冷热其实很好控制,偶尔看到儿童医院发烧的孩子被花被子棉袄裹着一层一层的,可怜啊,孩子不会说话,都是家长害的。

 

绝招六

拒绝抗生素!是虐待不是爱

感冒发烧是孩子成长的过程,是增强抵抗力的过程。我家宝宝发烧了最常用的就是用冰敷,用有拉链的保鲜袋装冰块,用干净毛巾裹了冰敷在全身,30分钟一定退烧。烧厉害了配点美林或泰诺。如果是着凉了感冒没有发烧,就让孩子吊着鼻涕没有事,几天就好。不要相信任何药能治疗感冒。到目前为止,除了去年的手足口被医院骗进去那一次之外,我家2个孩子从来没有挂过盐水和注射过抗生素。在美国,是那种要死的病才注射抗生素的,在中国注射室的景观,吓坏了妞妞的爸爸,那个景象让人发毛他说。一排一排的吊针,打手打头打脚的小孩子们在妈妈爸爸爷爷奶奶的陪护下挂盐水。集中营莫过如此,很恐怖。花钱不说,更可怕的是体内的细菌大战存留的各种毒越来越多,周期性的需要挂盐水来压下去,常常听到妈妈们说,有一点症状马上挂水压下去,十分得意。我为她们的无知十分惋惜。我的孩子越来越健壮,从不生病,病了也几天自己好,基本不治疗。邻居的孩子半夜跑医院,累的人仰马翻乐此不疲,从这点看我是好妈妈。

 

绝招七

天天洗澡,用清水,少用沐浴露

我的2个宝宝健康的另外一个原因是天天洗澡,天天洗澡是必要的。记得我生完孩子出来,准备听我妈妈的教诲躺着不动,打算熬到第二天才洗澡,护士惊讶地拉我起来洗澡“不管你什么传统,把汗水和细菌都洗掉才会健康”。我被误会成个脏妈妈被拖去洗澡,当然要说明的是我生两个都是顺产。产妇如此何况小孩子?孩子每天运动量大,臭汗奶腥味便便尿尿什么味道都有,一定要洗澡,不能隔天才洗。这也是健康不生病的重要原因,他们不会着凉的,抵抗力比成人强十倍。GU医生交代:宝宝洗澡尽量用清水,再名牌的婴儿产品都不如清水好,不要用任何沐浴露、洗发水,清水最最好!医生说尽量不用,一定要用的话一个星期用一次沐浴露就好,我家是三天用一次(我觉得一周太长了,心理作用)。

 

绝招八

没有奶不够吃的妈妈,只有不想喂奶的妈妈

能吃到2岁半是天下最幸福的宝宝。GU医生说,没有奶不够吃的妈妈,只有不想喂奶的妈妈,孩子的食量多大,妈妈的奶就有多少,生双胞胎的妈妈的奶同样够两个孩子吃。这一点我很失败,尽管GU医生用笔画了一个圆圈,她告诉我,你的孩子吃多少,你就能生产多少,你觉得奶不够,加奶粉进去,奶就会真的不够,最后就没了,事实证明我后来真的越来越少直到没了。孩子不会说话,她吃饱没有很难知道,妈妈觉得奶少了就放弃母奶,就补奶粉,其实是告诉自己的身体,我只能生产这么多了。要相信自己能当头称职的奶牛。如果再生一个,一定要证明一下。生完小孩第三天就去医院参加“喂奶班”,几个妈妈带婴儿围成一圈,有黑妈妈白妈妈和亚洲妈妈,喂奶课用的是那种很舒服的沙发,脚下有垫脚的专用凳子。医生们将孩子脱光,包括尿布,然后称BABY的重量精确到小数点后面2位数。然后让我们抱孩子喂奶,不准穿衣服只穿尿布。医生一对一教妈妈们如何让孩子一口就咬准奶头,如何保护奶头,一次一次训练,期间有别的妈妈来用免费提供的吸奶机下奶,用塑料袋装回家。我刚开始的害羞和尴尬慢慢没有了,呵呵,我在家完全不知道妞妞吃了多少,这下好了,一堂课下来,马上称孩子份量,我妞妞吃了不少,好像是那天的第二名,前后数据证明,我有奶。

 

绝招九

宝宝吃奶睡着怎么办?

BABY被妈妈抱着舒服又安全,没吃饱就睡着了,醒了又吃两口,折磨妈妈,宝宝也吃不饱睡不好,害人害己。训练班里学到最有用的一招,如何弄醒孩子让他们专心吃奶,就是脱衣服!脱得就剩尿布,医生告诉我,放心吧,你抱着她有妈妈的体温,这体温能保证婴儿不会着凉,温度刚刚好,BABY有一点凉意,他们会用心进餐(她说的真是进餐,呵呵)。放心吧,这些看起来弱不禁风的小东西,从妈妈母体带出来的抵抗力比成人强10倍,喂奶的产妇也不容易病,这就是繁殖的力量。(当然室内的温度是有一定温暖的,国内无空调寒冷地区的人不要对照模仿误会)

 

绝招十

母奶是最好的“抗生素”

妞妞大概10来天的时候,一只眼睛发炎化脓了,我和妞爸吓得抱到医院,还是急诊,儿科的男医生问,你喂奶还是奶粉,我说母奶。他说挤点出来放进孩子眼睛,BABY就会好。What? 我排队等急诊老半天就这么打发我回家了。于是如法炮制,母奶当药,几天后妞妞果然见好,是否母奶的原因还是不清不楚,美国医生忽悠得或许有点道理吧。总之母奶是好东西。

 

绝招十一

你会换尿布吗?

废话,养孩子的谁不会换尿布呢?不一定哦。你是否有被孩子喷到尿或臭便便的时候呢?一天洗5次床单是我的最高记录。换尿布的时候,每次来的新阿姨都要重新教一遍,窍门就是把干净尿布放在臭尿布下面,再打开尿布,擦干净抽出来,这样即使孩子正好那时候又便又尿,你的床单保住了。习惯这么做以后,永远没有意外发生。换尿布之前将湿纸巾和垃圾篓和尿布还有护臀膏都准备好,不要让自己有转身的机会,别以为那么小的孩子不会掉下来,会掉的,很危险。

 

绝招十二

你会拍嗝吗?

姿势一,趴在肩膀上轻拍孩子后背,这种是传统姿势,很多时候不太容易拍出来嗝。

姿势二:让孩子侧坐在腿上,左手托着孩子的脖子,撑起下巴,右手拍后背,这样效率极高,通常十几下就拍出嗝了。临睡的最后一顿奶,一定要喂饱足了,拍完嗝继续喂,我家妙妙2礼拜就睡整晚就是用这招,拍完嗝还可以再喂2-3次,直到她真的不吃了,小嘴巴往外推奶瓶的状态,妙妙就能睡到天亮。

 

绝招十三

早点吃五谷杂粮

4个月吃米粉再大点跟大人一起吃东西,孩子长大不太会偏食,早点吃和成人一样的食物对孩子有好处。6颗牙的时候,GU医生说,她已经可以用这几颗牙齿吃很多东西了,什么都可以喂,没有不能吃的。

 

绝招十四

别破坏宝宝的专注力

再小的宝宝玩玩具或看电视或看图画书的时候,请家里的阿姨或者任何人都别打断她们。即使是吃饭的时间到了,晚一点也没有关系。培养孩子的专注力就等于培养她们长大了能注意力集中做任何事情。我家妞妞专注力很好,她喜欢的事,比如拼图,一个下午几个钟头不抬头,没有人叫她,除了尿尿之外。最怕那种大呼小叫逗孩子的长辈们,自以为聪明,边看电视边问问题。闭嘴,请安静。给孩子一个专注的环境吧。

 

绝招十五

慢慢走路,小声说话

身体力行很重要,大人怎样的孩子都会学。难得遇到上海一位陆老师,教孩子慢慢走路,轻声说话,人家听得到就好了,别那么大声。回了家乡,小区的幼儿园老师教孩子们扯起嗓门唱歌,我在一旁看,心想完了,培养了半天的小淑女被汉派文化同化了,哈哈,如今的妞妞很“武汉”,热干面一样的个性十足,整个儿一辣妹。大环境很厉害,几乎没有不被同化的可能。

 

绝招十六

只要没有生命危险,鼓励宝宝试试看,摸摸看

中国父母礼节有余,胆子太小。“别动,危险,站起来地上脏,别摸,会刺到。。。。不许这样,不许那样”美国父母最常说的却是“Try it! ”试试看,摸摸看。鼓励宝宝,只要没有生命危险,不要阻止孩子用他们的小手尝试和认识世界。大不了衣服弄脏,地上滚来滚去的宝宝时光很短,饭粒菜汤翻了一地,大不了扫一下他们会早学会吃饭甚至用筷子,玩水大不了感冒,玩沙子大不了进鞋子难受难清洁。总之有很多阻碍孩子快乐的条条框框,促使我们的小天使们越来越快地变成成人,变成听话和懂事的孩子。快乐第一重要,衣服脏了不重要,只要没有生命危险,不要阻止我的孩子。

 

绝招十七

也是最重要的一招,一天只能批评两次!

父母也不可以随便批评宝宝,一天只能批评两次,两次用完了就等明天的配额吧。美国老师这么慎重交代的。于是,宝宝外婆说:“你的孩子一天10次都不够,2次的话我10分钟就用完了,这太难了。我大笑。在婴儿的时期,批评有用吗?拉个便便也被阿姨批评“宝宝又干坏事了”我会反问阿姨,你不拉屎吗?反过来,说妈妈喜欢宝宝一天至少说两次,建立安全感很重要,这对初进幼儿园的宝宝很有用,即使妈妈暂时见不到,宝宝也不会紧张,她知道妈妈很爱她,我自己从小带的妞妞,她进幼儿园的时候一天都没哭过,异常顺利。老二妙妙大部分是阿姨带的,倒是哭了好几天才缓过来。

 

绝招十八

宝宝2岁之前尽量多抱抱!

在宝宝愿意让你抱的时候,尽量多抱抱吧,很多家长生怕抱多了宝宝不独立太依赖父母,其实这和2岁之前的多抱抱没有关系。相反,对婴儿的乐观性格培养很有好处,绝不会有皮肤饥渴症。婴儿时期常常被抱着的宝宝,他们舒服了、安全了、满足了,宝宝心情自然好,不会老哭,会乐个不停,我的两个孩子都很开朗不认生非常爱笑,笑的肆无忌惮好像全世界不存在笑得摇头晃脑的,很有感染力那种。建议妈妈们同一个浴缸抱着抚摸着宝宝洗澡和玩水,时常躲在被子里不穿衣服用皮肤贴着宝宝的皮肤和她们玩,让宝宝任意抚摸你拍打你,他们会异常开心和满足,比上昂贵的亲子班有效。妞妞现在4岁半了不太主动要抱了,我有时候会很想抱抱她,她居然说妈妈你坐着抱我,这样你不会累,听起来好像完全是满足我想抱的愿望十分体贴。有时候妞妞比较像妈妈,哈哈。生了2个孩子还是觉得她们长得飞快,还是没过到瘾,妞爸说,好像我家有个小妞妞不见了。孩子进入了学龄前敏感时期,新的探索已经来了。

posted @ 2011-03-02 16:36 小马歌 阅读(442) | 评论 (0)编辑 收藏
 

SESSION与COOKIE问题,可以说是一个老生常谈的问题,对于什么是SESSION,什么是COOKIE,我这里就不多说了,

GOOGLE一下,一大把(或者:去看:http://hi.baidu.com/fc_lamp/blog/item/da10f32cf47b843e349bf7c3.html)

今天,我要说的是如何在同一页面重复的操作同一个session.name官网说明:session.name指定会话名以用做 cookie 的名字。只能由字母数字组成,默认为PHPSESSID。即:人为修改PHP自动生成的SESSION ID。

首先,我们知道 一旦 PHP session_start()后就开启了一个会话。这当种了两件事:一是把相关SESSION信息存放于服务器端(产生一个类似于sess_XXX这样的文件),二是把会话名session name(默认为:PHPSESSID),以及SESSION ID发给浏览器以cookie的方式存起来(即:cookie_name : SESSION ID)。这样,当再次访问页面时,浏览器再把COOKIE里的SESSION ID发给服务器(当然,COOKIE里的值是没有过期的),PHP比对服务器上的SESSION文件,如果没有得话,会产生一个新的SESSION文件,如果有得话,则直接使用。这里有两点值的说明一下:

1 :对于登录合不合法之类的是你自己写PHP脚本来判断的,即比对$_SESSION里的值(因为新产生的SESSION文件里是没有任何值的)。

2 :把COOKIE里的SESSION ID传给服务器(PHP)后,在使用SESSION ID之前有一个选择。前面,我们说过SESSION ID在COOKIE里是以键值配对方式存放的,键即为会话名(session name),一般如果没有事先声明(在session_start()之前)PHP是使用默认的会话名,即PHPSESSID,所以不同页面可以有不同的会话名。如下图所示:


所以,对于特殊的SESSION ID,要使用时必须事先声明(设置)会话名,才能正常的引用。

那么如何设置会话名(session name)呢?设置session name的方试一般有两种:

1:在php.ini配置文件里修改:在php.ini文件里找到:session.name = PHPSESSID  即可完成设置

2:使用session_name()函数设置,eg:session_name('test9');

这里要注意一下:关于session name的问题。恩,在这里我直接引用官网上的一段话(简单的E文,想必大家都看的懂):

The session name references the session id in cookies and URLs. It should contain only alphanumeric characters; it should be short 

and descriptive (i.e. for users with enabled cookie warnings). Ifnameis specified, the name of the current session is changed to its value.

The session name can't consist of digits only, at least one letter must be present. Otherwise a new session id is generated every time.

以上这段非常重要,请你一定要仔细看。或者去官网:http://cn.php.net/manual/zh/function.session-name.php

好了,有了以上的说明后我们来看一段同一页面重复的操作同一个session.name代码:

    if(isset($_COOKIE['test9'])){//如果已有值,则销毁
        session_name('test9');
        session_start();
        setcookie('test9','',time()-3600);//相应COOKIE也过期(这段代码实际上可以不要)
        session_unset();
        session_destroy();
    }
    //重新播种SESSION
    session_name('test9');
    session_id(md5(uniqid()));
    session_start();
    $_SESSION['test'] = 'test';

    var_dump($_COOKIE);


 另外:官网上也有讨论设置SESSION生命周期的问题,可以看看。地址:http://cn.php.net/manual/zh/function.session-set-cookie-params.php

posted @ 2011-02-26 04:15 小马歌 阅读(1031) | 评论 (0)编辑 收藏
 

前言

在我的上一篇文章《使用 Nginx 提升网站访问速度》中介绍了 Nginx 这个 HTTP 服务器以及如何通过它来加速网站的访问速度。在实际的网站运营中,我们经常需要了解到网站的访问情况,例如每天有多少 IP 在访问、PV 数是多少、哪个 URL 访问量最大、用户使用最多的浏览器是哪个、都是通过什么方式知道这个网站的以及有多少用户访问出错等等,通过掌握这些信息来提高用户的体验,从而改善网站的质量。一般我们可以通过一些免费的访问统计网站例如 Google Analytics 来或者这些信息。但不足之处是这类网站只能对页面进行分析,不包括静态文件;另外可能有很多的站长不愿意使用这类工具来暴露自己的数据,种种的这些因素使站长希望自己来分析访问日志。而 awstats 就可以满足所有的这些需求。

Awstats 是在 SourceForge 上发展很快的一个基于 Perl 的 WEB 日志分析工具,一个充分的日志分析让 Awstats 显示您下列资料:

  • 访问次数、独特访客人数,
  • 访问时间和上次访问,
  • 使用者认证、最近认证的访问,
  • 每周的高峰时间(页数,点击率,每小时和一周的千字节),
  • 域名/国家的主机访客(页数,点击率,字节,269域名/国家检测, geoip 检测),
  • 主机名单,最近访问和未解析的 IP 地址名单
  • 大多数看过的进出页面,
  • 档案类型,
  • 网站压缩统计表(mod_gzip 或者 mod_deflate),
  • 使用的操作系统 (每个操作系统的页数,点击率 ,字节, 35 OS detected),
  • 使用的浏览器,
  • 机器人访问(检测 319 个机器人),
  • 蠕虫攻击 (5 个蠕虫家族),
  • 搜索引擎,利用关键词检索找到你的地址,
  • HTTP 协议错误(最近查阅没有找到的页面),
  • 其他基于 URL 的个性报导,链接参数, 涉及综合行销领域目的.
  • 贵网站被加入"最喜爱的书签".次数.
  • 屏幕大小(需要在索引页补充一些 HTML 标签).
  • 浏览器的支持比例: Java, Flash, RealG2 reader, Quicktime reader, WMA reader, PDF reader.
  • 负载平衡服务器比率集群报告.

Awstats 的运行是需要 PERL 环境的支持,从 awstats 的文档来看,它对 Apache HTTP Server 的支持是非常完美的,而当我们把 Web 服务器换成 Nginx 后,要运行 awstats 变得很麻烦。首先 Nginx 本身对 Perl 的支持是比较弱的,甚至官方也不建议使用;另外在日志格式上有需要修改后才能运行。

本文主要介绍通过让 awstats 对日志统计的结果生成静态页面,然后通过 Nginx 输出以达到统计 Nginx 访问日志的效果,其中还包括如何让 Nginx 自动切割日志文件。


配置 Nginx 自动切割日志

跟 Apache HTTP Server(以下称 Apache)不同的是,Apache 可以将日志输出通过管道的方式进行重新定向,依此来进行自动的日志切割。Nginx 在现今版本上还没能跟 Apache 一样,通过%YY等参数按日期分批创建日志,但是通过给 nginx 进程发送一个特定的信号,可以使 nginx 重新生成日志文件。我们可以定期执行一个 Shell 脚本来切换日志,重新命名或转移,具体的脚本如下:

# mv  /opt/nginx/logs/access.log /opt/nginx/logs/access_`date +%Y%m%d`.log
            # killall –s USR1 nginx	#使用USR1参数通知Nginx进程切换日志文件
            

将以上脚本内容保存为文件名为 logcron.sh 存到自定的目录中,例如 /opt/nginx/sbin/logcron.sh

使用 Crontab 让该脚本程序在每天晚上 11 点 59 分自动执行,即可做到按天创建日志。


安装和配置 Awstats

安装之前,必须确认你的服务器上 Perl 的环境已经就绪。

查看当前环境 Perl 版本的命令是 perl –version

我们还需要对 Nginx 的日志格式做个小修改,不然 awstats 将无法进行统计。

例子如下(加粗部分):

# vi /opt/nginx/conf/nginx.conf
            server {
            listen       80;
            server_name  localhost;
            location ~ ^/web/ {
            root   /data/web;
            index  index.html;
            error_log off;
            charset gb2312;
            }
            log_format  new_log	#格式代称 (注意,如果有多个虚拟主机,代称不能一样)
            '$remote_addr - $remote_user [$time_local] $request '
            '"$status" $body_bytes_sent "$http_referer" '
            '"$http_user_agent" "$http_x_forwarded_for"';
                    access_log  logs/access.log new_log;	#日志生成路径
            }
            

下载最新版本的 awstats 包,下载地址请见文章最后的参考资料。把下载后的 tar 包解压到任意目录中,例: /usr/local/awstats 。然后执行 tools 目录中的 awstats_configure.pl 配置向导,创建一个新的统计。

-----> Check for web server install
            Enter full config file path of your Web server.
            Example: /etc/httpd/httpd.conf
            Example: /usr/local/apache2/conf/httpd.conf
            Example: c:\Program files\apache group\apache\conf\httpd.conf
            Config file path ('none' to skip web server setup):
            #> none  #因为我们这里用的是 Nginx,所以写 none,跳过。
            

回车

Your web server config file(s) could not be found.
            You will need to setup your web server manually to declare AWStats
            script as a CGI, if you want to build reports dynamically.
            See AWStats setup documentation (file docs/index.html)
            -----> Update model config file '/usr/local/awstats/wwwroot/cgi-bin/awstats.model.conf'
            File awstats.model.conf updated.
            -----> Need to create a new config file ?
            Do you want me to build a new AWStats config/profile
            file (required if first install) [y/N] ?
            #> y	#y 创建一个新的统计配置
            

回车

-----> Define config file name to create
            What is the name of your web site or profile analysis ?
            Example: www.mysite.com
            Example: demo
            Your web site, virtual server or profile name:
            #> www.moabc.net		#统计网站的域名 例:
            www.moabc.net
            

回车

-----> Define config file path
            In which directory do you plan to store your config file(s) ?
            Default: /etc/awstats
            Directory path to store config file(s) (Enter for default):
            #>
            

使用默认直接回车,接下来便会出现以下的提示

----> Add update process inside a scheduler
            Sorry, configure.pl does not support automatic add to cron yet.
            You can do it manually by adding the following command to your cron:
            /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.moabc.net
            #回头把该命令填入crontab 按指定时间执行
            Or if you have several config files and prefer having only one command:
            /usr/local/awstats/tools/awstats_updateall.pl now
            Press ENTER to continue...		回车继续
            A SIMPLE config file has been created: /etc/awstats/awstats.www.moabc.net.conf
            #新配置文件所在的路径
            You should have a look inside to check and change manually main parameters.
            You can then manually update your statistics for 'www.moabc.net' with command:
            > perl awstats.pl -update -config=www.moabc.net
            You can also build static report pages for 'www.moabc.net' with command:
            > perl awstats.pl -output=pagetype -config=www.moabc.net
            Press ENTER to finish...
            

回车完成向导,接下来修改 www.moabc.net 的统计配置

#vi /etc/awstats/awstats.www.moabc.net.conf

找到统计的日志文件的路径

LogFile="/var/log/httpd/mylog.log"

改为

LogFile="/opt/nginx/logs/access_%YYYY-0%MM-0%DD-0.log

对应上边 Nginx 日志切割程序的所生成的目录存放结构,要注意 Awstats 的年月日格式的跟 Nginx 的写法有所不同。我们现在执行统计的顺序是:

Nginx 产生日志 –> 日志切割 –> Nginx 继续产生日志 –> 另存切割日志 –> 交由Awstats统计 –> 生成结果

在本文中 Awstats 所统计的日志,是已切下来的那部分。也能调转顺序,先统计完了再切。不过这比较容易造成统计的遗漏。配置修改完成后,保存退出。然后我们可以开始试一下手动执行。

  1. 先执行日志切割脚本 logcron.sh 把 Nginx 的日志切下来。
  2. 然后执行 Awstats 日志更新程序开始统计分析。
# /opt/nginx/sbin/logcron.sh
            # /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.moabc.net
            Create/Update database for config "/etc/awstats/awstats.www.moabc.net.conf"
            by AWStats version 6.7 (build 1.892)
            From data in log file "/opt/nginx/logs/access_20080804.log"...
            Phase 1 : First bypass old records, searching new record...
            Direct access after last parsed record (after line 450421)
            Jumped lines in file: 450421
            Found 450421 already parsed records.
            Parsed lines in file: 120
            Found 0 dropped records,
            Found 0 corrupted records,
            Found 0 old records,
            Found 120 new qualified records.
            

看到以上显示,证明日志切割和 Awstats 都已经运行无误了。统计分析完成后,结果还在 Awstats 的数据库中。在 Apache 上,可以直接打开 Perl 程序的网页查看统计。但本文开始时已经提到,Nginx 对 Perl 支持并不好,所以我们要换个方法,利用 awstats 的工具将统计的结果生成静态文件,具体的步骤如下:

  • 首先在 webroot 目录下创建一个文件夹。例:/data/webroot/awstats
  • 然后让 Awstats 把静态页面生成到该目录中
# mkdir  /data/webroot/awstats
            # /usr/local/awstats/tools/awstats_buildstaticpages.pl -update  \
            -config=www.moabc.net -lang=cn -dir=/data/admin_web/awstats  \
            -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl
            

上述命令的具体意思如下:

  • /usr/local/awstats/tools/awstats_buildstaticpages.pl Awstats 静态页面生成工具
  • -update -config=www.moabc.net 更新配置项
  • -lang=cn 语言为中文
  • -dir=/data/admin_web/awstats 统计结果输出目录
  • -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl Awstats 日志更新程序路径。

接下来,只需在nginx.conf 中,把该目录配置上去即可。例子如下:(加粗部分):

server {
            listen       80;
            server_name  localhost;
            location ~ ^/web/ {
            root   /data/web;
            index  index.html;
            error_log off;
            charset gb2312;
            }
            location ~ ^/awstats/ {	    # html 静态页面目录
            root   /data/webroot/awstats;
            index  index.html;
            access_log off;
            error_log off;
            charset gb2312; #最好把默认编码改成 gb2312避免浏览器因自动编码出现乱码的情况
            }
            location ~ ^/icon/ {             # 图标目录
            root   /usr/local/awstats/wwwroot;
            index  index.html;
            access_log off;
            error_log off;
            charset gb2312;
            }
            }
            

用浏览器查看到统计的详细结果 http://youhostname/awstats/awstats.www.moabc.net.html

至此,使用 awstats 已能完全支持 Nginx 的日志统计。


配置 Awstats 自动运行

为了让整个日志的统计过程自动完成,我们需要设置 crontab 计划任务,让 Nginx 日志切割以及 Awstats 自动运行,定时生成结果页面。

#vi /etc/crontab
            11 59 * * * /opt/nginx/sbin/logcron.sh			#半夜11:59  进行日志切割
            00 1 * * * /usr/local/awstats/tools/awstats_buildstaticpages.pl  \
            -update -config=www.moabc.net -lang=cn -dir=/data/admin_web/awstats \
            -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl
            #凌晨00:01  Awstats进行日志分析
            :wq保存退出
            #crontab /etc/crontab	指定cron所执行的配置档路径
            


保护日志统计结果页面

一般站长都不愿随便让人知道自己站的真实流量,所以要把 Awstats 统计结果页面进行密码保护。Nginx 使用的是跟 Apache 一样的密码加密格式,这里需要用到 apache 自带的工具 htpasswd。

如果你在本机上默认装有 Apache,这你就只需在它的程序目录下运行

例:

#/usr/local/apache2/bin/htpasswd -c admin.pass admin #用户名为admin
            New password:			输入密码
            Re-type new password:		重复输入
            Adding password for user admin	创建成功
            然后把 admin.pass 这个密码包找个的地方藏起来.
            修改 nginx.conf 在 location 中加入(加粗部分):
            server {
            listen       80;
            server_name  localhost;
            location ~ ^/web/ {
            root   /data/web;
            index  index.html;
            error_log off;
            charset gb2312;
            }
            location ~ ^/awstats/ {	    # html 静态页面目录
            root   /data/admin_web;
            index  index.html;
            access_log off;
            error_log off;
            charset gb2312;
            auth_basic     "admin"; #用户名
                 /opt/ngx/conf/admin.pass; #密码包路径
            }
            location ~ ^/icon/ {             # 图标目录
            root   /usr/local/awstats/wwwroot;
            index  index.html;
            access_log off;
            error_log off;
            charset gb2312;
            }
            }
            修改 Nginx 配置完毕后,执行命令 killall –s HUP nginx 让 Nginx 重新加载配置即可。
            


总结

尽管跟 Apache HTTP Server 相比较而言,Nginx 的功能是比较弱的,但是我们依然可以利用一些技巧来规避这些弱点,Nginx 的设计者肯定也是充分考虑到这个问题。现在也越来越多的第三方开发的模块在逐渐的扩展 Nginx 的功能。但是从应用本身的角度而言,Nginx 更倾向于卓越的性能,而非大而全的功能,因而在一些附加方面的功能,我们也不能对之要求过高。


参考资源


作者简介

刘柄成一直使用 J2EE/J2ME 从事移动互联网方面的开发。DLOG4J 的作者,您可以通过 Java 自由人网站来跟他联系,网址是:http://www.javayou.com ,另外他的邮件地址是 javayou@gmail.com。

范绰耘,服务器软硬件技术架构、开源软件的热衷者,现任职广州市摩网信息技术有限公司系统管理员,您可以通过开源中国社区网站 http://www.oschina.net 来联系我。

posted @ 2011-02-25 18:28 小马歌 阅读(519) | 评论 (0)编辑 收藏
 

nginx下实现了WrodPress的永久链接rewrite。简单的方法,修改nginx.conf文件:


location / {
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}

输入killall -HUP nginx     重启nginx就可以了。

posted @ 2011-02-18 11:57 小马歌 阅读(159) | 评论 (0)编辑 收藏
 

PHP使用ImageMagick代替GD库

ImageMagick模块我们使用DSO动态编译加载的方式,这样避免重新编译安装php
[root@cgstest ImageMagick-6.6.0-0]# mkdir /usr/local/ImageMagick
wget http://ftp.nluug.nl/ImageMagick/ImageMagick-6.6.0-0.tar.gz
//注意,我之前使用最新版本ImageMagick-6.6.6-10 ,结果编译总是出错,坛子上看到有人与我同样问题,原因是gcc版本太低,生产服务器上不能轻易变动,有时候新版本不一定是适合的,所以我降低版本后编译成功。
安装ImageMagick-6.6.0-0 
[root@cgstest ImageMagick-6.6.0-0]# ./configure LDFLAGS="-L/usr/lib" CPPFLAGS="-I/usr/include" --prefix=/usr/local/ImageMagick/ --enable-shared --enable-lzw
make && make install

wget http://www.magickwand.org/download/php/MagickWandForPHP-1.0.8.tar.gz
安装MagickWandForPHP-1.0.8
[root@cgstest MagickWandForPHP-1.0.8]#/usr/local/php/bin/phpize
[root@cgstest MagickWandForPHP-1.0.8]# ./configure --with-magickwand=/usr/local/ImageMagick --with-php-config=/usr/local/php/bin/php-config
make && make install
 

wget http://pecl.php.net/get/imagick-3.0.1.tgz
安装imagick-3.0.1
//This extension requires ImageMagick version 6.2.4+ and PHP 5.1.3+. 注意版本的需求
[root@cgstest imagick-3.0.1]# /usr/local/php/bin/phpize
[root@cgstest imagick-3.0.1]# ./configure --with-imagick=/usr/local/ImageMagick/ --with-php-config=/usr/local/php/bin/php-config
make && make install
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/

配置php.ini ,增加以下内容
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/"
extension = imagick.so
extension = magickwand.so

重启apache,测试查看phpinfo.php是不是已经加载上了呢。

ImageMagick处理过的效果显示http://www.imagemagick.org/image/examples.jpg 

posted @ 2011-02-14 13:17 小马歌 阅读(823) | 评论 (0)编辑 收藏
仅列出标题
共95页: First 上一页 55 56 57 58 59 60 61 62 63 下一页 Last