用PHP5.2+APC实现超酷的PHP进度条

英文原文(并非按词一个个译过来的)
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就行了。

我把例子代码弄过来了:

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能给出一个比较好的解决文件上传的办法。

VirtualBox 的一些错误

前面写了,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来绘制窗口。

Apache的Mod_rewrite的配置学习笔记

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)



我的先见

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