手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

Yii的AR效率释疑

关于yii的AR效率,其实一直以来都有很多的想法,试想,如果不做metadata的缓存,每次查询前,都必须先做一下metadata的查询,效率也不会太高到哪里吧?
所以,看到官方有人在问就关注了一下:http://www.yiiframework.com/forum/index.php/topic/16597-yii%E7%9A%84ar%E7%9C%9F%E7%9A%84%E8%83%BD%E7%94%A8%E4%B9%88%EF%BC%9F/

有人提问:

XML/HTML代码
  1. 我在首页会很多个ar的请求。热门文章、最新文章、编辑推荐、最新评论的文章。。。。  
  2.   
  3. 我把这些通过 model()->findAll()的结果放在一个数组里。  
  4.   
  5. 然后把这个数组var_dump了一下,这些数据高达1.06M。这是不是太耗内存了?  
  6.   
  7. 页面上全是密密麻麻的数据表结构,如果关联关系复杂点的,会更多。  
  8.   
  9. 我光var_dump(yii::app()->db) 就有5000多行的数据。  
  10.   
  11.   
  12. 这样的db操作这么耗内存,敢用么?谁能消除我这个担心?多谢  
  13.   
  14. AcitveRecord ,只能玩一玩开拓眼界. 真要生产环境用, 就不行!   

然后,Qiang就回复了:

XML/HTML代码
  1. 你的结论有点想当然了。建议你仔细做profiling来验证。事实上,AR已经被成功应用在若干大流量的网站上了。  
  2.   
  3. 你不能用var_dump()来估计AR的内存开销。var_dump会把所有被reference到的对象都dump出来,包括application,以及所有的application component,因为它们都被AR间接reference到了。  
  4.   
  5. AR额外的内存开销是存储10个左右变量的开销。如果按20字节来估算,额外的开销是200字节,这样在1000个AR对象情况下,额外的内存开销为200KB。这个对几乎所有的web应用而言应该不是问题。  
  6.   
  7. 如果你需要装载更多的数据,建议你使用DAO。  
  8.   
  9. 另外,对于任何大流量的web应用而言,cache都是必须的。cache可以帮助解决绝大多数的性能瓶颈。   

cache在DB中有一些处理的,比如那个duration,在db中查询就可以做一下缓存了。然后metadata再做一下缓存,不也挺好?

Tags: yii

Yii Behavior的简单用法

Yii的behavior用起来是十分方便的,官方的文档也很多,我不多嘴一一解释,我只说一些简单的用法
如果你看过PHP5.4,你应该知道5.4多了个新功能traits。
那你可以对着手册看了,你就当yii的behavior就是5.4的traits。

在任何基于CComponents类扩展的类里,都可以用attachBehavior来附加一个行为,这就象5.4的在类里面 use traits类一样
附加行为后,直接可以$this->行为中的方法,嗯,这个与traits也一样。
好吧,来个简单的例子:

PHP traits
  1. <?php  
  2. class Base {  
  3.     public function sayHello() {  
  4.         echo 'Hello ';  
  5.     }  
  6. }  
  7.   
  8. trait SayWorld {  
  9.     public function sayHello() {  
  10.         parent::sayHello();  
  11.         echo 'World!';  
  12.     }  
  13. }  
  14.   
  15. class MyHelloWorld extends Base {  
  16.     use SayWorld;  
  17. }  
  18.   
  19. $o = new MyHelloWorld();  
  20. $o->sayHello();  
  21. ?>  

Yii的用法:

PHP代码
  1. <?php  
  2. class xxx extends CBehavior  
  3. {  
  4.     public function show(){  
  5.         echo "show";  
  6.     }  
  7. }  
  8.   
  9. class test extends CComponents  
  10. {  
  11.     public function hello(){  
  12.         $this->attachBehavior('唯一标记符',"xxx");  
  13.         $this->show();  
  14.     }  
  15. }  

看看,是不是用法一样?不过这样也带来一个问题。。。TMD,没法在IDE里面自动识别了。

好吧,只能这样折腾自己了。。忍忍。

Tags: yii, behavior

php freetds 处理sqlserver大字段的问题

freetds连接sqlserver是没问题,在连接的时候dsn用的是dblib,而不是mssql。
连接和普通的查询都没有问题,但一旦涉及到大字段,你就会发现问题多多了。比如你的字段类型是nvarchar(max),你在处理的时候你会发现,返回结果都是空。
我晶啊。看来php连接sqlserver还是用windows自己的方案吧:sqlsrv这个组件,但它只能在windows下面使用。

太纠结了

Tags: freetds, sqlserver, 大字段

APC支持php5.4了

时隔一年多,APC终于又更新了,这次更新最大的就是支持PHP5.4:
- Add PHP 5.4 support (Dmitry, Anatoliy, Pierre)
- Fixed bug #22679: Fix apc_bin_dump for constants. Use IS_CONSTANT_TYPE_MASK to handle all the constants, including the unqalified ones (instead of ~IS_CONSTANT_INDEX check)
- Fixed bug #23822, php crashes on apache restart

下载地址在这里:
http://pecl.php.net/package/APC

配置完后还得加入这些信息:

XML/HTML代码
  1. ; alternative php cache 用于缓存和优化php中间代码  
  2.   
  3. apc.cache_by_default = on  
  4. ;sys  
  5. ; 是否默认对所有文件启用缓冲。  
  6. ; 若设为off并与以加号开头的apc.filters指令一起用,则文件仅在匹配过滤器时才被缓存。  
  7.   
  8. apc.enable_cli = off  
  9. ;sys  
  10. ; 是否为cli版本启用apc功能,仅用于测试和调试目的才打开此指令。  
  11.   
  12. apc.enabled = on  
  13. ; 是否启用apc,如果apc被静态编译进php又想禁用它,这是唯一的办法。  
  14.   
  15. apc.file_update_protection = 2  
  16. ;sys  
  17. ; 当你在一个运行中的服务器上修改文件时,你应当执行原子操作。  
  18. ; 也就是先写进一个临时文件,然后将该文件重命名(mv)到最终的名字。  
  19. ; 文本编辑器以及 cp, tar 等程序却并不是这样操作的,从而导致有可能缓冲了残缺的文件。  
  20. ; 默认值 2 表示在访问文件时如果发现修改时间距离访问时间小于 2 秒则不做缓冲。  
  21. ; 那个不幸的访问者可能得到残缺的内容,但是这种坏影响却不会通过缓存扩大化。  
  22. ; 如果你能确保所有的更新操作都是原子操作,那么可以用 0 关闭此特性。  
  23. ; 如果你的系统由于大量的io操作导致更新缓慢,你就需要增大此值。  
  24.   
  25. apc.filters =  
  26. ;sys  
  27. ; 一个以逗号分隔的posix扩展正则表达式列表。  
  28. ; 如果源文件名与任意一个模式匹配,则该文件不被缓存。  
  29. ; 注意,用来匹配的文件名是传递给include/require的文件名,而不是绝对路径。  
  30. ; 如果正则表达式的第一个字符是"+"则意味着任何匹配表达式的文件会被缓存,  
  31. ; 如果第一个字符是"-"则任何匹配项都不会被缓存。"-"是默认值,可以省略掉。  
  32.   
  33. apc.ttl = 0  
  34. ;sys  
  35. ; 缓存条目在缓冲区中允许逗留的秒数。0 表示永不超时。建议值为7200~36000。  
  36. ; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。  
  37.   
  38. apc.user_ttl = 0  
  39. ;sys  
  40. ; 类似于apc.ttl,只是针对每个用户而言,建议值为7200~36000。  
  41. ; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。  
  42.   
  43. apc.gc_ttl = 3600  
  44. ;sys  
  45. ; 缓存条目在垃圾回收表中能够存在的秒数。  
  46. ; 此值提供了一个安全措施,即使一个服务器进程在执行缓存的源文件时崩溃,  
  47. ; 而且该源文件已经被修改,为旧版本分配的内存也不会被回收,直到达到此ttl值为止。  
  48. ; 设为零将禁用此特性。  
  49.   
  50. apc.include_once_override = off  
  51. ;sys  
  52. ; 关于该指令目前尚无说明文档,参见:http://pecl.php.net/bugs/bug.php?id=8754  
  53. ; 请保持为off,否则可能导致意想不到的结果。  
  54.   
  55. apc.max_file_size = 1m  
  56. ;sys  
  57. ; 禁止大于此尺寸的文件被缓存。  
  58.   
  59. apc.mmap_file_mask =  
  60. ;sys  
  61. ; 如果使用–enable-mmap(默认启用)为apc编译了mmap支持,  
  62. ; 这里的值就是传递给mmap模块的mktemp风格的文件掩码(建议值为"/tmp/apc.xxxxxx")。  
  63. ; 该掩码用于决定内存映射区域是否要被file-backed或者shared memory backed。  
  64. ; 对于直接的file-backed内存映射,要设置成"/tmp/apc.xxxxxx"的样子(恰好6个x)。  
  65. ; 要使用posix风格的shm_open/mmap就需要设置成"/apc.shm.xxxxxx"的样子。  
  66. ; 你还可以设为"/dev/zero"来为匿名映射的内存使用内核的"/dev/zero"接口。  
  67. ; 不定义此指令则表示强制使用匿名映射。  
  68.   
  69. apc.num_files_hint = 1000  
  70. ;sys  
  71. ; web服务器上可能被包含或被请求的不同源文件的大致数量(建议值为1024~4096)。  
  72. ; 如果你不能确定,则设为 0 ;此设定主要用于拥有数千个源文件的站点。  
  73.   
  74. apc.optimization = 0  
  75. ; 优化级别(建议值为 0 ) 。  
  76. ; 正整数值表示启用优化器,值越高则使用越激进的优化。  
  77. ; 更高的值可能有非常有限的速度提升,但目前尚在试验中。  
  78.   
  79. apc.report_autofilter = off  
  80. ;sys  
  81. ; 是否记录所有由于early/late binding原因而自动未被缓存的脚本。  
  82.   
  83. apc.shm_segments = 1  
  84. ;sys  
  85. ; 为编译器缓冲区分配的共享内存块数量(建议值为1)。  
  86. ; 如果apc耗尽了共享内存,并且已将apc.shm_size指令设为系统允许的最大值,  
  87. ; 你可以尝试增大此值。  
  88.   
  89. apc.shm_size = 30  
  90. ;sys  
  91. ; 每个共享内存块的大小(以mb为单位,建议值为128~256)。  
  92. ; 有些系统(包括大多数bsd变种)默认的共享内存块大小非常少。  
  93.   
  94. apc.slam_defense = 0  
  95. ;sys(反对使用该指令,建议该用apc.write_lock指令)  
  96. ; 在非常繁忙的服务器上,无论是启动服务还是修改文件,  
  97. ; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。  
  98. ; 这个指令用于设置进程在处理未被缓存的文件时跳过缓存步骤的百分率。  
  99. ; 比如设为75表示在遇到未被缓存的文件时有75%的概率不进行缓存,从而减少碰撞几率。  
  100. ; 鼓励设为 0 来禁用这个特性。  
  101.   
  102. apc.stat = on  
  103. ;sys  
  104. ; 是否启用脚本更新检查。  
  105. ; 改变这个指令值要非常小心。  
  106. ; 默认值 on 表示apc在每次请求脚本时都检查脚本是否被更新,  
  107. ; 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。  
  108. ; 如果设为 off 则表示不进行检查,从而使性能得到大幅提高。  
  109. ; 但是为了使更新的内容生效,你必须重启web服务器。  
  110. ; 这个指令对于include/require的文件同样有效。但是需要注意的是,  
  111. ; 如果你使用的是相对路径,apc就必须在每一次include/require时都进行检查以定位文件。  
  112. ; 而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作。  
  113.   
  114. apc.user_entries_hint = 100  
  115. ;sys  
  116. ; 类似于num_files_hint指令,只是针对每个不同用户而言。  
  117. ; 如果你不能确定,则设为 0 。  
  118.   
  119. apc.write_lock = on  
  120. ;sys  
  121. ; 是否启用写入锁。  
  122. ; 在非常繁忙的服务器上,无论是启动服务还是修改文件,  
  123. ; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。  
  124. ; 启用该指令可以避免竞争条件的出现。  
  125.   
  126. apc.rfc1867 = off  
  127. ;sys  
  128. ; 打开该指令后,对于每个恰好在file字段之前含有apc_upload_progress字段的上传文件,  
  129. ; apc都将自动创建一个upload_的用户缓存条目(就是apc_upload_progress字段值)。  

这样就差不多OK了

Tags: php, apc, eacceraltra, xcache

删除多行注释的正则

一个小正则,可以删除 多行注释:/\*[\S\s]+?(?=\*/)\*/

很简单,就这么一个正则,自己做一个备份。

Tags: 正则