PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

PHP错误:Allowed memory size of xxx bytes(一)

PHP中文网
PHP中文网 原创
2017-03-30 17:14:31 986浏览

在写PHP程序的时候,需要处理的数据比较大的时候经常会出现“Allowed memory size of  xxx bytes”这个问题,对这个问题一般也是去修改php.ini中的配置,那是一个很有效的方法,但是有没有其他的办法来解决这个问题,当然是有,在这里我会从数据库查询和读文件的两个常用的例子来说说这个问题的解决思路。

文章中我使用的机器配置并不算高,是ubuntu 14.04的系统。

现有代码是:

$sql = "select * from `user` order by `id`";
$conn = mysql_connect($host, $user, $pwd);
$db   = mysql_select_db($db_name);
$result = mysql_query($sql);
if ($result) {
    while ($row = mysql_fetch_assoc($result)) { 
       // 一些操作的代码    
    }
}

果不其然,在我特意配置的小内存运行环境下出现了“Allowed memory size of  xxx bytes” 的问题。

原文代码处理是将所有数据先读取数据进入内存,然后在进行处理,在数据超出配置的最大内存的时候,就出现了这个提示。

在php中这里有个说法,一个是缓存查询,就是我们上面这种,另外一种就是非缓存查询,思路和处理流文件的处理有些类似,只缓存需要处理的数据,这样虽然会增加一部分服务器的负载,但是在内存上会有些优化。

比如在上面的样例中,我使用memory_get_usage();函数获取的内存使用为18973784 byte。下面我会展示三种写法以及截取的他们内存的占用情况,这样的对比可能不是很准确,但是提供思路为主,抛砖引玉。

代码1:

$conn = mysql_connect($host, $user, $pwd);
$db   = mysql_select_db($db_name);
$result = mysql_unbuffered_query($sql);
if ($result) {
    while ($row = mysql_fetch_assoc($result)) {
            // 一些处理    
            }
    }

这个和样例的区别在于mysql_unbuffered_query这个函数,计算的内存占用为27392 byte。

代码2:

$pdo = new PDO("mysql:host={$host};dbname={$db_name}", "{$user}", "{$pwd}");
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$result = $pdo->query($sql);
if ($result) {
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) { 
       // 一些处理的代码    
    }
}

代码2使用了pdo,计算出来的内存占用为 33672 byte

代码3:

$mysqli  = new mysqli("{$host}", "{$user}", "{$pwd}", "{$db_name}");
$result = $mysqli->query("{$sql}", MYSQLI_USE_RESULT);
if ($result) {
    while ($row = $result->fetch_assoc()) {
           // 一些操作的代码    
           }
     }

代码3使用的mysqli,内存的占用是9008 byte

附:测试内存占用使用的方法

$start = memory_get_usage();
// 操作代码
$end =  memory_get_usage();
$used = $end - $limit;
echo $used;

 以上就是PHP错误:Allowed memory size of xxx bytes(一)的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。