【发布时间】:2014-05-29 14:27:48
【问题描述】:
我有一个包含 100,000 个用户个人信息的数组(ID、姓名、电子邮件等)。我需要遍历数组的每一行,并根据行数据将 mysql 记录插入到表中。我的问题是我在大约 70,000 行后内存不足。
我的代码:
if(!empty($users)){
$c = 0;
foreach($users as $user){
$message = // Some code to create custom email
queue_mail_to_send($user->user_email, $subject, $message, $db_options, $mail_options, $mail_queue);
}
}
背景:
我正在构建一个电子邮件系统,它会向我网站的用户发送电子邮件。上面的代码循环遍历用户数组并执行函数 'queue_mail_to_send' 将 mysql 行插入到电子邮件队列表中。 (我正在使用 PEAR 库来错开电子邮件发送)
问题:
我知道我只是在一次执行中尝试做太多事情,从而耗尽了这里的内存。那么有没有人知道更好的方法,而不是试图在一个大循环中执行所有内容?
谢谢
【问题讨论】:
-
当然。在许多较小的循环中执行所有内容,例如每次最多 1000 个用户。
-
如果您在
$user数组/对象中加载用户详细信息,那么为什么不直接在INSERT INTO table_name (COL1, Col2,...) SELECT COL1, COL2 FROM other_table;等一个sql 语句中执行此操作 -
正如@Jon 所建议的那样,在第一个循环中使用较小的循环作为限制 0,1000,然后将 num 1000 存储在临时表中,然后在下一个循环 1000,2000 等等!!
-
我必须创建某种触发系统,一旦处理了前 1000 个脚本,它就会执行一个新的 php 脚本,并向它发送一些标头变量来跟踪它的进度以及何时完成等等。这是最简单/正确的方法吗?
-
我可以看到弹性工作分配在这里很有用。
标签: php mysql memory memory-management