写个简单的php,连接mysql数据库查一行记录并打印,用ab做压力测试,每秒可以完成800多次.
随便include_once一个文件,文件大小为5K,里面全是函数定义,效率马上降低为原来的1/3,变成每秒240次.太郁闷了.
是否PHP每次include都会到磁盘上读一次文件,文件io损耗简直比mysql查询还大.
有没有什么办法提高效率?谢谢!

解决方案 »

  1.   

    用get_include_files看了一下,一个典型业务流的脚本include 了7个其他文件,都是一些公用的库文件,提供一些class或function以及常量.
    除非将所有代码写在一个脚本里,否则这几个文件都是要include的.把这些文件都include之后,即使不走业务流, 服务器的tps也只有190左右.
    我感觉非常的意外.
      

  2.   

    你说的没错,include 以及 require 都是一种特殊的结构,它们不仅仅要涉及磁盘IO操作,更要将读入的内容“执行”一次以供使用,因此效率显然不会很好。
      

  3.   

    忘了说一点,在使用模板技术的时候,显然用其他方式(file_get_contents、file、readfile)会比使用 include、require 效率要高不少。你可以参考这篇文章:
    http://www.raditha.com/wiki/Readfile_vs_include
      

  4.   

    我看了这篇文章.感觉真的很意外,原来include的效率确实是有问题.
    那么,在使用公共代码,必须include的场合下,怎么办呢
    难道把所有的代码都写到一个脚本里才是php的好做法?面向对象,代码重用怎么办呢
      

  5.   

    include是必然的。当然那些为了赶工的包含文件,最好还是斟酌着用。看重效率的话,数据库的查询语句多斟酌一下即可。当然,也可以这么做:开发时,尽管用include,等开发完以后,用批量替换工具把所有文件中include的那行全部替换为内容来解决问题。虽然麻烦一点,但是实际上费不了多少时间,顶多多花10分钟。
      

  6.   

    开发时,尽管用include,等开发完以后,用批量替换工具把所有文件中include的那行全部替换为内容来解决问题。-------------------------------------------------------
     楼上的试过吗? 做过测试? 效率有很大提高? 怀疑中...
      

  7.   

    仅就问题而论,没有实践。
        
     只是用其他方法避开include和require的使用,那么其所产生的低效率问题自然也就不存在。我的建议通常也就提供个参考思路,楼主不妨一试。-----我通常更多从解决方案入手,而不是从细节入手,因为技术不好,咳咳~~
      

  8.   

    呵,楼上方法不实用,假如一个include有include(特别用了include_once)也就是多次欠套的include你的自动生成就不行了!
      

  9.   

    include 必然是要产生效率损耗的
    include 是必要的
    你可把include的文件放在ram盘中来中和矛盾
      

  10.   

    这个问题我早就考虑过了,尤其是在现在流行的各种框架里面,INCLUDE的文件数量惊人。我一直在想为什么对于INCLUDE函数没有缓存机制?
      

  11.   

    我也想知道更好的替代机制出现. 最好是能重写一下include和require这两个函数
      

  12.   

    include所作处理比一般的文件操作(file_get_contents、file、readfile)要多得多,自然不能比.include和require是用来包含可执行php文件的,这个是其它函数目前都无法替换的.而且不认为重写能有大的改变,因为对php要进行语法分析和执行,
    这个所谓的效率问题,不如说是php本身的问题和解释语言的效率问题.用缓存和编译肯定会有改善,php里本身也有这方面的解决方案,zend和apc都是,你不如试用一下
      

  13.   

    我觉得替换的方法可能还是可行的。
    include_once的情况完全可以在写的时候加行注解。替换的时候以注解为标识,根据注解的不同来替换include_once。未注解的则替换为空。----
    或者,尽量少用_once。有用到的时候可以少量采取上面的方法。虽然稍微麻烦
    真为效率考虑的话,还是可行的。
      

  14.   

    那究竟应该怎么办?我的项目里有大量的include
      

  15.   

    各位,我使用了apc,总体效率提高了3倍以上.一般请求(包含一次数据库查询),没有apc的时候request per second只有70左右,用了apc立刻达到了240.虽然比纯粹的mysql api调用没有任何include还是低很多,但考虑到我这里面又有include,又有日志,又有class创建等可能消耗的地方,所以这个结果我还是比较满意的.
    除此之外,小文件的include,以及动态include确实是必要的