Archive for 04月, 2007

 
Apr
30
Posted (xurenlu) in php性能 on 04月-30-2007

英文原文(并非按词一个个译过来的)
http://martinjansen.com/2007/04/upload-progress/
这里是Rasmus Lerdorf实现的一个利用php5.2的新特性来进行上传进度条的例子。
为了让php存储并显示文件上传进度,他利用了APC来实现内存级缓存。APC最新的版本有一个特性(虽然没有文档化),一旦开启,将会监听包含APC_UPLOAD_PROGRESS的表单的文件上传进度。一旦发现这个POST变量,APC将会创建一个缓存入口,并把文件上传进度放到这个缓存里。这个入口的值取决于POST变量APC_UPLOAD_PROGRESS的值 。

如果你仔细看他的例子代码,你发现他用了apc_fetch来读内存值。同时在共享内存里,包含了APC_UPLOAD_PROGRESS这个魔术数字。

但是怎么让APC像这样工作呢?文档中并没有告诉我们。其实在CVS里的安装说明上写了:
在php.ini文件设置apc.rfc1867=1就行了。

我把例子代码弄过来了:

  1.  

if($_SERVER['REQUEST_METHOD']==’POST’) {
$status = apc_fetch(’upload_’.$_POST['APC_UPLOAD_PROGRESS']);
$status['done']=1;
echo json_encode($status);
exit;
} else if(isset($_GET['progress_key'])) {
$status = apc_fetch(’upload_’.$_GET['progress_key']);
echo json_encode($status);
exit;
}
?>







 

附本人意见:
php5.2之前解决大文件上传进度条显示一种是猜临时文件名另一种是用php创建webserver,需要iptables打开一些80之外的端口,还有一些是自己编译apache或php模块,基本没太大用途。有时间我详细说一下这几种情况。
目前这个看起来似乎是一个比较漂亮的解决办法。但是仍需要系统管理员(root)权限来装APC和改php.ini文件。
希望在更新版本中php能给出一个比较好的解决文件上传的办法。


Tag:
相关文章


     
    Apr
    29
    Posted (xurenlu) in 未分类 on 04月-29-2007

    前面写了,VirtualBox 是个很不错的虚拟机。
    可贵的是,VirtualBox有各种操作系统下的版本,而且他的二进制在不少系统上直接能跑起来,不城要编译。
    不过,VirtualBox也有问题:
    1:VirtualBox提供的虚拟驱动程序不支持Directshow.也就是说,如果你同我一样在lin上虚拟了一个Win,那你会发现你玩不了2D/3D游戏。当然,简单的或是自己开发图形处理引擎的游戏可以玩玩。就算自己安装DirectX也不行。
    2:在客户机(我是在linux下虚拟了一个XP,用来进行银行帐户处理)下,按Alt+F4并不会关闭窗口,而是出现VirtualBox询问你是否要关机的窗口。不管你点什么,点过之后都会用不了键盘,症状就是好像Shift/Alt键被按住不放了一样。
    解决办法很简单:单按Alt键一次就Okay了。我是无意中试出来的。
    3.这个更郁闷:当客户机(XP)全屏时,Linux的输入法(SCIM)的图标会一直漂浮在客户机的窗口上。而且你还可以选输入法~!VirtualBox看来目前也没法子解决这个问题,应该是SCIM使用了比较系统底层的API来绘制窗口。


    Tag:
    相关文章


       
      Apr
      29
      Posted (xurenlu) in 未分类 on 04月-29-2007
      modrewrite配置文档学习笔记:
      
      1.环境变量:
      
      	例子:
      
      	SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
      	SCRIPT_FILENAME=/u/rse/.www/index.html
      	SCRIPT_URL=/u/rse/
      	SCRIPT_URI=http://en1.engelschall.com/u/rse/
      
      2:RewriteBase
      	描述:设定基于目录的重写规则的Base url.
      	Syntax:	RewriteBase URL-path
      	Context:	directory, .htaccess
      	Override:	FileInfo
      	Status:	Extension
      	Module:	mod_rewrite
      	这个一般不太需要管它.
      3.RewriteCond
      	用法:	RewriteCond Teststring Pattern
      	这里是Teststring里用到的一些内置变量.
      	HTTP headers:	connection & request:
      	HTTP_USER_AGENT
      	HTTP_REFERER
      	HTTP_COOKIE
      	HTTP_FORWARDED
      	HTTP_HOST
      	HTTP_PROXY_CONNECTION
      	HTTP_ACCEPT
      	REMOTE_ADDR
      	REMOTE_HOST
      	REMOTE_PORT
      	REMOTE_USER
      	REMOTE_IDENT
      	REQUEST_METHOD
      	SCRIPT_FILENAME
      	PATH_INFO
      	QUERY_STRING
      	AUTH_TYPE
      
      	DOCUMENT_ROOT
      	SERVER_ADMIN
      	SERVER_NAME
      	SERVER_ADDR
      	SERVER_PORT
      	SERVER_PROTOCOL
      	SERVER_SOFTWARE
      	TIME_YEAR
      	TIME_MON
      	TIME_DAY
      	TIME_HOUR
      	TIME_MIN
      	TIME_SEC
      	TIME_WDAY
      	TIME
      	API_VERSION
      	THE_REQUEST
      	REQUEST_URI
      	REQUEST_FILENAME
      	IS_SUBREQ
      	HTTPS
      
      	#你可以在规则前加"!"取反.
      	#这是一些常见的特殊的规则。你可以使用他们来取代一些表达式:
      
      	* 'CondPattern’ (lexicographically follows)
          * ‘=CondPattern’ (lexicographically equal)
          * ‘-d’ (is directory)  测试是否是目录.
          * ‘-f’ (is regular file) 测试是否是常规文件.
          * ‘-s’ (is regular file, with size)
          * ‘-l’ (is symbolic link)
          * ‘-F’ (is existing file, via subrequest)
          * ‘-U’ (is existing URL, via subrequest)
      
      	你可以为规则后设置[flags]选项作为第三个参数.常见的有:
      	You can also set special flags for CondPattern by appending [flags]  as the third argument to the RewriteCond  directive, where flags is a comma-separated list of any of the following flags:
      
      	# ‘nocase|NC’ (no case)
      	# ‘ornext|OR’ (or next condition)
      	例如:
      	RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
      	RewriteCond %{REMOTE_HOST}  ^host2.*  [OR]
      	RewriteCond %{REMOTE_HOST}  ^host3.*
      	RewriteRule …some special stuff for any of these hosts…
      
      	如下例:
      	RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
      	RewriteRule  ^/$                 /homepage.max.html  [L]
      
      	RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
      	RewriteRule  ^/$                 /homepage.min.html  [L]
      
      	RewriteRule  ^/$                 /homepage.std.html  [L]
      	用Mozilla类的浏览器访问时会带你到homepage.max.html,这里支持所有特性。用Lynx来浏览时,带你到纯文本页(homepage.min.html),默认情况下会访问一个叫homepage.std.html的页.
      
      4.RewriteEngine:
      	使用:
      	RewriteEngine On|Off
      	如果存在.htaccess的文件,应当显式地指明RewriteEngine On.
      	因为默认情况下.htaccess的RewriteEngine项是Off的。因此如果想用.htaccess来设置rewrite,文件头一行一般都需要RewriteEngine On
      
      5.RewriteLock:
      	供rewrite-mapping程序同步使用的锁文件。
      	使用:
      	RewriteLock file-path
      
      6.RewriteLog:
      	设定日志文件.如果不是以”/”开头,则是指相对ServerRoot的相对路径.
      	使用:
      	RewriteLog	file-path
      
      7.RewriteLogLevel:
      	设定日志记录级别。
      	使用:
      	RewriteLogLevel level
      	默认:
      
      8.RewriteMap:
      	使用Mapping.
      	它的上下文是Server config 和Virtual host
      	使用:
      	RewriteMap Mapname MapType:Mapsource
      	例如:
      	在httpd.conf中配置:
      	#RewriteMap exampleMap txt:/path/to/file/map.txt
      	#RewriteRule ^/ex/(.*)	${exampleMap:$1}
      	而map文件的格式有这个几个:
      	1.txt类型的map文件:
      		#Standard Plain	 txt:
      		#map.txt
      		#maptype:txt
      		Ralf.S.Engelschall    rse   # Bastard Operator From Hell
      		Mr.Joe.Average        joe   # Mr. Average
      
      	2.Randomized Plain Text
      		#maptyp:rnd
      		static	www1|www2|www3|www4
      		dynamic	www5|www6
      
      		配置:
      		RewriteMap servers	rnd:/path/to/mapfile/map.txt
      		RewriteRule ^/(.*\.(png|gif|jpg)) http://${servers:static}/$1	[NC,P,L]
      		RewriteRule ^/(.*)	http://${servers:dynamic}/$1	[P,L]
      
      	3.dbm
      		这里提供了一个txt2dmb程序。
      		!/path/to/bin/perl
      		##
      		##  txt2dbm — convert txt map to dbm format
      		##
      
      		use NDBM_File;
      		use Fcntl;
      
      		($txtmap, $dbmmap) = @ARGV;
      
      		open(TXT, “<$txtmap") or die "Couldn't open $txtmap!\n";
      		tie (%DB, 'NDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
      		  or die "Couldn't create $dbmmap!\n";
      
      		while () {
      		  next if (/^\s*#/ or /^\s*$/);
      		  $DB{$1} = $2 if (/^\s*(\S+)\s+(\S+)/);
      		}
      
      		untie %DB;
      		close(TXT);
      
      		用法:
      		$ txt2dbm map.txt map.db 
      
      	4.内置函数:
      		map:int map-source:internal apache functions
      		functions有:toupper,tolower,escape,unescape
      
      	5.外部程序:
      		maptyp:prg map source:外部程序的路径.
      		示例:
      		#!/usr/bin/perl
      		$| = 1;
      		while () {
      			# …put here any transformations or lookups…
      			print $_;
      		}
      
      9.RewriteOptions
      	用法:
      	RewriteOptions rewriteoptions
      	default	:
      	rewriteoptions	maxRedirects=10
      	上下文:
      	server config,virtual host,.htaccess directory
      	rewriteoptions可以是下面两个值:
      	inherit:从上一级配置继承.
      	MaxRedirects=num(10,15,,,,,等等)
      
      10.RewriteRule:
      	这是mod_rewrite中用得最多的语句了(”the real rewriting workhorse”);
      	用法:
      	RewriteRule pattern Substitution [Flags]
      
      	Quantifiers:
      	  ?           0 or 1 occurrences of the preceding text
      	  *           0 or N occurrences of the preceding text (N > 0)
      	  +           1 or N occurrences of the preceding text (N > 1)
      
      	Grouping:
      	  (text)      Grouping of text
      				  (used either to set the borders of an alternative as above, or
      				  to make backreferences, where the Nth group can
      				  be referred to on the RHS of a RewriteRule as $N)
      
      	Anchors:
      	  ^           Start-of-line anchor
      	  $           End-of-line anchor
      
      	Escaping:
      	  \char       escape the given char
      				  (for instance, to specify the chars “.[]()” etc.)
      
      	一些技巧:
         1.  back-references ($N) to the RewriteRule pattern
         2. back-references (%N) to the last matched RewriteCond pattern
         3. server-variables as in rule condition test-strings (%{VARNAME})
         4. mapping-function calls (${mapname:key|default})
      
      	关于Flags:
      	# ‘chain|C’ (chained with next rule)
      	# ‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’ (set cookie)
      	# ‘env|E=VAR:VAL’ (set environment variable)
      	# ‘forbidden|F’ (force URL to be forbidden)
      	# ‘gone|G’ (force URL to be gone)
      	# ‘last|L’ (last rule)
      	# ‘next|N’ (next round)
      	# ‘nocase|NC’ (no case)
      	# ‘noescape|NE’ (no URI escaping of output)
      	例如:
      	RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
      	这将会将’/foo/zed’ 转向到’/bar?arg=p1=zed’
      	# ‘nosubreq|NS’ ( not for internal sub-requests)
      	# ‘proxy|P’ (force proxy)
      
      	Note: mod_proxy must be enabled in order to use this flag.
      	# ‘passthrough|PT’ (pass through to next handler)
      	(例如:
      	RewriteRule ^/abc(.*) /def$1 [PT]
      	Alias /def /ghi
      
      	# ‘qsappend|QSA’ (query string append)
      	# ‘redirect|R [=code]‘ (force redirect)
      	# ’skip|S=num’ (skip next rule(s))
      	# ‘type|T=MIME-type’ (force MIME type)
      

      Tag:
      相关文章


         
        Apr
        20
        Posted (xurenlu) in 未分类 on 04月-20-2007

        1.我可能跟我周围这些人相比,是最早站出来说谷歌未必就永远不做恶的.事实证明,它确实做了(不管是不是因为它没管教好它的两个工程师).在之后霍炬,还有其他一批前辈终于看到谷歌的无奈和乖巧.
        2.在2006年3月到5月这段时间里,我迷上了征途。我在大二的时候玩过传奇,玩征途是第二次玩网游。某些专家放炮说:史玉柱的征途是不可能赢利的。这时候我玩过了,所以我知道不是。我相信他是能赚钱的。现在看来,果然,但是专家们好像不鸟这事儿,又攻击说征途胜在他利用人类的某些弱点比如好胜好斗上。简直是睁着眼说瞎话.做网游最早的最好的,是陈天桥的传奇。传奇不是是杀怪模式吗?征途之前如此众多的网游,杀怪模式练级的太多了。
        3.因此我突然对自己的直觉有了一些自信。所谓的专家,不见得比我强.


        Tag:
        相关文章


           
          Apr
          18
          Posted (xurenlu) in 未分类 on 04月-18-2007

          我的验证码是:4f7a4148。
          马上就要试试放广告的感觉。哈哈。
          不过其实这玩意儿怎么说呢,其实来不了什么钱。如果blog也能赚多少钱,才见怪呢。


          Tag:
          相关文章


             
            Apr
            14
            Posted (xurenlu) in 未分类 on 04月-14-2007

            1.我在四川的时候,在长途车上上来一个卖报的大婶。女友花了几毛钱的报纸,随口说了声”谢谢”.卖报的大婶一个劲地说:”不谢不谢,你们花钱,应该要我说谢谢,怎么让你们说谢谢呢“。这就是对客户的态度。哪怕花了三毛钱,也要谢谢客户.
            2.从杂志上看来的一个故事:一个死囚在临死前,被问及有什么要求。他说:请给我一年时间,我可以教会国王的马飞。当然这不可能,不过他是这么想的:一年之中,可能马真得飞了,也可能国王死了新君即位大赦天下。最差我也可以多活一年.
            是的,创业企业首先要敢想。再要敢说。意外和转机随时可能发生.
            3.我一个朋友在被问及靥字读什么,怎么写时,他这么说:我老爸告诉我,你做什么事情时都要知道,有很多人正和你做同样的事。所以,我肯定会有人在查这个字怎么读。于是他把人问的“上面一个厌,下面是面,这个字怎么打?”输入百度知道,居然出来好多结果,看来果然如此。
            回头一想,当你觉得你这个创意完美无暇,你做这个事情绝对不会有其他人竟争时,是否要再想想呢?中国人这么多,怎么保证只能有你会想到这个呢。


            Tag:
            相关文章


               
              Apr
              03
              Posted (xurenlu) in 未分类 on 04月-3-2007

              上帝绝对跟我开了个玩笑.
              当我从湖北电力出来的时候,我不知道我要往哪里去。我只是想做点自己喜欢做的事.
              于是我头也不回地交了辞呈,走了.
              我走时还不知道我到底想干什么.
              当我改变职业成为PHPer时,我真的挺高兴的.虽然累点,没啥钱,但我还是高兴.
              不过很快发生了一件让我无法忍受的事情,其实现在看来没啥,不过当时太冲动了,现在对我来说,老板给员工画个大饼,骗骗人是很正常的.
              于是我走了.
              当我来到另一家公司的时候,我说,我这次一定要干得久一点,让自己的简历好看一点,起码把一年干完,把活儿干漂亮.
              不过上帝看来跟我开了一个天大的玩笑.
              突然来了这么一荐事,我突然一下子毫无准备地失业了.
              我之前念叨着,项目完了要给自己放个大假,好好玩玩.现在好了,我一下子就回家玩了个半个月,只玩到自己觉得实在无聊了才回北京.
              世上事也许就是这样吧,总是在你觉得最无可能的时候发生.
              我一直想着计划自己的人生,没想到总是败的这样彻底.


              Tag:
              相关文章


                 
                Apr
                03
                Posted (xurenlu) in php性能 on 04月-3-2007

                武侠小说里常写,无招胜有招.大师们最终都要精通十八门武艺,然后最后学通一门,再融会贯通,突破前人,练就一招独门绝技.
                我曾经折腾着要自己整文本数据库系统,自己整模板系统,自己整MVC框架.自己封装一堆操作,乐此不疲.
                有一天我仔细地研究了Smarty模板的机制,突然良心发现,把我自己折腾的模板系统扔了.因为我发现,模板引擎的引入,初衷是简化表现层的操作,但最终Smarty的语法,已经越来越像一个php,越来越像一个新的WEB脚本了.本来是两层,php引擎解释PHP文件,现在多了一层,php引擎解释smarty引擎,smarty引擎又解释smarty模板.现在smarty的语法还在不断增加,扩展,他们正在努力在php语言的圣殿下,用smarty造一个小房子.
                于是我在做某个网站的两会专题时,文件架构是这样的:
                /view.php
                /model.php
                /index.php
                /config.php
                view.php文件的第一行就声明了:global
                $data;$data是一个多维数组,它的内容已经由index.php来产生.view.php中除开这一句之外,就只包含echo语句和foreach语句了.它们就负责一行行地输出data数组的内容。
                index.php则是入口文件,它包含了config.php,model.php
                ,view.php.虽然不长,我还是给它实现了一个缓存功能.就是如果writable/cache.php文件存在且创建时间在10分钟以内,就直接包含cache.php并退出,否则调用wget将最新的网站显示内容读一份存到writable/cache.php中存起来.index.php是主要的执行文件.
                config.php 则是几行配置信息,比如数据库信息啦之类.
                model.php则是定义的函数的声明。其实这里也就三个函数.
                现在我的工作完成了,余下的工作,就是告诉美工,要改的话,只需要修改view.php文件就行了.这个文件,随便改一下也没啥问题.
                所谓的MVC,其实归根结底,就是可以做到如此简单.
                所以,为什么要用smarty呢.如果要将logic和view分开,很简单,把文件一分为二,其中一个只管显示就行了。如果非要用if else 或是foreach,在smarty中也是要用的,我干吗要再去学smarty的关于if else 和foreach的语法呢,我直接在view.php中使用php标签就行了.
                学透了以后,太多东西其实都可以这样来解决.cookie被认为是不安全的,所以往往一些系统设计了非常复杂的SESSION机制,还写大段大段的代码自行设计了加密算法.首先,加密算法有现成的可用的,没必要自己搞定.再者,看看wordpress,人家也直接在cookie存了用户名和密码.但普通人如果要在cookie中存,往往就存用户名和md5后的密码.但wordpress不这么干,人家把密码md5加密了一次,再用md5加密了一次.你不是说用户可能设置少于6位的密码吗?你不是说少于6位的密码几分钟就可以暴力破解吗?我现在两次md5加密.不就成千上万倍地增加了破解难度了吗?多简单的做法!
                类.我不得不说一下这个.不知道为什么,人们在学会php5下的类操作后,就觉得不管什么,哪怕是写一个文件什么的,一定要封装一下.需知,OOP不是仙药,(原话应该人月神话中的:没有银弹.),OOP仍然不能解决一切,甚至不见得比Function式的编辑解决得更好.如果您决定了要写一堆Class,那么事先告诉我,您保证您写成Class的初衷不是为了好看,不是为了让老板知道您会用class了.
                还有一些仁兄们,喜欢把程序弄得非常好看,优雅.当然如果可能,好看一点的代码谁都喜欢.但是有很多时候,好看是以数倍的性能牺牲为代价的.我在一个短短的php文件中,看到有十个以上的地方使用了eval($variable)类似的语句.(之前看到霍炬的文章我不信,后来见到这份文件我信了).我能想出来的本来可以直接运行的代码非要放进eval中去执行的理由只有:可能这样好看一些.兄弟,如果您对好看与非很在乎的话,我建议您真的应该与您的美工换一换,这样也许能做出来一个很好看的网站!
                有些东西,真不是越复杂越好.把php弄精,两点:多看手册,多问baidu/Google(为了避免卷入google还是baidu之争,我特意两个都写上,并在注意了排序).有时间骂Zend framework太庞杂,Xoops太老套,不如坐下来看看php手册.

                小插曲:有一天同事在争论上面一个”厌”字,下面一个”面”字该读什么,于是各显神通.最后一位同事在baidu知道上搜”上面厌 下面 面”居然就给找出答案来了,那个提问的人问的正是跟我们一样的问题.同事说:我爸爸教育我说,无论你做什么,要记住:总有人可能和我们正在做同样的事情.于是他想到可能会有人困扰这个字怎么读,就想到到baidu知道里来查.(我个人建议,那些认为自己发明了一个新点子,于是马上找风险投资,认为他的创业一定会成功的人,应该想想这个道理).同时,我这位朋友现在可能需要一份工作,他是一名精通DIV+CSS架构的网页设计师,方向是UI/UE/网页设计师,可能更偏html code方向,当然设计的底子也很扎实,如有意麻烦加我:helloasp@hotmail.com


                Tag:
                相关文章


                   
                  Apr
                  03
                  Posted (xurenlu) in php性能 on 04月-3-2007

                  PHP有秘籍吗?
                  有.PHP手册.
                  不信,您问问其他人.我问了不少虽不是世界大师级,但是业内也小有名气的人,他们都会说,多看看php手册.
                  之前面试了几个小孩,问过这样一个问题:如果有问题,比如难,您打算怎么解决?或是您如何学习php的?
                  您猜怎么着?
                  他们的回答分别是:有QQ上问一下朋友…. 看在线视频学的.
                  我相信以我MSN上好友名单<有几个开源项目的国内的负责人,国内几个大型站点(这里大型站点的定义是站点访问在100万以上)>,不能不说是没有高人,不过能通过msn解决的问题也不多.另外看视频更让人晕了.
                  如果想学好php,真的应该好好看看php手册.起码在想不起来函数function_aa怎么用的时候,第一个反应是打开IE,输入www.php.net/function_aa来查询,而不是上QQ去问朋友,也不是到一些根本不入流或是没人气的论坛发贴问.
                  如果选择上论坛,去php.net讨论会更好啊!


                  Tag:
                  相关文章


                     
                    Apr
                    03
                    Posted (xurenlu) in php性能 on 04月-3-2007

                    不知道各位看官都使用什么工具来进行PHP文件编写工作呢.
                    很多人使用Dreamweaver,当然这是一个很好的工具.不过,看看当前文件的可视化状态下的表现,或是使用一下代码补全功能,或是用它来弄CSS,生成几个笨拙的JS特效,就那么爽吗?

                    我推荐的有Editplus,Eclipse,Zend Studio,VIM.
                    EditPlus,看起来就像一个功能强一点的记事本,不过它有很强的配置功能,很多东西都可以通过配置文件来改良.您可以在Editplus中加上调试Java,PHP的功能.然后程序写完了只需要轻点一下工具栏上您配置好的了某个按钮,控制台下就会给出程序调试信息,运行结果。
                    另一个特点,它运行起来就像记事本一样快.
                    补充一下,它是收费的.
                    Eclipse,是IBM给开源世界的献礼,相当不错(不过在我的NoteBook下表现不稳定).它对PHP和svn的支持是通过插件来支持的.
                    Eclipse的特点是可以一个IDE编写很多语言脚本,只需要添加对应的插件,而且这些插件都表现不俗.我最初喜欢它,是因为看了老覃同志在eclipse下进行svn操作。
                    最初php
                    edit插件不支持代码自动补全,代码缩进等功能.现在最新版本已经支持了.很不错.
                    Eclipse的缺点就是东西太大了,下载下来有200多M,运行也慢.而且通过update功能来安装插件经常失败(我http方式下载就正常).另外据其他人的报告,不同的插件之前可能会产生冲突(因为不同的插件是由不同的团队开发维护的).
                    ZendStudio,这个由php两名元老的名字合起来的名字,出的东西总是表现不俗.ZendStudio,这个IDE可以说是相当专业的PHP开发IDE.我推荐它是因为:
                    a.良好的调试控制.
                    b.代码补全,提示…
                    简直爽得不得了.能够在编写时以漂浮层给出函数的说明(包括您自己定义的函数,只要您按格式写注释,它也能识别记忆,并在您下次写出函数名时就给您提示)
                    c.严格的注释格式,内置的phpdocumet功能.为您开发的工程没有好的文档而烦恼吗?用Zend studio吧.您按照他的提示写注释就是了。工程完成后在工程目录下右键,选”php document”,按提示就可以一步步生成漂亮的技术白皮书.
                    另外,他运行起来也不快,与svn的整合表现并不是很好(相比Eclipse下的svn插件),而且,价格也不菲.
                    VIM.
                    这个是我现在爱不释手的工具.
                    首先最大的特点,VIM本身就是为程序员而准备的!~
                    而且,它是免费的!
                    它已经经过千百万人的使用,遇到Bug或是非法操作或是什么段错误这种提示我没见到过.
                    VIM一般linux/Unix上都装备有了(既然它是这样一款优秀的工具,又是如此小巧,还不花一文钱,为什么不为所有人献上这一美味的菜呢?我想Linux的打包者都是这样想的).
                    VIM是一款不需要用mouse的好东西.在终端输入vim
                    file.txt启动vim后,它处于命令状态.在命令状态下按i进入编辑状态,按v进入可视状态.不管什么情况下,按”ESC”键都可退出到命令状态.在命令状态下输冒号就可输入命令.比如输:%s/file/文件/gc,就可查询file并询问是否替换成”文件”.输:wq就可保存并退出vim.输:q!就可不保存而退出.
                    我个人认为,使用VIM,编辑效率至少可提高50%.
                    Vim同时也支持配置文件,(~/.vimrc),这个脚本也可以定义函数(function),进行循环…酷毙了.
                    Vim中可以识别常见的主流脚本的关键字,比如一旦进入到的中间,您一输入function,这个词就马上变色了,看着很舒服.
                    所以,高明的程序员,应该学会Vim.


                    Tag:
                    相关文章


                       
                      Apr
                      03
                      Posted (xurenlu) in php性能 on 04月-3-2007

                      我曾经遇到这样一名求职者,再三声明自己有数年的项目管理经验.我问了这样一个问题:您在项目管理中使用的版本控制工具是什么?还特地问了CVS,SVN。然而让我失望的是,这两样,他一样也不会.我当然认为他的项目管理经验是不可靠的.
                      不会与人沟通的程序员,一般来说不是一个好的程序员.当然,还是有例外的,所以我在这里说”一般来说”.比如,如果您能独立完成一个Linux
                      kernel,或者您就是互联网之父,Unix之父,我就认为您可以不与人沟通.您就几个通宵不歇息,就整出一个baidu.com,我当然钦之偑之。遗憾的是,这样的天才总是太少了.
                      在程序员的江湖里,要学会与人沟通,协作,就一定得会至少一样协作开发工具,这里我简要介绍一下SVN.
                      SVN被设计为新一代的版本控制协议,开发者期望它能够取代CVS.事实上,也有大量的工程从CVS转投到了SVN的怀抱.Sourceforge.net就在不久前为所有的项目提供了SVN.
                      SVN的全名是Subversion.在最新的Fedore
                      Core里(就是我用的GNU/Linux操作系统,它的版本是6.0,现在已经出7.0了),已经内置了SVN,您只需要在安装的时候选择它就行了.
                      在Windows下,也有不少的版本可以选择,比如命令行的Subversion,RapidSVN,乌龟SVN等.
                      具体安装,可以查询www.subversion.org.cn。
                      安装完了之后,您需要为svn
                      server建立一个根目录.我的机器上是/var/svnroot,运行svnserve -d -r
                      /var/svnroot,就成功地运行了svn
                      server.注意,服务器文件名称是svnserve,我第一次使用时曾花了10分钟才弄清楚这个愚蠢的错误.
                      现在您可以把某一个工程导入到svn中了.比如运行:svn import /var/projects/www/
                      svn://localhost/projects/www -m “First
                      Import”,就将/var/projects/www这个工程导入到svn系统中去了.但是这样还不够,现在对/var/projects/www目录下文件的改动还不能被svn监视的.现在新建一个目录,/var/unfinished/.进入到这个目录,运行svn
                      co
                      svn://localhost/projects/www,就可以检出svn服务器上的文件.检出文件后,目录下除下您的工程文件外,还将多一个.svn目录(每一级目录下都有)这是给svn客户端使用的。现在您每改一个文件,或新增目录,都要svn
                      ci一下。比如您新增了一个newfile.php,就需要运行:

                      svn add newfile.php
                      svn ci newfile.php -m “newfile.php是为了***而加的一个文件”

                      来导入.改动的文件不需要运行svn add 命令.
                      如果您不知道当前有哪些文件改动了,可以用:

                      svn status /var/projects/www

                      来查看当前的状态.


                      Tag:
                      相关文章


                         
                        Apr
                        03
                        Posted (xurenlu) in php性能 on 04月-3-2007

                        想想,当您感觉到自己的已经非常牛X的时候,肯定想着自己写一个wordpress,或是discuz了.现在您开始考虑,如何架构一个国际化的(多语言)的程序了。
                        学会用不同的语言与不同的对手打交道,是纵横天下第一重要的事.
                        如何开始呢?
                        我所了解的有三种方案:
                        方案一:利用模板引擎,每一种语言,制做一套模板.选中不同的模板,就等于选用了不同的语言.模板引擎这玩意儿是已经被我批得不成样子了,因为php本身就是相当不错的模板.不过还是很多人用。您可以尝试smarty,phplib,fast template等。另外国内也有不少人自行开发模板引擎。一年以前,我也是他们中的一员。
                        方案二:不同的语言包含不同的文件。把要翻译的语句放在单独的文件中,选用不同语言时,require或是include不同的文件。例如:

                        $lang=”en_US”;
                        require(”lang/$lang/lang.php”);
                        echo $msg["WELCOME"];
                        ?>

                        而lang/en_US/lang.php中可能是:

                        $msg["WELCOME"]=”Welcome to …”;
                        ?>

                        要改成中文,需要添加lang/zh_CN/lang.php文件:

                        $msg["WELCOME"]=”欢迎来到…”;
                        ?>

                        对应的把文件中的代码改为下面的就行了:

                        $lang=”zh_CN”;
                        require(”lang/$lang/lang.php”);
                        echo $msg["WELCOME"];
                        ?>

                        目前大部分的程序,使用这种方法来达到国际化,多语种.比如Xoops.不过xoops在语言包文件中不是用数组来存储翻译的词语的,而是用Define(”MSG_WELCOME”,”欢迎来到…”)来存储的。这个是为了速度能更快.数组和常量存储的方式不一样.
                        但这样做的缺点也不言而喻。因为,您至少需要做一个语言包(一般而言是英文)而且需要记住那些词条名,比如MSG_WELCOME,MSG_REGISTER_SUCCESS等等.在程序中出现在就是MSG_WELCOME,MSG_REGISTER_SUCCESS这些不易看懂的内容,一旦您的语言包中缺少这一条,显示的就是空的,啥也没有.
                        方案三:使用Gnu
                        GetText方案.Gnu程序中推荐的是使用GetText函数.这个最初是在C语言中出现的。但是现在php中也有了gettext函数了.Wordpress中就是使用的这种方案.
                        看看其步骤.
                        第一步:
                        使用一个函数将您的字串包起来.您的程序应该写成这样子:

                        //file:test.php
                        echo __(”I am Mr Wung”);
                        function __($msgid)
                        {
                        return $msgid;
                        }
                        ?>

                        您目前可以加上__($msg)函数的定义,函数可以直接返回msg本身.
                        第二步:生成语言文件:
                        (在linux中)运行 xgettext –keyword=__
                        test.php,完成后将会生成一个messages.po文件。内容如下:

                        # SOME DESCRIPTIVE TITLE.
                        # Copyright (C) YEAR THE PACKAGE’S COPYRIGHT HOLDER
                        # This file is distributed under the same license as the PACKAGE package.
                        # FIRST AUTHOR , YEAR.
                        #
                        #, fuzzy
                        msgid “”
                        msgstr “”
                        “Project-Id-Version: PACKAGE VERSION\n”
                        “Report-Msgid-Bugs-To: \n”
                        “POT-Creation-Date: 2007-03-20 11:44+0800\n”
                        “PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n”
                        “Last-Translator: FULL NAME \n”
                        “Language-Team: LANGUAGE \n”
                        “MIME-Version: 1.0\n”
                        “Content-Type: text/plain; charset=CHARSET\n”
                        “Content-Transfer-Encoding: 8bit\n”

                        #: test.php:3
                        msgid “I am Mr Wung”
                        msgstr “”

                        您看到了,messages.po中已经把程序中所有用__函数包起来的字符串找出来了。现在您编辑它,将最后一行中的msgstr
                        “”改为msgstr “我是王先生”;将倒数第六行中的charset=CHARSET改为charset=UTF-8;
                        现在再运行msgfmt
                        messages.po,将会在当前路径生成一个messages.mo文件.这个文件是编译以后的二进制文件,因为messages.po文件用来搜索字符串太慢了.
                        有了这个文件以后,__()函数就可以在messages.mo文件中进行查找,如果找到了对应的字符串,则可以给出翻译,如果找不到,就会直接返回它本身.而且,您用vim,editplus或是其他文件打开test.php文件,也能从echo __(”I am Mr Wung”)看出这一句是什么用途.相比之下,Xoops方式的echo MSG_I_AM_MR_WUNG;就晦涩多了.
                        至于__()函数,其实是一个别名,它实际调用了gettext函数.这个函数,在Wordpress中已经给出,是一个open项目.


                        Tag:
                        相关文章