gpt4 book ai didi

php - 在PHP中循环遍历大数据数组

转载 作者:可可西里 更新时间:2023-11-01 06:49:58 25 4
gpt4 key购买 nike

我有一个包含 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 库来错开电子邮件发送)

问题:

我知道我只是试图在一次执行中做太多事情而耗尽这里的内存。那么有没有人知道更好的方法而不是尝试在一个大循环中执行所有内容?

谢谢

最佳答案

我认为减少脚本的有效负载会很麻烦,并且不会给您带来满意的结果。如果您有任何可能这样做,我建议您记录您已经处理了哪些行,并让脚本运行接下来的 x 行。如果可以使用 cronjob,可以暂存邮件,让 cronjob 每 5 分钟向队列中添加邮件,直到处理完所有用户。

最简单的方法是将您处理过的最高用户 ID 存储在某个地方。我不建议您存储用户数量,因为在批处理之间可以添加或删除用户,导致用户收不到电子邮件。但是,如果您按用户 ID 排序(假设您为 ID 使用自动递增的列!),您可以确保每个用户都得到处理。

所以你的用户查询应该是这样的:

SELECT * FROM users WHERE user_id > [highest_processed_user_id] ORDER BY user_id LIMIT 1000

然后处理你的循环,并存储最后一个用户 id:

if(!empty($users)) {
$last_processed_id = null;
foreach($users as $user) {
$message = // Message creation magic
queue_mail_to_send( /** parameters **/ );
$last_processed_id = $user->id;
}

// batch done! store processed user id
$query = 'UPDATE mail_table SET last_processed_user_id = '. $last_processed_id; // please use parameterized statements here
// execute the query
}

在下一次执行时,再次执行直到所有用户都收到邮件。

关于php - 在PHP中循环遍历大数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23080247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com