首页 文章

php,substr,'out of memory'

提问于
浏览
1

所以我有一个脚本可以将CSV文件导入到数据库的联系人表中 .

我创建了一个脚本,它将抓取一大块CSV并处理它,更新队列表及其进度,然后使用cron定期运行它,这样它基本上可以处理任何大小的文件 .

无论如何我限制它一次只能运行1000行来阻止它掉下来 . 这非常有效,但是我曾经有人尝试上传比平时更多字段的CSV,这意味着CSV的1行比平时要大得多 .

当我将数据传递给函数以构建查询以将其放入数据库时,我在修剪查询时在substr()函数上遇到“内存不足”错误 .

$q = substr($q, 0, -1);

到目前为止,在脚本中,$ q变得越来越大,这似乎正在杀死它 . 知道如何在不将整个var加载到内存中的情况下切掉最后一个字符吗?除了使批量更小?

2 回答

  • 2

    @Horse:如果你知道角色会是什么,你可以试试

    $q = rtrim($q, ","); // if it is a comma, for instance
    

    否则你可以看到你是否得到了同样的错误

    $q = mb_substr($q, 0, -1);
    

    要么

    $q = substr_replace($q, "", -1)
    
  • 1

    许多PHP文件函数采用 length 参数,这将限制函数读入的文本量 . 也许您可以将此值设置为比预期输入大小更长的值但短于将导致内存错误的行长度 .

    否则,请仔细查看您的代码,并确保在循环中没有构建任何大变量或泄漏内存 . 如果你在那里遇到问题,不用看你的代码是不可能的 . 但是如果你把所有变量放在循环中,你真的不应该因为一行而有内存问题 . 那条线路绝对是巨大的 .

    而且你当然可以增加你的记忆限制 . 那将是最容易的事情 .

    最后,我的经验是内存限制错误报告的行几乎不是真正的罪魁祸首 . 它只是发生错误的行 . 问题通常在代码中较早,并且比其他任何算法更具算法性 . 所以我不会太专注于substr()调用 . 处理整体内存使用情况 .

相关问题