[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

[Laravel] 最大重试次数达到 10000 次但未找到唯一值是什么意思? [骗子]

你好。
我是Mandai,负责Wild 开发团队。

我认为您会经常使用
Faker ,它包含在它很方便,因为它是多语言的,允许您创建各种测试数据,但它还有一个称为 unique 的方法,在创建具有唯一 ID 的多个数据时很有用。

然而,根据你如何使用它,你可能会遇到像标题中的错误,如果你不知道它是什么或无法解决它并且必须尝试另一种方法......那么这是一种浪费已经安装了Faker!所以,这次我想介绍一下如何解决Faker上经常出现的“最大重试次数达到10000次而没有找到唯一值”的错误。

 

错误原因

从错误文本来看,我感觉我在某个地方陷入了无限循环,但大多数时候我没有具体的想法,错误发生在Faker的unique()的使用上,只有你能理解。 。
我没有编写任何会导致无限循环的代码。

如果我在正确的时间重置它,它可以正常工作,但是当然,如​​果我重置它,就会发生重复。
有些事情你需要用勺子的量,直到你使用一段时间后才会知道,但一旦你知道原因,你自然就会知道如何处理它......!

那么让我们来看看 Faker 的 unique() 方法的代码。

 

遵循 unique() 的行为

github的这部分是unique()方法的代码。
由于我们将接收到的变量按原样传递给 UniqueGenerator 类,因此让我们进一步检查 UniqueGenerator 类的代码。

使用魔术方法可以很好地控制该行为,但重点是它只是调用使用 UniqueGenerator::__call() 创建对象时接收到的 Faker\Generator 对象的方法。
由于 while 条件表达式包含重复检查,因此返回值是唯一的。
使用数组键进行重复检查似乎很原始,但原因很容易理解。
抛出OverflowException时的错误信息标题表明这个do while语句的循环次数已经达到了重试次数。

 

如何避免错误

避免该错误的调整项只有一项,那就是改变unique()方法第二个参数的值,增加循环重试次数。
默认是10,000次,但是如果想要的值的数量是15,000,它总是会溢出。

要增加重试次数,请执行以下操作:

$factory->define(User::class, function(Faker\Generator $faker) { return [ 'name' => $faker->name(), 'age' => $faker->unique(false, 15000) ->numberBetween(1, 80), // 将重试次数更改为 15000 次 });

 

另一个原因是 Faker\Generator 对象返回的变体少于 10,000 个。
如上例所示,numberBetween() 只返回 1 到 80 之间的数字,因此无法为第 81 个数据生成唯一值,并且循环将执行超过重试次数。
我的印象是人名等的随机组合有很多变化,但在英语中,男性和女性的名字大约有 3000 个,姓氏有 473 个,所以有很多变化,但在日本人的男性和女性名字只有大约 50 个,姓氏只有 31 个,全名大约有 1,500 个变体。

即使你想要 5,000 个人的日文全名,如果只有 1,500 个组合,使用 unique() 就没有意义,所以你需要考虑另一种方法。
例如,似乎有一种方法可以自己实现并向 Faker\Generator 类添加新的提供者,但我还没有详细研究它,所以我希望有一天能够介绍它。

 

概括

这次,我研究了在使用 Faker 时经常看到的“最大重试次数达到 10000 次而没有找到唯一值”的错误。
这一切都是从我在互联网上搜索错误消息并发现 StackOverFlow 说重置(true)没问题时开始的!一切都始于我看到这样的事情并觉得很奇怪。

我觉得这里面可能存在一些根本性的误解,所以我查了一下,但似乎其中的陷阱不止一个。

当我遇到“最大重试次数达到 10000 次而没有找到唯一值”时,我决定调查重试次数和获得的虚拟数据的数量。

 
就是这样。

如果您觉得这篇文章有帮助,请点赞!
1
加载中...
1 票,平均:1.00 / 11
5,168
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

万代洋一

我的主要工作是为社交游戏开发 Web API,但我也很幸运能够做很多其他工作,包括营销。
此外,我在 Beyond 中的肖像权被视为 CC0。