昨日, 有朋友在PHP探讨群内提及, 他做的一个新项目因为MySQL查寻回到的結果过多(达十万条), 进而造成PHP存储空间不足用. 因此, 他问, 在实行下边的编码解析xml回到的MySQL結果以前, 数据信息是不是早已在运行内存中了? -
自然, 这类难题有很多优化的方式 . 但是, 就这个难题而言, 我最先想起, MySQL是經典的C/S(Client/Server, 手机客户端/网络服务器)实体模型, 在解析xml結果集以前, 最底层的完成很有可能早已把全部的数据信息根据互联网(假定应用TCP/IP)读来到Client的缓冲区域, 也是有另一种很有可能, 便是数据信息仍在Server端发送缓冲区里, 并沒有发送给Client.
在查询PHP和MySQL的源代码以前, 我注意到PHP指南里有两个作用相仿的涵数:
2个涵数的字面意思和表明确认了我的想法, 前一个涵数实行时, 会把全部的結果集从Server端读完Client端缓冲区域中, 然后一个则沒有, 这就是”unbuffered(未缓存)”的含意.
那就是说, 假如用mysql_unbuffered_query()实行了一条回到很多結果集的SQL句子, 在解析xml結果以前, PHP的运行内存是沒有被結果集占有的. 而用mysql_query()来实行一样的句子得话, 涵数回到时, PHP的内存占用便会大幅度提升, 马上耗完运行内存.
假如阅读文章PHP的有关编码, 能够见到这两个涵数的完成上的不同点:
2个涵数都启用了php_mysql_do_query(), 只差了第2个主要参数的不一样, MYSQL_STORE_RESULT和MYSQL_USE_RESULT. 再看php_mysql_do_query()的完成:
mysql_use_result()和mysql_store_result()是MySQL的C API函数, 这两个C API函数的差别便是后面一种把結果集从MySQL Server端所有载入来到Client端, 前面一种仅仅载入了結果集的元信息内容.
返回PHP, 应用mysql_unbuffered_query(), 能够防止运行内存的马上占有. 假如在解析xml的全过程不对結果开展”PHP缓存文件”(如放进某数字能量数组中), 则全部实行全过程尽管实际操作了十万条或是百万条或是大量的数据信息, 但PHP占有的运行内存自始至终是十分小的.
标识:北京市网站制作 高档网站建设
留下联系方式,我们将会在一个工作日内与你联系