PHP编写命令行脚本和后台运行程序的注意事项

在一些场合(如开发,测试), 可能需要使用PHP编写一些命令行的处理脚本,或者是长时间
后台运行的任务, 需要注意以下准则:

准则1. 尽量避免使用PHP编写后台运行程序, 尤其是类似while(true){….} 这种循环的处理脚本.

比如,有时候我们需要定期检查数据库,然后有数据进行处理,没有数据等待.
我强烈建议不要使用PHP编写这样的类似service的脚本. php的gc并不稳定, 当运行到一定时候,
会异常退出. 另外, PHP也不擅长做命令行脚本. 看看Phing, 号称PHP port的Ant, 但是性能
糟糕的一塌糊涂, 远不如使用几个unix工具+shell来的快捷. (更别提windows,那基本是不可用).

使用Perl,Python来完成相应的任务吧, 那会让你很愉快, 或者,Ruby也不错.

准则2 编译特殊版本的php
如果一定要沉迷于PHP解决, 那么首先, 重新编译PHP,去掉所有不实用的模块. 增加PHP的稳定性.

准则3 不要直接使用fork 或者 nohup
不要在PHP中直接使用fork来进入后台运行, 也不要直接使用nohup来运行直接运行php 循环脚本.

准则4 使用 shell guard 来完成PHP的后台循环运行
php的脚本只需要处理一次数据后马上退出,不要使用任何while(true) 这样的脚本来挂起等待.
相反的, 可以使用以下的shell gurad 来完成上述工作:
night9.cn# cat guard.sh
DIR=`pwd`
while true; do
echo “start php script ..”
php $DIR/thumbnail_worker.php
echo “respawn the worker…”

上面这种脚本我称之为shell guard.这样的好处是你的后台脚本永远可以可靠的运行,一旦因为php自身出现问题(如内存溢出),那么马上就可以立即重新执行.
对于检查,执行,休眠模式,可以使用和以下类似的:
while true; do
php ./realtime_data_worker.php
echo “paused 10s”
sleep 10
done

上述shell guard的另一个好处就是一旦你更新了Php文件, 下次运行时就是新的了. 而无须kill掉在重启.
特别适合频繁变更的情况,减少你的工作量.

准则5 可以在你PHP脚本中监控执行的情况, 当执行了一定次数或者内存消耗到一定,则exit, 释放占用的内存,
防止内存泄露.
这条一定要和shell guard来配合.

如果你用windows, 抱歉, 这不在我考虑的范围之内.

准则6 如果以上仍然无法解决一些问题, 那么请参考第一条,使用Perl/Python重写. 立刻会药到病除 ;-)

PS: 某些copy & paste的人儿, 转载我的笔记麻烦给个出处. 我现在知道某些人为何使用我不称我,而使用类似night9.cn认为这样的第三人称说法, 都是某些热衷把转载当自己原创使用的人害得,但每次我看到这样的第三人称总会稀稀拉拉掉一地鸡皮疙瘩.

我写的所有笔记和心得都是自己实践, 主要是为自己备忘使用,都是原创,无须声明.
有时候很纳闷, 转载有必要么?
google可以告诉你一切. 减少点碳排放吧.

从doggy1.3的跳票谈起

今天抽空看了下blog的后台,发现有个朋友在我去年一篇帖子后留言说跳票了,已经是2009-7-22,
不禁汗颜。因为原来文中我是计划去年7月底能够发布Doggy 1.3的。

跳票的原因很多,杂事,乱事很多。更主要原因是没有最直接的动力。毕竟之前1.2内部用的都还凑合,
而之后相关产品开发陷入迟钝。另外,惰性使然。

1.3的代码其实早就完成了,但是却没有机会使用,最近1个月,由于几个产品出现了新的性能问题,
我也决心重新打开1.3的代码库。这1年来就很少接触PHP的开发工作,重新审视,也有了很多新的想法。
这样,原始的1.3的代码就仅停留在试验阶段,我有选择的将这部分代码合并到1.2中,并形成了新的1.3分支。
尽量保持一定的兼容性,做了一些妥协,因为还需要将很多产品升级,过于激进就缺乏实际了。

我很理解很多项目为什么要opensource,最主要的一个原因是作者没有精力而希望借助社区的力量让项目
的生命力得以延续。

但,现阶段,我不能开源。开源也需要勇气、精力和责任。首先,我没有足够的时间和精力解决使用者的种种问题,
从安装到调适。其次,我无法保证这个框架能够有广泛的适用性,更无法保证能够给用它的人带来什么好处,
现如今,较为流行的PHP框架不是少而是太多,较为熟悉的如ThinkPHP,FleaPHP, Kohana, Yii.这些都是很好的选择。
选择和学习一个framework,对于一个PHP程序员来说真的是一个折磨,我也不想再添乱。
我也建议如何选择framework:

如果你用1天时间还没有感受它的好处,扔掉它。
如果你用1周的时间还无法用它重构一个原有的中等规模的项目(比如blog,bbs,cms),扔掉它。

最多花1周的时间,太多了就亏本了。

PHP现如今有点要重复当年Java的道路,开发的方式似乎越来越“重”, 看看所谓官方的Zend Framework吧,
设计的成分到处都是…..

我用Doggy最大的一个理由是我懒,懒得花时间去学习一个新的framework。
我不怕它缺少某个功能,而是担心功能太多,杂而不精(从这个意义上,我
个人还是比较喜欢CI,比较简单,可以仅仅当作一个lib来使用)。 因此,这次首先是删除代码,我把这1年来,大家都没有使用过的模块全部删除,比如Threads(实现Java的threads功能),现在想,有点华而不实。
这样大概删除了3-5个模块,也增加了几个真正缺乏的模块,最主要的是模版引擎,实现类Django的模版,取代Smarty. 其他实用的是添加支持Flare,Redis,MongoDb的模块。这些是解决一些高并发场合的利器。

我希望,如果有天,doggy的运行性能能够远超同类的项目,我可以把它开源,因为值得折腾。
在此之前,还是集中精力,闭门造车吧。

Chrome很喜欢

虽然只有windows版本,还是第一时间下载了chrome,果然是清爽简洁的界面,比firefox3更让我眼前一亮。
速度和预想的一样,应该是目前最快的浏览器了(不包括webkit beta,因为二者是一致的)。
chrome由于是基于最新版本webkit,所以要比safari3.1(mac版本)更快。
google的很多特性都集成在浏览器了,这是意料之中的了。
都是beta版本,但是chrome明显要比safari 3 for windows更稳定,更快,更省资源。
尽管我现在很少用windows,但是我还是把chrome设置为我t41上的首选浏览器了。

chrome出来了,我猜,gears应该很快能支持safari了。(Chrome捆绑了对gears的支持)

我也很想知道,如果chrome for mac 出来后,我是否会放弃safari,毕竟,从内核来说二者是没有区别的。
firefox for mac,camino都没有让我放弃safari的充分理由,chrome呢

varnish or squid ?

上varnish已经有一段时间了. 虽然其性能确实不错, 不过, 稳定性还是欠佳.
我现在用的是trunk版本, 其正式版经常在高负载的时候crash. 虽然这个问题
在其mailinglist中也不少人提出,但是似乎没有特别明确的解决方案, 根据某些人的
只言片语,似乎在trunk中能够解决. 我更新到trunk,虽然crash的机会少了,但是仍时有
发生,最后,我的解决方案是用monit来监控和重启(虽然varnish自身号称有autorestart
的功能,但是在我的情况里没有用,重试几次就彻底歇了).

速度是快了,不过如果缓存满了,那么就性能是急剧下降的. 对于后端的访问次数增加很多,
这种情况下,各种不道德的爬虫就是灾难了.
因此,有必要监控你的cache是否已经满了, 如果满了,最后就重启一下.
不要指望它的过期和自动交换了, 会死的很难看的.

实际上,以前用squid的时候也遇到这个问题. varnish由于是纯内存的web加速的cache,
因此如果超出了,就要用swap. 这时候,和squid一样,都是光屁股,没啥起色.

其实,对我来说,squid似乎更为合适,因为我不希望使用一个纯内存的cache服务器,因为,
我实际上要的是一个mirror,呵呵.

varnish/squid的purge方法都不太适合我的情况. varnish支持正则批量清楚一批url,不过
必须使用客户端,而且,我至今也不清楚如果不同host相同的url下如何区分?

其实,作mirror,从应用程序角度看,也很好实施:异步复制更新的文件到各个mirro节点去,
还是用perl,可以轻松搞定. 这样,就是直接nginx了.

一个更好的想法是,干脆使用perbal得了. 为什么? 因为我需要根据一些逻辑,能够有选择的清除
cache. perlbal可以写plugin,当主服务器发生变化,只需要删除本地缓存的文件即可.
其他的时候,文件从不过期. perlbal前面可以挂上nginx.

最后,也可以考虑使用nginx的proxy_store,然后用perl来删除store文件?
然后,又想到,其实squidclient也可以实现….
晕了
…..

说到nginx,
nginx稳定版已经升到0.6.31了.
现在国内热捧lighty的人多,用nginx的少.
我二者都用过,还是觉得nginx让人放心.
至于性能,说实在,没发现和lighty有多大的差距.

想轻松,简单,可靠,还是用nginx

;-)

Working hard

对于豆瓣的推荐和相关度算法非常满意, 晚上到家开始搜集CF相关的资料,准备自己实现一个简单的推荐系统.
我自己感觉豆瓣应该不仅是user-based或item-based这么简单,也许原来的算法是基于item-base改进,
不过既然有了友邻,相信好友的权重因素是要考虑进去的.
此外,上周我决定放弃改进Doggy 1.x, Doggy 2.0提上日程.
2.0将完全放弃1.0的框架, 主要目标是运行效率,精简代码.
2.0将不是一个PHP的框架,而是一个多语言的混合体,包括C,Perl,Java,Bash. 主开发语言是PHP和Perl,此外将绑定特定的平台进行优化:
PHP 5.2.6(FPM/MysqlND补丁)
Nginx 0.6.x
Mysql5
ImageMagick(考虑用专门服务进行处理Magick或Perl)

Doggy2注定不会通用;-).

MyTupa的商业计划书?

朱威廉在他的sina blog 展示了一段[mytupa的商业计划书的片段](http://blog.sina.com.cn/u/4b7ab976010007mc)

[MyTupa](www.mytupa.com) 和[My Space](http://www.myspace.com) 的定位应该差不多吧,称前者为中国的myspace
也合适,毕竟myspace的中文版已经拖延了很长时间了。

从我的观点看这些片段,有价值的东西并不多,部分有启示罢了。在技术方面,所谓的分布式的文件系统似乎比较
显眼,但是缺乏更多的技术细节,很难评判。如果是分布式存储系统那么新意则不大(比如LJ的分布系统就早就很成熟),但是如果说是分布式的网格
计算,似乎太超前了,呵呵,有点怀疑。

从我自己在mytupa的体验看,不少细节是我们需要借鉴的。设计一个产品,用户的体验还是第一位的。

在T41上升级了Vista

自从用了mac之后,我的t41一直在家里招尘落土了,周六的时候终于忍不住重装了vista u版。安装的时候好像很长,
我自己在旁边用mac干活,也没觉得。安装后,启动速度要比xp快很多,毕竟是“干净”的window哦。
装了一个vista loader激活,该装的更新都装了。然后就是把vs2005装上。唯一让我头疼的是C盘的空间太小。原来是20g,xp
时代就够用了。vs2005装好了就不到2g了。想了想,也成,这台机器以后顶多是用作.net的开发。至于其他用Mac就可以搞定。
刚装好t41时,无线网卡没有人出来。插上网线,更新了一下window,自动就找到了更新的驱动,包括蓝牙,无线,pm等。这点比较爽。不过,pm驱动似乎
不太兼容。在lenovo的thinkpad上下载了硬盘防震的驱动,更新了pm驱动。
没有装Lenovo的access connection,这东西太大有点垃圾。vista自己的无线网络就挺好的了。
看惯了mac的15宽屏和nec的24宽屏,现在看t41的14的屏幕,总觉得那么别扭。

作了个测试,我这t41只有1.0,得分最低就是3d商务什么的,就这还是独立显卡呢。不过,内存,硬盘,cpu都在4.1以上,也是,2g内存,7200rpm的硬盘,现在
一般笔记本也少有呢。3年前的机器现在还能这样,算是不错了。

用过mac后,回头看t41,最不能容忍的就是键盘,我这中间还让兰快换过一次。想起来真是悲哀,当初我用t21的时候,它的键盘是最好用的,因此我很长时间都不想扔掉
t21,现在看thinkpad的键盘不再有什么优势了。这段时间用mac,让我又找回t21的键盘的感觉,很舒服。
像我这种长时间使用键盘的人,对键盘最为挑剔了,哪怕有一些不舒服就受不了。

Google推出按销售付款的广告模式

上个月在去上海的车上,和太极链的一个副总聊关于按销售结果副费的广告模式,当时还说事后如何小规模的实验一把,
如果成功将颠覆现有的按点击收费的模式云云。没想到,今天看到一个新闻,google竟然已经抢先一步试行了这种模式。

[关于Google推介的官方说明](http://www.google.com/adsense/support/bin/answer.py?answer=25889&topic=1449)

# 果通过您的推介注册 Google AdSense 的发布商在注册后的 180 天内首次获得了 $5 美元的收入,我们就会向您支付 $5 美元。
# 如果该发布商在注册后的 180 天内获得了 $100 美元的收入,而且具备接受付款的资格,我们就会向您额外支付 $250 美元。
# 如果在任意 180 天的周期内,您推介了 25 位发布商,且这些发布商在各自注册后的 180 天内都获得了超过 $100 美元的收入并且均具备接受付款的资格,您将会获得 $2,000 美元的奖金(每年仅可获得一次奖金)。

这里有一个上手说明:

[http://www.sitening.com/blog/2007/04/05/screenshots-and-walkthrough-of-googles-new-adsense-referral-product/](http://www.sitening.com/blog/2007/04/05/screenshots-and-walkthrough-of-googles-new-adsense-referral-product/)

虽然google推介和我预想的还有些差距,但是毕竟是一种新的收费模式的尝试。如何具体实施,是个难题。
不过,这种模式一旦推广,可以解决目前的点击欺诈的致命缺陷,也会吸引绝大多数的中小企业,按照长尾理论,其收入总和一定会超越
现有的大客户的广告模式。

我在想,视觉中国是否也能有所启示呢?

Technorati Tags:

从Apple的字体到Vista引发的网页设计的思考 — (691)

从用mac book pro到现在这2天,最不适应的是网页的显示效果:
原来在T41上,由于是用宋体点阵,字体小的可怜,但是显示效果基本上和当初看的效果是一致的。
但是到了apple上,情况大不一样了。Mac由于使用了AA(字体反锯齿),因此,在大分辨率上的LCD上可以将字体显示的非常平滑,英文字的效果是特别的舒服。而中文,则默认的使用华文黑体。
问题来了,在Windows上,我们在作网页的时候,默认的认为用户的字体是宋体,这样,往往作效果图的时候,我们使用宋体字作为显示效果来作的。在Vista以下的系统中,系统默认使用的是simsun.ttc,这是一种内嵌了若干小尺寸的点阵字库的字体,因此,当小字体时显示效果还不错,如果字体大了,则字体边缘会立刻显得毛糙了。以前,大家都相安无事,因为,大家用的都是CRT,LCD属于少数,而且分辨率普遍都低。现在不同了,LCD越来越普及,而分辨率也越来越高,Windows下面当你分辨率调高后,字体会显得非常小,这对于你的眼睛简直是强奸。虽然你可以用大字体方案,但是效果并不好。Mac这方面则要强很多,分辨率高了,但是字体也随之增大,当起用了AA后,显示效果会非常平滑。说到这,想起了ClearType,这是MS针对LCD推出的技术,用于解决大分辨率的LCD的显示效果的问题。我当初用T41的时候,也曾经启用过,但是效果。。。简直糟透了!由于缺乏有效的矢量字体,内置的simsun在字体的边缘都花了。也许你会说,那么我的用户都是Windows,何必需要考虑Mac用户的感受呢,我继续好了。错,Vista的推出是一个重大的改变。Vista将采用矢量黑体(微软的雅黑)作为默认的显示字体,原来的simsun则被丢弃了。这样,在Vista的IE7上,用户所看到的效果就不再是原来的宋体了。由于有了好的黑体字,ClearType就有了用武之地了。用户的字体大小会根据分辨率来进行调整。

随着Vista的普及,我们设计网页的时候,会面临几个问题:

- 用户的最终视觉感受是否和我一样?
- 我要强迫用户接受我的设计字体?还是我自己去体验不同的感受?(尤其是你的用户分Vista/Mac和WindowsXP 2派用户的时候)
- 我要强迫用户选择我设计的字体大小?
- 是尊重我设计师的视觉感官重要还是尊重用户的自己的选择?

此外,随之而来的是制作网页的问题:

- 如何有效选择一个字体尺寸的度量标准?px?pt?还是em?
(em是W3C推荐,pt是印刷推荐,px很难完全精确实际大小,因为mac和windows本身对px的定义就不同)
- 行距和边际的尺寸度量标准是什么?
(我个人感觉,尽量不用px作为标准,使用em相对值更好)
- 在LCD和CRT下,我的页面的layout是否能否基本协调一致?

###最后,各位亲爱的网页设计师们,你们准备好了么?###

btw:我现在已经习惯了Mac的显示方式,虽然和原来的宋体字的感受不同,但是我的眼睛。。真的是舒服很多啊)

关于Vista和雅黑,参考一下这篇文章,虽然有点夸大其实:
[雅黑:即将到来的中文字体革命](http://www.windstudio.net/html/200611/20061114102849.htm)

网上也有不少雅黑字体的下载,据说可以用在XP上。大家可以gogole一下。

ClearType是MS的称呼,但并不新鲜,对应的,Linux/Unix上的XFT很早支持了AA,Mac的字体引擎应该和XFT差不多吧,很多人认为
M$的ClearType比Mac、Unix的AA要差一些,我没有验证过。

关于视觉论坛的思考 — (464)

What’s about the ChinaVisual next-gen forum
—–
一直在思考视觉的社区如何与论坛进行良好融合。BBS is dead? No, but how?…
我思考中的forum,不应仅仅停留在目前这种bbs的状态,它应该:

- 民主集中制,任何人都是平等的。
- 自维护,自成长的。
- 每个人在社区的地位由其言行和其他人的评价来确定。
- 责任与权利并重。
- 一切都由民主投票激发,版主、管理员不再是独裁者
- 事后仲裁机制
- 让机器做更多烦琐的事情
- 应用长尾理论,例如帖子的置顶、精华不再是取决某些人的口味,而是取自多数的
- 每个人都可以定制自己的兴趣和文集

目前,最接近我的理想的是:

- [V2Ex](http://www.v2ex.com/)

不过我认为,如果能结合digg.com将更好。