在php脚本中释放内存
我已经完成了为我正在做的一个项目编写的php脚本。我的下一步是,我想看看我是否可以从内存的角度改进我的代码,因为我的一些脚本占用了大量内存。我一直在做这方面的研究,其中一个建议是对变量进行NULL和unset,但我从未见过这样做的例子。因此,我想给出一个在我的脚本中执行的常见操作的示例,并想知道这是否是正确的方法:在php脚本中释放内存,php,memory-optimization,Php,Memory Optimization,我已经完成了为我正在做的一个项目编写的php脚本。我的下一步是,我想看看我是否可以从内存的角度改进我的代码,因为我的一些脚本占用了大量内存。我一直在做这方面的研究,其中一个建议是对变量进行NULL和unset,但我从未见过这样做的例子。因此,我想给出一个在我的脚本中执行的常见操作的示例,并想知道这是否是正确的方法: $query = $dbconn->get_results("SELECT id,name FROM account WHERE active = 1");
$query = $dbconn->get_results("SELECT id,name FROM account WHERE active = 1");
if(isset($query))
{
foreach($query AS $currq)
{
$account_id = intval($currq->id);
$account_name = trim($currq->name);
//Code to stuff with this data
//NULL the variables before looping again
$account_id = NULL;
$account_name = NULL;
//Unset the variables before looping again
unset($account_id);
unset($account_name);
}
$query = NULL;
unset($query);
$currq = NULL;
unset($currq);
这是释放内存的正确方法吗?我了解到PHP中的垃圾收集可能是懒惰的,所以这就是为什么他们建议将该值设为NULL,因为它会立即收缩该值
我知道这对这个网站来说可能太模糊了,但是如果有人能告诉我这是否是释放内存的正确方法?或者,如果有不同的方法,请您提供一个示例,以便我可以直观地看到它是如何工作的。提前谢谢 请仔细阅读,这正是它们的用途
你不想一次获取所有记录,这会像猎枪一样在你的记忆中炸出洞来
相反,如果您希望一次提取一条记录,请先对其进行处理,然后再提取下一条记录
以下是一个例子:
function getAccountData(\PDO $pdo)
{
$stmt = $pdo->prepare("SELECT id,name FROM account WHERE active = 1");
$stmt->execute();
while ($row = $stmt->fetch()) {
yield $row;
}
}
foreach (getAccountData($pdo) as $account){
//process the record for each iteration
//no need to unset anything
}
如果函数$dbconn->get_results返回一个包含所有数据的数组,那么使用生成器就没有意义了,因为已经为数据分配了内存
您还可以使用mysqli_fetch_assoc函数一次获取一行。它应该比一次获取所有行更节省内存 什么是$dbconn?自定义数据库类?看起来不像mysqli或PDO吗?这应该发布在网站上。你看不到很多例子,几乎所有的例子都是这样pointless@SirNarsh严格来说,它是一个名为ezsqls的dbclass-the
$stmt->execute()
无论如何都可能将整个数据集提取到php进程内存中,而不管您如何提取它。如果单独提取每一行,速度会非常慢。execute()
只会将准备好的查询发送到服务器,而不会将整个结果集提取到内存中只需检查:-)在数据库中生成1亿行,准备,执行并获取一行。我以前曾以这种方式使用generator处理数百万条记录,从未用完memoryWeird,这不是我在postgresql pdo驱动程序中看到的: