但是我一直没找到php多线程的办法。因此遇到很多需要多线程的问题我都是“把多线程转化成多进程”。怎么讲呢,其实很土,把要处理的配置文件分成几十份,写几十个批处理(.bat)php myphp.php conf_n.txt 。然后全选这些文件回车一下,这样就同时有好多程序一起跑了。
今天试着搜索php+fork,果然找到办法了,真是惊喜啊。请看php手册中"process control functions "部分,其中几个关键函数是pcntl_fork 和pcntl_waitpi。
下面是摘抄:
pcntl_fork
Description
int pcntl_fork ( void)The pcntl_fork() function creates a child process that differs from the parent process only in it's PID and PPID. Please see your system's fork(2) man page for specific details as to how fork works on your system.
On success, the PID of the child process is returned in the parent's thread of execution, and a 0 is returned in the child's thread of execution. On failure, a -1 will be returned in the parent's context, no child process will be created, and a PHP error is raised.
(字节数 : 2126)
但是现在工作中常常需要完成一些和互联网联系紧密,而且数据量很大的任务,分析需要用正则表达式,需要大量的文件处理功能,而且文件一般很大,最好能支持多线程技术。
心理明白这种工作最好用perl不过了。不过临时抱佛脚有些困难,时间紧也是借口,只好先用php和javascript抵挡一下,拖延一下学习perl的时间^_^。
结果现在我的工具五花八门。
有时候用c++,它的stl实在太强大了,还可以使用多线程,非常方便,一般用来做命令行程序处理大文件、多线程访问网络等。
俺最好能找个开源程序看看,把命令行参数这种体力活简化一下,象众多linux程序一样支持大量的命令行参数选项和.rc配置文件,要不然改程序太麻烦。编译一次编译一次的头疼……
还计划在c++里面使用正则,看中了pear的c库,不过遇到一些麻烦,还没有在windows平台上编译成功-_-! ,在*nix下应该比较容易吧。
有时候用php,不用说,支持正则,联网功能和文件处理都可以,不过没有标准c++库那么强大的数据结构,尽管据说php的数组是map,但是它到底多么强壮我没测过,处理太大的文件(超过1G)我还是不敢用它滴。
缺点,不支持多线程,据手册说php可以调用winapi和com组件,嗯,可以研究一下,关键是数据类型,如何一一把windowsAPI的数据类型转变到php类型。特别是,调用windows的CreateThread函数该怎么用法,那个线程函数指针怎么写?
有时候用javascript。嗯,如果需要写带界面的小程序,我会用最快的速度写个HTA程序。用html+css描述界面,用javascript写程序,用xmlHttp组件连接网络,使用正则和DOM分析网页,太方便了。不过还是老问题,怎么多线程?另外hta程序其实是用IE作外壳,处理大文件俺不敢用它。
目前有个想法,那就是WSH , 也是用js写脚本,但是跟IE就没关系了。据说很多病毒用它,估计功能不错。和ActiveX结合估计能无敌了。还是回到老话题,我想研究一下写个能创建线程的ActiveX让javascript用,把js的函数对象作为activeX创建线程的执行函数。高手路过的话给点提示吧。我想难点有两个,一个是如何把javascript的函数对象传递到activeX中的线程函数中作为回调函数,一个是如何在这个js函数中使用临界区以及线程通讯。
唉,以前没俯下身子研究com和atl,现在傻了,学到用时方恨少啊。
相关连接:WSH-Multithreading Script google搜索"Multithreading wsh"
(字节数 : 1609)
浑浑噩噩的生活着,快要入睡了,忽然一种东西湿润了我的眼睛——我想到“自己”了,内心一丝灵光闪现,然后又立即消失在我心灵的污汤里。
我想起自己体重增加了6斤,猪油蒙住我的肚子也蒙住了我的心脏。我还想起自己的时间概念模糊了很久了,好像被外星人窃取了好几年的时间,回忆空荡荡的,一片荒芜。
这个五一我做了什么?无聊的上了五天网,拿着鼠标不知道点哪里,找不到自己的家园,恶心。
偶尔还记起一些什么……
零一年五月。放假的那天雨下的很大,我在教室的后面坐着听王菲的《执迷不悔》,教室前面有对情侣正在玩耍,其中有我暗恋的她。刚听说他们好上了。那时我坚信在校园恋爱是一种罪恶,我只能装做深沉的样子。
零二年五月。转移了目标,喜欢并懵懂的追求另一个她,她毕业后不久就相亲,和一个快三十的男人订婚了。这年五一我去找她,见面,有距离的散步,然后平淡的分别。
零三年五月。我的BP机忽然收到她的呼叫。她找我什么事?我一再内心起了波澜,后来打电话给她家,她母亲告诉我,“她结婚了”。
零四年五月。唐山,我们无休止的加班中,五一那天哥几个去饭馆聚餐,四个人吃了一个大锅鱼、一个肘子。
零五年五月。我回家了,走在村外的公路上,两边是碧绿的麦苗,风温暖的吹,带着青麦苗的清香。
想起“生活”二字,我不禁咒骂,他妈的。
(字节数 : 714)
今天碰到一个处理文件特殊字符的事情,再次注意到这个问题,在php中:
* 以单引号为定界符的php字符串,支持两个转义\'和\\
* 以双引号为定界符的php字符串,支持下列转义:
\n 换行(LF 或 ASCII 字符 0x0A(10))
\r 回车(CR 或 ASCII 字符 0x0D(13))
\t 水平制表符(HT 或 ASCII 字符 0x09(9))
\\ 反斜线
\$ 美元符号
\" 双引号
\[0-7]{1,3} 此正则表达式序列匹配一个用八进制符号表示的字符
\x[0-9A-Fa-f]{1,2} 此正则表达式序列匹配一个用十六进制符号表示的字符
举几个例子:
一个包含\0特殊字符的例子:
$str = "ffff\0ffff";
echo(strlen($str));
echo("\n");
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i}));
echo("\n");输出结果:
----------------------9
102 102 102 102 0 102 102 102 102
替换特殊字符的例子
$str = "ffff\0ffff";
$str = str_replace("\x0", "", $str);
//或者用$str = str_replace("\0", "", $str);
//或者用$str = str_replace(chr(0), "", $str);
echo(strlen($str));
echo("\n");
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i}));
echo("\n");
输出结果:
----------------------
8
102 102 102 102 102 102 102 102
八进制ascii码例子:
//注意,符合正则\[0-7]{1,3}的字符串,表示一个八进制的ascii码。
$str = "\0\01\02\3\7\10\011\08\8"; //这里的\8不符合要求,被修正为"\\8" (ascii为92和56)
echo(strlen($str));
echo("\n");
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i}));
echo("\n");
输出结果:
----------------------
11
0 1 2 3 7 8 9 0 56 92 56
十六进制ascii码例子:
$str = "\x0\x1\x2\x3\x7\x8\x9\x10\x11\xff";
echo(strlen($str));
echo("\n");
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i}));
echo("\n");
输出结果:
----------------------
10
0 1 2 3 7 8 9 16 17 255
(字节数 : 5045)
可以用下面的代码测试,在文本框中输入“汉字”,在浏览器选择不同的当前字符集,然后提交,可以看到:
当选择字符集是“UTF-8”时,提交后输出:
text 230,177,137,229,173,151,
当字符集选择gb2312时,提交后输出:
text
186,186,215,214,
下面是测试代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> </title>
</head><body>
<pre>
<?php
if(count($_POST))
{
foreach($_POST as $key=>$item)
{
echo($key."\n");
for($i = 0 ; $i<strlen($item); $i++)
echo(ord($item{$i}).",");
echo("\n");
}
}
?>
</pre>
<form method="post" action="">
<input type="text" name="text">
<input type="submit" value="提交">
</form>
</body>
</html>
(字节数 : 1845)
最近对个人知识管理很感兴趣,有很多关于知识管理的想法。
首先想到的当然是blog,但是我感觉blog操作不够简便,而且写blog时有种“写文章”的感觉,也许我不是真正的blogger.
网摘,嗯,也算是知识管理的工具。现在的eyou网摘和365Key、delicious等都提供了插件,可以很方便的增加网摘。tag让我和别人共享网摘,这种社会化的交流功能也非常好。但是对于“个人知识管理”来讲,tag这种平行的组织形式还是不太合适。因为个人知识管理需要的是一种树或者图的形式,所以tag方式不是很利于个人对自己的知识进行组织。当然,delicious提供了tag分类功能,这种状况在一定程度上得到了改善。
还有个喜讯是,这个网站(http://maps.pietrosperoni.it)为delicious用户提供了从tag到思维导图(MindMap)的转换,功能还不错,好像是使用了FreeMind的文件格式和技术。使用思维导图组织用户的tag和书签,效果非常不错。
网摘功能局限于收藏,而收藏的链接容易失效,而且网页内容可能冗余信息太多。360doc是一种新的形式,它的插件可以让用户在浏览网页时,把感兴趣的文字选中然后加入到自己的“个人图书馆”中。360doc的名字就是“个人图书馆”,宣称它是“link+blog”,嗯,在知识管理的角度是一种进步。
当然,360doc的信息也是以tag组织,个人感觉它的社会化功能还是占的比重大一些。不过它在信息检索上有技术特色,比如“以文找文”功能,再比如自动获取文章内容的摘要信息。当然这种语义技术难度很大,效果看起来比起百度和google的自动摘要功能来要弱一些。
总结一下上面的blog、link、个人图书馆等产品,作为知识管理他们的强项都在于记录、收藏、共享,但是使用tag组织个人知识,缺少表现力,知识在头脑中应该是一张巨大的地图,而不是一系列平行的关键字。
所以我想到了思维导图。
(字节数 : 1495)
Web 2.0 Checklist
| Give us your email address, we'll let you know when it's ready! | |
| Public | |
| Tags | |
| Feeds for everything | |
| Built with Rails | |
| Sprinkled with Ajax | |
| Yellow fade | |
| Blue gradients | |
| Big icons | |
| Big fonts | |
| Big input boxes | |
| REST API | |
| Google Maps mashup | |
| Share with a friend | |
| TypePad blog for a peek inside the team | |
| Feature screencasts (thanks, Waxy!) | |
| Hackathons for new features | |
| Development wiki | |
| Business model optimized for the long tail | |
| It's Free!/AdSense revenue stream |
(字节数 : 3770)
刚刚读了PhpMore Vol 6里面的文章《什么是Web 2.0 ——下一代软件的设计模式和商业模式》(Tim O'Reilly /文 SeeSunshine/译)让人受益匪浅,现摘录一段和开发人员密切相关的一段:
|
Web 2.0 的设计模式 在“模式语言”(A Pattern Language)一书中,克里斯多夫·亚历山大(Christopher Alexander)为精炼描述对于体系结构问题的解决方案,开了一种格式上的处方。他写道:“每个模式都描述着一种在我们的环境中一遍又一遍地出现的问题,并因此描述了对该问题的核心解决方案。以此方式你可以使用该方案上百万次,而从不需要重复作同样的事。” 1. 长尾 小型网站构成了互联网内容的大部分内容;细分市场构成了互联网的大部分可能的应用程序。所以,利用客户的自服务和算法上的数据管理来延伸到整个互联网,到达边缘而不仅仅是中心,到达长尾而不仅仅是头部。 2. 数据是下一个Intel Inside 应用程序越来越多地由数据驱动。因此:为获得竞争优势,应设法拥有一个独特的,难于再造的数据资源。 3. 用户增添价值 对互联网程序来说,竞争优势的关键在于,用户多大程度上会在你提供的数据中,添加他们自己的数据。 因而,不要将你的“参与的体系”局限于软件开发。要让你的用户们隐式和显式地为你的程序增添价值。 4. 默认的网络效应 只有很小一部分用户会不嫌麻烦地为你的程序增添价值。因此:要将默认设置得使聚合用户的数据,成为用户使用程序的副产品。 5. 一些权力保留 知识产权保护限制了重用也阻碍了实验。因而,在好处来自于集体智慧而不是私有约束的时候,应确认采用的门槛要低。遵循现存准则,并以尽可能少的限制来授权。设计程序使之具备可编程性和可混合性。 6. 永远的测试版 当设备和程序连接到互联网时,程序已经不是软件作品了,它们是正在展开的服务。因此,不要将各种新特性都打包到集大成的发布版本中,而应作为普通用户体验的一部分来经常添加这些特性。吸引你的用户来充当实时的测试者,并且记录这些服务以便了解人们是如何使用这些新特性的。 7. 合作,而非控制 Web 2.0 的程序是建立在合作性的数据服务网络之上的。因此:提供网络服务界面和内容聚合,并重用其他人的数据服务。支持允许松散结合系统的轻量型编程模型。 8. 软件超越单一设备 PC 不再是互联网应用程序的唯一访问设备,而且局限于单一设备的程序的价值小于那些相连接的程序。因此:从一开始就设计你的应用程序,使其集成跨越手持设备,PC 机,和互联网服务器的多种服务。 |
我发现大家越来越聪明了,从文章的所述的历史来看,总是点点滴滴的透露出人类如何试图使用互联网更加方便沟通的智慧。
php more杂志也越来越聪明了,以前我看过一两期,现在这期有招聘广告了。
macromedia也越来越聪明了,我看到php more 杂志还有在线版,这个在线版很有意思,虽然是flash文件,但是数据来源却是PDF文档,速度非常快,效果也很好。仔细一看,原来是macromedia提供的一个工具--flashpaper,很新鲜,很有意思。
(字节数 : 2446)
XmlHTTPRequest组件有这样的行为:
1)和服务器会话时,它直接将用户现有的cookie信息加入到会话的http header中。
2)如果服务器发生了跳转,例如服务器返回如下信息:
|
HTTP/1.1 302 Found Date: Thu, Server: Apache/1.3.33 (Unix) PHP/4.4.0 mod_ssl/2.8.24 OpenSSL/0.9.7e X-Powered-By: PHP/4.4.0 Location: testpost.php |
那么XmlHTTPRequest的行为将依赖用户浏览器。一般来说XmlHTTPRequest不能得到这个消息头,也不能得到http 302的状态码,而是直接继续访问跳转页面Location: testpost.php,如果访问成功,直接返回http状态码200,并读取得到此页面的文本输出。
Ie中没有相关配置,只会进行上述行为。
Opera中有“是否允许自动重定向”设置。如果用户不允许自动重定向则xmlHTTPRequest能接收到302信息,xmlHttpRequest不会继续跳转。
Firefox中有一个选项network.http.redirection-limit(20),这个选项是用户所允许的重定向次数。如果设置成0,那么很遗憾,XmlHTTPRequest接收不到任何信息。
『演示代码』
|
var x = sajax_init_object(); x.open("GET","testjump.php",true); function _callback() { if (x.readyState != 4)return; sajax_debug("<pre>received " + x.responseText +"\nstatus:" +x.status+"</pre>"); alert("调用结束"); } if ("[XMLHttpRequest]"==x.constructor){ x.onload = _callback ;} else{ x.onreadystatechange = _callback ;} x.send(""); |
所以我们可以得出结论:
1)在dhtml的环境里,ajax的身份验证和用户浏览器是等同的,ajax依赖的XmlHTTPRequest和服务器的会话http header会自动包含浏览器中的cookie.
所以从传统网站过渡到ajax,在用户身份验证上不必花费太大力气。
2)另外,XmlHTTPRequest组件更像浏览器提供给用户的一个组件,而不像一个纯粹的socket组件,它包装了一些行为,例如上面提到的它将用户cookie自动加入http header到请求信息中,再如刚才提到的它自动读取服务器uri发生跳转以后的页面。
结论:在使用ajax做web应用的时候,基本上和传统web程序身份验证方式相同。只是不能使用自动重定向的方法让没有cookie的用户跳转到登录页面。比较好的方案是使用错误处理的方式,当用户还没有登录时向客户端返回一个错误码,客户端js分析错误码进行跳转。
SOAP的用户身份验证:
我见过的SOAP身份验证有两种,一种是每次请求时,将用户名和密码放到http的header中,这是HTTP标准协议中对于http header的应用,当然,这是明文的,如果需要加密的话,只能使用ssl,而每次请求都使用ssl显然会影响速度。另一种是使用session,例如MS DotNet WebService有它的session机制 。但是如果用php实现这些,恐怕要花费很大精力。
结论:ajax的服务端更像一个简单的rpc,虽然和soap有些类似,但是实现一个支持ajax的服务端是很简单的,但是要实现soap就复杂的多了。
但是从业务逻辑的观点来看,ajax的服务端可以做到和soap的服务端类似,成为一种专门提供业务逻辑操作的远程调用接口。
(字节数 : 9411)