我收到“致命错误:允许的内存大小为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。请帮助我了解如何管理堆栈大小和内存分配和分配。提前谢谢。
答案 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