该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-04
看了各位高手帖子,很受益。
不过,还是希望少一些口水战,多把精力放到服务好自己的用户上,多把精力放到自己的产品上,呵呵。 |
|
返回顶楼 | |
发表时间:2009-02-04
diogin 写道 zaqwe 写道 robbin 写道 如果PHP要实现跨请求的持有内存资源,这意味着PHP必须实现对象内存分配机制和垃圾收集器,而这将意味着PHP语言的复杂性上升,PHP内存泄露的危险大大增加,最终将得不偿失。 其实我们应该跳出编程语言的简单对比,而比较一下不同的编程模型背后的哲学: 1、Java - controll whole world模型 单进程运行,进程内部多线程调度,所有的资源都自己提供。 2、Ruby - controll process模型 多进程运行,进程内部可以持有资源,带有GC,部分依赖外部资源实现(例如Cache)功能 3、PHP - controll request模型 多进程运行,进程不持有任何资源,不带GC,完全依赖外部资源实现扩展功能 比较和探讨一下3种不同的模型,以及他们的优势,劣势,长处,短处,适合做什么,不适合做什么。这才是一个有意思的话题。 谢谢, 我一直在找PHP的线程模型方面的资料.今天看这个帖子才知道PHP的处理这么"省事". PHP 脚本里没有线程的概念,只有 PHP 解释器的实现有线程与否的概念。PHP 解释器通过 TSRM 层来实现对 PHP 脚本屏蔽线程。 另外,PHP 解释器未必使用多进程的运行方式。在 Apache 下,它还可以嵌入多线程方式的 httpd 子进程,以多线程的方式来运行,一个线程对应一个 HTTP 请求的处理。当然此时如果 PHP 解释器的部分代码没有做到线程安全,那可能就会出问题(据称 PHP 解释器的核心部分都是线程安全的,不过可能有些扩展代码的质量不高,存在线程不安全的问题)。 关于 PHP 部分,robbin的说法基本是错误的。PHP 解释器进程持有它需要的所有资源,它也带 GC。 PHP 解释器进程有两层面的 GC,一层是在请求结束时必须释放所有该次请求内申请的资源,并清扫该次环境;另一层是在请求执行内,它也存在 GC,这就是通常所说的 GC,比如变量的引用计数实现。 好! 1、PHP解释器和PHP脚本不是同一个概念; 2、PHP解释器拥有GC; 3、但是请问,如果PHP解释器的性能方面不存在问题,为何运行PHP框架时性能比上列出的框架性能要低下一大截呢? 请教 |
|
返回顶楼 | |
发表时间:2009-02-04
还有,我觉得 Kohana 框架还是很不错的,大家还是应该详细了解后再发表评论,呵呵。
|
|
返回顶楼 | |
发表时间:2009-02-04
最后修改:2009-02-04
编辑掉,玩笑开过头了
|
|
返回顶楼 | |
发表时间:2009-02-04
diogin 写道 硬件:
机器: ThinkPad T61p CPU : Core2 Duo T9300 2.5G 6M L2 RAM : 2G 软件: WindowsXP SP3 x86 Apache 2.2.11(KeepAlive=Off,ThreadsPerChild=150,MaxRequestsPerChild=0) PHP 5.2.6(mod_php + mod_rewrite,APC 为 3.1.0-dev) Python 2.5.4(mod_wsgi 2.3) Django 1.0.2 测试方法: ab -n 5000 -c 50 [url] 为使结果精确些,测试静态时把 PHP 和 Python 都去掉,测试 PHP 时把 Python 去掉,反之亦然。 测试结果: 0. 静态文件,一个 7K 的 jpg; 结果:[4050.63 reqs/sec] 1. PHP,单脚本文件,未加 APC,输出“hello, world”; 结果:[2782.61 reqs/sec] 2. PHP,单脚本文件,加 APC(apc.stat=On),输出“hello, world”; 结果:[2962.96 reqs/sec] 3. PHP,单脚本文件,加 APC(apc.stat=Off),输出“hello, world”; 结果:[2962.96 reqs/sec] 4. PHP,跑我自己写的简陋框架,未加 APC,输出“hello, world”; 结果:[ 307.99 reqs/sec] 5. PHP,跑我自己写的简陋框架,加 APC(apc.stat=On),输出“hello, world”; 结果:[1003.13 reqs/sec] 6. PHP,跑我自己写的简陋框架,加 APC(apc.stat=Off),输出“hello, world”; 结果:[1280.00 reqs/sec] 7. Python,单 WSGI 脚本文件,输出“hello, world”; 结果:[2560.00 reqs/sec] 8. Python,跑 Django,输出“hello, world”。 结果:[1939.39 reqs/sec] 结论: Django 的性能相当高,我自己写的简陋框架还得在性能方面多做努力。 有时间再测测其它框架。 嗯,python 的性能是非常不错的。不过从你的测试看,至少 php 还没慢到不可接受的程度。 可惜 zend.com 公司因为商业利益,一直不肯在 php 中内置 opcode cache,不然 php 的性能还有很大提高。 不过我觉得如果要测试,最好是两个平台都写一个功能上基本一致的小应用,然后在具有不同数据量的情况下来测试。当然这个工作量就很大了,而且要求熟悉不同平台,要不然测试结果也不科学。 |
|
返回顶楼 | |
发表时间:2009-02-04
lao__wang 写道 diogin 写道 PHP 框架不是问题。关键是要找到一条“建设有 PHP 特色的框架开发之路”,而不是“照搬资本主义”。社会体质的不同造成了中国与大部分欧美国家发展之路的差异,中国经历了几代领导人才找到真正的出路,这点跟 PHP 目前的情况类似:PHP 的实现本质上就跟 Python/Ruby 的实现不同。 运行机制上的例子,随便举几个吧:你可以用 Python 脚本操纵线程,可以实现跨请求存在的变量,实现真正的对象(进程内对象,而非请求内对象,PHP 的类实际上只是一个跟请求有着相同生命期的瞬态对象,PHP 的对象就更不用说了),实现真正的工作单元模式(严肃的 ORM 都需要这个),实现真正的对象池、连接池、线程池,实现真正的异步I/O、非阻塞I/O,等等等等,你可以想象一下你用 C 写 HTTP Server 时需要考虑哪些,你就可以用 Python 去实现。 写PHP好多年了,到底什么算是“有 PHP 特色的框架开发之路”,一直雾里看花: 在特殊的PHP运行机制背景下,采用传统的OOP思想创建框架,不时的被质疑。这是完美主义者的洁癖?还是滑向深渊的开始? 如果彻底的按照PHP特性去设计框架,基本会是一个“字符串+数组”的框架,不会是什么“对象”框架。 PHP框架开发一方面要经受传统OOP思想的诱惑,一方面又要顾及PHP本身的特性。 这样看来,或许PHP里引入OOP模型本质上就是错误的。 越考虑越像哲学问题了。 现在主要的质疑就是引入 OOP 以后的 PHP 是不是还能保持简单性和高性能。 对于简单性,我想随着应用复杂度和规模的增加,引入 OO 是必然要付出的代价,但是获得好处也很多。而且引入 OO 不等于就丧失简单性。许多 PHP 开发框架都简化了常见任务的实现,所以一个应用中大部分的功能都可以由初级开发人员完成。 至于高性能,我想现在各种脚本语言的发展都很快,对 PHP 社区也会带来相当的压力。有压力就有动力,PHP 出现大幅度的性能提升也不是不可能的。 而且 PHP 已经非常非常成熟了,不管是部署还是管理都是很容易的。再加上引入开发框架后降低的开发成本,各方面为企业节省的开支是很明显的。所以即便是国内的各大门户也都开始大量应用 PHP。虽然 PHP 不能胜任核心任务,但是在快速开辟新业务方面有明显的优势。 |
|
返回顶楼 | |
发表时间:2009-02-04
最后修改:2009-02-04
dualface 写道 不出所料,楼上又出来打广告了。。。。。。
廖老大,您这么说话就过分了,Kohana 也不是我做的,跟我没有任何利益冲突,这也叫做打广告?希望您能放平和的心态。 您一直在推销自己做的框架,难道不是广告? |
|
返回顶楼 | |
发表时间:2009-02-04
呵呵,对不起,开玩笑过分了点。以后一定注意。
|
|
返回顶楼 | |
发表时间:2009-02-04
dualface 写道 呵呵,对不起,开玩笑过分了点。以后一定注意。
呵呵,是玩笑就好,大家以后都少开会产生误会的玩笑。。 |
|
返回顶楼 | |
发表时间:2009-02-04
居然还纠结在性能上......真是无趣
|
|
返回顶楼 | |