Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP,mysql内存泄漏_Php_Mysql_Memory Leaks_Pdo_Mysqli - Fatal编程技术网

PHP,mysql内存泄漏

PHP,mysql内存泄漏,php,mysql,memory-leaks,pdo,mysqli,Php,Mysql,Memory Leaks,Pdo,Mysqli,面对一个问题,我在使用数据库时找不到内存泄漏。该脚本从数据库获取大量数据,因此内存泄漏非常严重。使用mysqli、mysql或PDO时会出现此问题。 以下是测试代码: $link = mysqli_connect('localhost', 'root', ''); if (!$link) { die('Connection error: ' . mysql_error()); } mysqli_select_db($link, 'coolstat.my') or die ('Can\'t

面对一个问题,我在使用数据库时找不到内存泄漏。该脚本从数据库获取大量数据,因此内存泄漏非常严重。使用mysqli、mysql或PDO时会出现此问题。 以下是测试代码:
$link = mysqli_connect('localhost', 'root', '');
if (!$link) {
    die('Connection error: ' . mysql_error());
}
mysqli_select_db($link, 'coolstat.my') or die ('Can\'t use coolstat.my: ' . mysql_error());


for($ii=0; $ii<20000; $ii+=1000){
    $sql= "SELECT `codes_data`.* FROM `codes_data` INNER JOIN codes ON codes.siteid= 20     AND codes.codeid=codes_data.codeid LIMIT ".$ii.", ".($ii+1000)."";
    ///

    $data= array();
    $result = mysqli_query($link, $sql);
    while (($row = mysqli_fetch_array($result))){
        $data[]= $row;
    }
    mysqli_free_result($result);
    unset($result);
    unset($data);
    echo "Memory get_data usage: ".convert_memory_val(memory_get_peak_usage(true))."<br />\n";
}
mysqli_close($link);


function convert_memory_val($size){
    $unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb');
    return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . ' ' . $unit[$i];
}
当打开时,只要根缓冲区运行满,就会执行如上所述的循环查找算法。根缓冲区的固定大小为10000个可能的根[…]

即使可能的根缓冲区尚未满,也可以强制收集循环。为此,您可以使用该函数。此函数将返回算法收集的循环数

所以。。只要试着在循环体的末尾:

for ($ii = 0; $ii < 20000; $ii += 1000) {
    // ...

    mysqli_free_result($result);
    unset($result);
    unset($data);
    echo "Memory before GC run: ".convert_memory_val(memory_get_peak_usage(true))."<br />\n";

    $n = gc_collect_cycles();
    echo "GC collected $n garbage cycles<br />\n";
    echo "Memory after GC run: ".convert_memory_val(memory_get_peak_usage(true))."<br />\n";
}
($ii=0;$ii<20000;$ii+=1000)的
{
// ...
mysqli_免费_结果($result);
未结算($结果);
未结算(数据);
echo“GC运行前的内存:”.convert_Memory_val(内存获取_peak_usage(true))。“
\n”; $n=gc_collect_cycles(); echo“GC收集的$n个垃圾周期
\n”; echo“GC运行后的内存:”.convert_Memory_val(内存获取_peak_usage(true))。“
\n”; }
您的错误在限制条款中:第二个数字应该是常数,例如1000。根据您所拥有的,查询将是

LIMIT 0, 1000
LIMIT 1000, 2000
LIMIT 2000, 3000
...

这不是分页,而是以越来越多的重叠块来获取数据。因此,内存使用的增加是正确的

不是主题,但您需要用mysqli\u error($link)替换mysql\u error。您无法控制PHP如何进行垃圾收集。你不能用这种方法测量“内存泄漏”!请看:这实际上是一个评论,而不是一个答案。您在这里不是新手,您应该已经知道注释和答案之间的区别。它不是一个生产脚本,只是一个快速复制粘贴,但我可以加快速度,或者手动清理内存吗?@bааФаааааааааа1072。。这就是在长时间运行的脚本中手动释放内存的方式。答案可能会帮助别人学习。谢谢,你救了我一天!
LIMIT 0, 1000
LIMIT 1000, 2000
LIMIT 2000, 3000
...