我在下面有这个PHP代码来生成一组12位唯一随机数(范围从100000到100万)并将其保存在db中。我首先从MySQL数据库中获取现有代码(现在已经有数百万个),翻转数组,生成新代码。后来我在$ random和$ existingRandom上使用array_diff_key和array_keys来获取要保存回db的新代码。
// total labels is the number of new codes to generate
//$totalLabels is fetched as user input and could range from 100000 to a million
$codeObject = new Codes();
//fetch existing codes from db
$codesfromDB = $codeObject->getAllCodes();
$existingRandom = $random = array();
$existingRandom = $random = array_flip($codesfromDB);
$existingCount = count($random); //The codes you already have
do {
$random[mt_rand(100000000000,999999999999)] = 1;
} while ((count($random)-$existingCount) < $totalLabels);
$newCodes = array_diff_key($random,$existingRandom);
$newCodes = array_keys($newCodes);
我面临的问题是array_flip函数内存不足并导致程序崩溃错误
"Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 72 bytes)"
我的问题如下:
1)有人可以帮助我理解为什么array_flip内存不足。 php.ini文件中的内存限制为256M。如果可能的话,请告诉我函数使用的内存计算。 (如果array_flip传递array_diff_key并且array_keys用完了内存)
2)如何优化代码,以便使用的内存不受限制。我甚至试图在较小的块中打破array_flip操作,但即使这样也没有内存。
$size = 5000;
$array_chunk = array_chunk($codesfromDB, $size);
foreach($array_chunk as $values){
$existingRandom[] = $random[] = array_flip($values);
}
3)我正在做的最优化是否公平进一步增加php.ini文件中的内存限制。这样做时要记住的是什么。
以下是我的查询,如果需要,还可以从db中获取现有代码:
$sql = "SELECT codes FROM code";
$stmt = $this->db->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
return $result;