27
18911184380
当前位置:首页 > 资讯 > 建站知识

PHP查询MySQL大量数据的内存占用分析

2011-10-22 酷站科技

PHP查寻MySQL很多数据信息的内存占用剖析

      本文关键是以基本原理, 指南和源代码剖析在PHP中查寻MySQL回到很多結果时, 内存占用的难题, 另外对应用MySQL C API也是有涉及到.

  昨日, 有朋友在PHP探讨群内提及, 他做的一个新项目因为MySQL查寻回到的結果过多(达十万条), 进而造成PHP存储空间不足用. 因此, 他问, 在实行下边的编码解析xml回到的MySQL結果以前, 数据信息是不是早已在运行内存中了? -

  1. while ($row = mysql_fetch_assoc($result)) { 
  2.     // ... 

  自然, 这类难题有很多优化的方式 . 但是, 就这个难题而言, 我最先想起, MySQL是經典的C/S(Client/Server, 手机客户端/网络服务器)实体模型, 在解析xml結果集以前, 最底层的完成很有可能早已把全部的数据信息根据互联网(假定应用TCP/IP)读来到Client的缓冲区域, 也是有另一种很有可能, 便是数据信息仍在Server端发送缓冲区里, 并沒有发送给Client.

  在查询PHP和MySQL的源代码以前, 我注意到PHP指南里有两个作用相仿的涵数:

  1. mysql_query() 
  2.  
  3. mysql_unbuffered_query() 

  2个涵数的字面意思和表明确认了我的想法, 前一个涵数实行时, 会把全部的結果集从Server端读完Client端缓冲区域中, 然后一个则沒有, 这就是”unbuffered(未缓存)”的含意.

  那就是说, 假如用mysql_unbuffered_query()实行了一条回到很多結果集的SQL句子, 在解析xml結果以前, PHP的运行内存是沒有被結果集占有的. 而用mysql_query()来实行一样的句子得话, 涵数回到时, PHP的内存占用便会大幅度提升, 马上耗完运行内存.

  假如阅读文章PHP的有关编码, 能够见到这两个涵数的完成上的不同点:

  1. /* {{{ proto resource mysql_query(string query [, int link_identifier]) 
  2.    Sends an SQL query to MySQL */ 
  3. PHP_FUNCTION(mysql_query) 
  4.     php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT); 
  5. /* }}} */ 
  6.  
  7. /* {{{ proto resource mysql_unbuffered_query(string query [, int link_identifier]) 
  8.    Sends an SQL query to MySQL, without fetching and buffering the result rows */ 
  9. PHP_FUNCTION(mysql_unbuffered_query) 
  10.     php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT); 
  11. /* }}} */ 

  2个涵数都启用了php_mysql_do_query(), 只差了第2个主要参数的不一样, MYSQL_STORE_RESULT和MYSQL_USE_RESULT. 再看php_mysql_do_query()的完成:

  1. if(use_store == MYSQL_USE_RESULT) { 
  2.     mysql_result=mysql_use_result(&mysql->conn); 
  3. else { 
  4.     mysql_result=mysql_store_result(&mysql->conn); 

  mysql_use_result()和mysql_store_result()是MySQL的C API函数, 这两个C API函数的差别便是后面一种把結果集从MySQL Server端所有载入来到Client端, 前面一种仅仅载入了結果集的元信息内容.

  返回PHP, 应用mysql_unbuffered_query(), 能够防止运行内存的马上占有. 假如在解析xml的全过程不对結果开展”PHP缓存文件”(如放进某数字能量数组中), 则全部实行全过程尽管实际操作了十万条或是百万条或是大量的数据信息, 但PHP占有的运行内存自始至终是十分小的.

标识:北京市网站制作 高档网站建设

来源于申明:以上内容一部分(包括照片、文本)来自互联网,若有侵权行为,请立即与本网站联络(010-57218159)。
如没特殊注明,文章均为酷站科技原创,转载请注明来自http://www.bjkuzhan.com/jianzhanzhishi/3909.html
联系专业的商务顾问,制定方案,专业设计,一对一咨询及其报价详情
服务热线服务热线 18911184380
联系我们 contact us
18911184380
18911184380 — 海淀营业部
18911184380— 昌平营业部
+

酷站科技为你提供上门/网站策略方案

留下联系方式,我们将会在一个工作日内与你联系

隐私条款信息保护中,请放心填写