php,substr,'内存不足'

时间:2011-03-11 13:27:32

标签: php substr

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

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

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

当我将数据传递给函数以构建查询以将其放入数据库时​​,我在查询查询时会在substr()函数上出现“内存不足”错误。

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

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

2 个答案:

答案 0 :(得分:2)

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

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

否则,您可以看到

是否出现相同的错误
$q = mb_substr($q, 0, -1);

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

答案 1 :(得分:1)

许多PHP文件函数都使用length参数,这将限制函数读入的文本量。也许您可以将此值设置为比预期输入大小更长但比行长度短的值会给你记忆错误。

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

当然,你可以随时增加记忆力限制。这将是最容易做的事情。

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