论坛首页 编程语言技术论坛

PHP框架的繁荣是正确的发展方向吗?

浏览 247034 次
该帖已经被评为精华帖
作者 正文
   发表时间:2009-02-04  
看了各位高手帖子,很受益。

不过,还是希望少一些口水战,多把精力放到服务好自己的用户上,多把精力放到自己的产品上,呵呵。
0 请登录后投票
   发表时间: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框架时性能比上列出的框架性能要低下一大截呢?

请教
0 请登录后投票
   发表时间:2009-02-04  
还有,我觉得 Kohana 框架还是很不错的,大家还是应该详细了解后再发表评论,呵呵。
0 请登录后投票
   发表时间:2009-02-04   最后修改:2009-02-04
编辑掉,玩笑开过头了
0 请登录后投票
   发表时间: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 的性能还有很大提高。

不过我觉得如果要测试,最好是两个平台都写一个功能上基本一致的小应用,然后在具有不同数据量的情况下来测试。当然这个工作量就很大了,而且要求熟悉不同平台,要不然测试结果也不科学。
0 请登录后投票
   发表时间: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 不能胜任核心任务,但是在快速开辟新业务方面有明显的优势。
0 请登录后投票
   发表时间:2009-02-04   最后修改:2009-02-04
dualface 写道
不出所料,楼上又出来打广告了。。。。。。

廖老大,您这么说话就过分了,Kohana 也不是我做的,跟我没有任何利益冲突,这也叫做打广告?希望您能放平和的心态。

您一直在推销自己做的框架,难道不是广告?
0 请登录后投票
   发表时间:2009-02-04  
呵呵,对不起,开玩笑过分了点。以后一定注意。
0 请登录后投票
   发表时间:2009-02-04  
dualface 写道
呵呵,对不起,开玩笑过分了点。以后一定注意。

呵呵,是玩笑就好,大家以后都少开会产生误会的玩笑。。
0 请登录后投票
   发表时间:2009-02-04  
居然还纠结在性能上......真是无趣
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics