PHP:如何释放有限范围的变量?

时间:2015-08-08 21:58:05

标签: php memory stack

我收到“致命错误:允许的内存大小为XXXX字节耗尽......”。我需要迭代大量的记录,并执行一个函数来验证记录是否符合声明许多类变量的标准。

foreach ($results as $row)
{
  $location = Location::parseDatabaseRow($row);

  if ($location->contains($lat, $lon))
  {
    $found = true;
    $locations[] = $location;
    break;
  }
}

Location类的实现:

public function contains($lat, $lon)
{ 
  $polygon =& new polygon();
  .... //Add points to polygons base on location polygons
  $vertex =& new vertex($lat, $lon);
  $isContain = $polygon->isInside($vertex); 

  $polygon->res(); //Reset all variable inside polygons
  $polygon = null; //Let Garbage Collector clear it whenever
  return ($isContain);
}

当contains()方法返回时,不应该清除$ polygon吗?我该怎么做才能减少内存使用量?

我是一名Java开发人员,并开始学习PHP。请帮助我了解如何管理堆栈大小和内存分配和分配。提前谢谢。

1 个答案:

答案 0 :(得分:1)

  

我是一名Java开发人员,并开始学习PHP。

以下是一些更正,可能会使您的代码不会耗尽内存限制。

使用一段时间。由于您的结果来自数据库查询,因此您应该可以使用fetch()而不是fetchAll()我假设您正在使用foreach(),因为您在其上应用了while ($row = $result->fetch()) { // here $result is supposed to be a PDOStatatement. $location = Location::parseDatabaseRow($row); if ($location->contains($lat, $lon)) { $found = true; // where is this used? $locations[] = $location; break; } }

public function contains($lat, $lon) {
    $polygon = new polygon();
    $vertex = new vertex($lat, $lon);
    return $polygon->isInside($vertex);
    // no need to reset the values of your polygon, you will be creating a new one on the next loop.
}

虽然使用较少的内存,但并非所有结果都是同时获取的。

以正确的方式使用&符号。你在每个循环中做一个新的。当你想通过引用函数传递一个值时使用&符号,这样它就会在函数范围之外受到影响,而不需要返回它。

在这里,您使用的对象在设计上有点passed by reference

$polygon = new polygon();
while ($row = $result->fetch()) { // here $result is supposed to be a PDOStatatement.
    $location = Location::parseDatabaseRow($row);
    if ($location->contains($lat, $lon, $polygon)) {
        $found = true; // where is this used?
        $locations[] = $location;
        break;
    }
}

public function contains($lat, $lon, $polygon) {
    //Add points to the passed polygon
    $vertex = new vertex($lat, $lon);
    $isContain = $polygon->isInside($vertex);
    $polygon->res(); 
    // since we eill be using the same $polygon, now we need to reset it
    return $isContain;
}

为了完整起见,这里使用相同的多边形对象的版本。注意我是如何使用&符号的,因为我们正在传递一个对象。

app/
   src/
      js/
      less/
      jade/
   dist/
      templates/  <-- here you can put your htmls
      styles/     <-- and here put css
      js/         <-- if you want, you can put this minimalized app.js 
                      that will contain all of your project, 
                      see grunt-contrib-uglify for more info