php mysql循环内存泄漏?

php mysql循环内存泄漏?,php,mysql,loops,out-of-memory,Php,Mysql,Loops,Out Of Memory,我的php脚本停止运行,因为内存不足。 这是我的密码: $files = array_diff(scandir($dir_name), array('..', '.')); if (!empty($files)) { foreach ($files as $file) { if (pathinfo($file, PATHINFO_EXTENSION) == "csv") { $fp = fopen($dir_name.$fi

我的php脚本停止运行,因为内存不足。 这是我的密码:

$files = array_diff(scandir($dir_name), array('..', '.'));
if (!empty($files))
{
    foreach ($files as $file)
    {
        if (pathinfo($file, PATHINFO_EXTENSION) == "csv")
        {
            $fp = fopen($dir_name.$file, 'r');
            while (($line = fgetcsv($fp, 0, $delimiter)) !== FALSE)
                insert_update(array_map('addslashes', $line), $connect_id);
            fclose($fp);
        }
    }
    mysqli_close($connect_id);
}
我在同一个csv上运行了4次脚本(超过600k行)。 用完全相同的脚本,它在不同的时刻停止。。。 停止前完成的请求数:205 286//200 514//192 429//211 164 (每次尝试前我都会截断表)。 我总是使用相同的变量。。。使用的内存如何增加? 这只是一个foreach循环。。。如果它工作一次,它应该工作无限次,对吗

谢谢,

米克尔

PS:这是我的函数“插入\更新”

function insert_update($row, $connect_id)
{
    $table_name = "xxxxxxxx";
    $maxcol = 42;

    $my_request = "INSERT INTO $table_name VALUES ('$row[0]'";
    $i = 1;
    while ($i < $maxcol)
    {
        if (isset($row[$i]))
            $my_request = $my_request.", '$row[$i]'";
        else
            $my_request = $my_request.", ''";
        $i++;
    }
    $my_request = $my_request.")";
    if (mysqli_query($connect_id, $my_request) == FALSE)
    {
        echo "<p>$my_request</p>";
        exit();
    }
}
函数插入更新($row,$connect\u id)
{
$table_name=“xxxxxxxx”;
$maxcol=42;
$my_request=“插入$table_名称值(“$row[0]”);
$i=1;
而($i<$maxcol)
{
如果(isset($row[$i]))
$my_request=$my_request.,“$row[$i]”;
其他的
$my_request=$my_request.“,”;
$i++;
}
$my_request=$my_request.“)”;
if(mysqli_查询($connect_id,$my_request)==FALSE)
{
echo“$my_request

”; 退出(); } }
您的函数不包含静态,不应留下任何内容。您的循环也不会在RAM中保留任何内容。因此,如果您没有在使用过的PHP函数中意外发现任何内存泄漏, 另一个问题可能是垃圾收集器。此服务释放不再使用的内存。此垃圾回收器不会在释放每个变量id后运行,而是在它自己的时间范围内运行

但是,现在可以尝试强制垃圾收集器释放内存。(有些人说它不会影响记忆。不知道)

一些调试还可能帮助您确定泄漏源:

memory_get_peak_usage();
您还可以尝试增加此脚本的内存限制。但是,这不能在公共可用文件上完成,因为它可能会很快占用所有服务器内存

ini_set('memory_limit', '1024M');
另一种选择可能是尝试不同的文件访问和数据库连接方法,具体取决于您可以使用什么

如果所有这些都失败了,那么创建某种类型的迭代。处理10个文件,然后使用偏移量参数重定向到脚本,从上次停止的位置开始。重复此操作,直到处理完所有文件


您很容易受到攻击
addslashes()
完全是无用的垃圾,对保护自己毫无用处。这是一个用铁丝网做的避孕套文件每次都是按同样的顺序寄回来的吗?如果不是,那么这应该解释为什么这两个不同的停止。。。。也可能只是增加可用内存并继续:)ini_set('memory_limit','256M')-MarcB Ok,但是所有CSV文件都是安全的-对于测试,我只使用了一个csv,每次测试后我都会截断表。。还有其他人知道如何在不同时刻停止吗?”“内存限制”设置为“-1”。更重要的是,你知道为什么它会停止吗?@Marc B,谢谢你画出这样的视觉效果,
addslashes()
就像铁丝网避孕套一样。这应该在文档中。@Mickeel_42:没关系。进入查询字符串的外部数据是一个注入漏洞。不管它是否是“安全”文件:您可以轻松地为自己注入。addslashes可能会让你感到温暖和模糊,但除了最明显的注射方法外,它对任何东西都没有用。谢谢你的帮助。事实上,当我检查每次迭代使用的内存时,内存每次都会增加,我找不到原因。在越来越多的行上测量内存,直到找到增加最多的一行。也许你至少可以尝试一下其他的逻辑。是否没有比其他代码增加最多的特定代码行。你所有的代码看起来都应该在每一行之后释放内存,并且永远不会堆积任何东西。所以我认为你使用的一些函数在清理它们之后是不好的。我猜是fget_csv或mysqli_query。可能晚一点。
ini_set('memory_limit', '1024M');