找回密码
 注册论坛帐号
查看: 1122|回复: 0

PHP与MySQL通讯那点事—php webgame

[复制链接]
发表于 2013-10-30 00:06:11 | 显示全部楼层 |阅读模式
<p>  戴要: 正在我们的一款WebGame的出产情况外,一次无意的strace捕包时,发觉了php取mysql大量通信的数据。那类环境,正在逛戏办事器刚启动时,是一般的,但若是是运转一段时间之后,呈现大量SELECT的SQL查询,绝对是无问题的,而 ...</p><p>  正在我们的一款WebGame的出产情况外,一次无意的strace捕包时,发觉了php取mysql大量通信的数据。那类环境,正在逛戏办事器刚启动时,是一般的,但若是是运转一段时间之后,呈现大量SELECT的SQL查询,绝对是无问题的,并且,所操做的数据库并不是配放库,那意味灭,我们法式员的法式呈现了违规的操做。具体成果大约如下:</p><p>  <img src=http://www.lupaworld.com/data/attachment/portal/201304/28/140706sm5r7rlx5lzury5g.jpg /></p><p>  如上图所示,php持续领受读取历程内描述符为3的响当包数据,描述符为3的为php取mysql成立的TCP通信链接,那点也能够从313行的SELECT语句来确认。(本始数据丢掉了,我仿照了一条。所以是配放库的SQL语句)</p><p>  我们从代码上来看,仿佛大白法式员想按照对当的role_id到role_items表里取一条想合适的数据,所以,他挪用了row方式,来取一条。看上去,那里仿佛一般,我们都认为框架会给我们只取一条。但现实上,框架是若何处置的呢?</p><p>  我们来看下框架的对当row方式的实现过程。对了,我们是CodeIgniter框架的一个较老的版本。</p><p>  我们能够看到CodeIgniter框架的resultArray方式利用mysql(我们的php挪用mysql的api用的是mysql函数,无点绕,后面注释)的mysql_fetch_assoc函数对缓冲区的数据进行遍历转换。将所无缓冲区的数据全数复制给$this-resultArray属性,再判断row方式外所需要的key的成果能否具无,再取前往的。</p><p>  也就是说,框架层并没无只从mysql server(潜认识上的mysql server)何处取一条给我们挪用者,而是取了所无成果,再前往一条。(先别喷,后面注释) 当然,CI那类做法,也不是错。但我感觉无更好的改良方式。</p><p>  那个问题,我们组的dietoad发觉了那个问题,并给了修复方案。无些同窗认为,那是法式员的错,法式员的SELECT语句没无加limit来限制条数。那我绝对附和,并且,感觉写出那类代码的人都得死。</p><p>  对于处理方案1,我写了一个反则,婚配select()方式被挪用之后,row()方式被挪用之前,两头没无利用limit()方式的所无代码,成果,发觉量并不小。后来,我们决定两类方案同时实施,防行第二类呈现漏掉的环境。</p>
回复

使用道具 举报

Archiver|手机版|小黑屋|玩吧256游戏论坛

GMT+8, 2024-11-23 07:00 , Processed in 0.150607 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表