怎样策划一个营销型网站,重庆网站seo好不好,免费域名注册 国外,搜索引擎营销方法web开发中如果遇到php查询mysql返回大量数据导致内存溢出、或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况#xff1f; 答案是: mysql_query 和 mysql_unbuffered_query 两个函数 首先来分析一个典型的实例:…web开发中如果遇到php查询mysql返回大量数据导致内存溢出、或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况 答案是: mysql_query 和 mysql_unbuffered_query 两个函数 首先来分析一个典型的实例:在执行下面的代码的时候就会导致php请求mysql返回结果太多(10W以上)导致PHP内存不够用。 while $row mysql_fetch_assoc$result { // … } 对于上面的问题来讲,首先要从mysql的原理上来分析 MySQL是经典的C/SClient/Server 客户端/服务器模型 在遍历结果集之前 底层的实现可能已经把所有的数据通过网络假设使用TCP/IP读到了Client的缓冲区 也有另一种可能 就是数据还在Server端的发送缓冲区里 并没有传给Client。 通过查看php和mysql的源码中发现两个相似的mysql函数mysql_query() 和mysql_unbuffered_query(), 发现前一个函数执行时 会把所有的结果集从Server端读到Client端的缓冲区中 而后一个则没有 这就是“unbuffered未缓冲”的意思。也就是说 如果用mysql_unbuffered_query() 执行了一条返回大量结果集的SQL语句 在遍历结果之前 PHP的内存是没有被结果集占用的。 而用mysql_query() 来执行同样的语句的话 函数返回时 PHP的内存占用便会急剧增加 立即耗光内存。PHP_FUNCTIONmysql_query{ php_mysql_do_queryINTERNAL_FUNCTION_PARAM_PASSTHRU MYSQL_STORE_RESULT}PHP_FUNCTIONmysql_unbuffered_query{ php_mysql_do_queryINTERNAL_FUNCTION_PARAM_PASSTHRU MYSQL_USE_RESULT} 两个函数都调用了php_mysql_do_query 只差了第2个参数的不同 MYSQL_STORE_RESULT和MYSQL_USE_RESULT. 再看php_mysql_do_query的实现 ifuse_store MYSQL_USE_RESULT { mysql_resultmysql_use_resultmysql-conn} else{ mysql_resultmysql_store_resultmysql-conn} mysql_use_result和mysql_store_result是MySQL的C API函数 这两个C API函数的区别就是后者把结果集从MySQL Server端全部读取到了Client端 前者只是读取了结果集的元信息。 扯远了: 回到刚才的话题使用mysql_unbuffered_query(), 可以避免内存的立即占用, 如果返回的结果存放到array中也是完全没有问题的, 也不会出现php查询mysql数据量过大时导致内存溢出问题. 转载于:https://www.cnblogs.com/mako/p/4156978.html