克服数组函数的PHP内存使用问题

时间:2016-11-05 07:18:43

标签: php arrays memory memory-management

我在下面有这个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;

0 个答案:

没有答案